mybatis参数传递:

单个参数:不做特殊处理
        #{参数名}:取出参数值
    多个参数:做特殊处理
        多个参数会被封装成一个map
            key:param1   ...   paramN
            value:传入的参数值
        #{}就是从map中获取指定的key值
        
        操作:
            方法:public Employee getEmployeeByNmaeAndPass(String name,String pass);
            取值:#{name},#{pass}

命名参数:明确指定封装参数时map的key:@Param("id")
        多个参数会被封装成一个map
            key:使用@Param注解指定的值
            value:参数值
            #{指定的key}取出对应的参数值

POJO:

如果多个参数是业务模型中的数据,可以直接使用POJO:
            #{属性名}:取出传入的POJO 的属性值

Map:

如果多个参数不是业务模型中的数据,没有对应的POJO,为了方便,可以传入map
            #{key}:取出map中对应的值

TO:
    如果多个参数不是业务模型中的数据,但是经常要是用,推荐来编写一个TO(Transfer Object)数据传输对象
    Page{
        int index;
        int size;
    }

示例:

1、public Employee getEmployee(@Param("name")String name,String pass);
    取值:name=====>#{name/param1}   pass=====>#{param2}

2、public Employee getEmployee(String name,@Param("emp")Employee employee);
    取值:name====>#{param1}      pass=====>#{emp.pass/param2.pass}

3、如果是Collection(List   Set)类型或者是数组型,也会特殊处理,
    也是把传入的list或者数组封装在map中
        key:Collection(collection),如果是List还可以使用这个key(list)
             数组(array)
    public Employee getEmpById(List<Integer> ids);
    取值:取出第一个id的值:#{list[0]}

mybatis处理参数:
总结:参数多时会封装map,未了不混乱,可以使用@Param来指定封装时使用的key;
#{key}就可以取出map中的值

(@Param("id")Integer id,@Param("name")String name);
ParamNameResolver解析参数封装的map:
    names:{0=id,1=name}
    1、获取每个标了param注解的参数的@Param的值:id,name:赋值给name
    2、每次解析一个参数给map中保存信息:(key:参数索引,value:name的值)
        name的值:
            标注了param注解:注解值
            没有标注:
            1、全局配置:userActualParam(jdk1.8):name=参数名
            2、name=map.size();相当于当前元素索引

mybatis参数值的获取
#{}:可以获取map中的值或者pojo对象属性的值
${}: 可以获取map中的值或者pojo对象属性的值
区别:
    #{}:是以预编译的形式,将参数设置到sql语句中:PreparedStatement;防止sql注入
    ${}:取出的值,直接拼接在sql语句中,会由安全问题;
    大多情况下,都会使用#{}
    当存在分表、排序:按照年份分表拆分
        原生jdbc不支持占位符的地方就可以使用${}进行取值
        select * from  ${year}_salary where xxxx;
        select * from tb_student order by ${name}
        
#{}:
    可以规定参数的一些规则:
    JavaType、jdbcType、mode(存储过程)、numeriScale、resultMap、typeHandler、jdbcTypeName

jdbcType通常需要在某种特定的条件下呗被设置:
        在数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。
        比如:Oracle(报错)
        insert into student(id,name,age) values(null,'test',null)
        oracle不能识别对null的操作,报错。因为mybatis对所有的null都映射的是原生jdbc的other类型。
        但是MySQL可以识别对null的操作,若想解决此问题,则使用以下添加语句;
        
        1、insert into student(id,name,age) values(#{id},#{name},#{age,jdbcType=NULL})
    
        2、由于全局配置中,jdbcTypeForNull=OTHER:oracle不支持
            <setting name="jdbcTypeForNull" value="NULL">
            此配置对使用MySQL数据库时的影响。

返回参数类型:
List型:
    resultType:返回的是一个集合,要写集合中元素的类型

Map型:
    resultType=“map”:返回一条记录
    key:就是列名    value:对应的值
    mybatis对用到的部分类进行了封装,可直接使用封装类型。

返回多条记录封装一个map:
    1、resultType:要写集合中元素的类型。
        Map<Integer,Employee>:
                键是这条记录的主键,值是记录封装后的JavaBean
    2、在对应的方法上添加@MapKey("id") 告诉mybatis封装这个map的时候使用哪个属性作为map的key

Mybatis参数传递及返回类型的更多相关文章

  1. 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法

    使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,会报异常. 例如: <select id="getPersonRecordId" parameterTy ...

  2. mybatis中查询结果为空时不同返回类型对应返回值

    今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同 ...

  3. mybatis默认返回类型

    在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认的先将查询回的值放入一个hashMap中(如果返回的值不止一条就是一个包含hashMap的list).这其中的区别在于,如果你指 ...

  4. C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数

    我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...

  5. mybatis 调用存储过程 返回游标 实例

    存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...

  6. MyBatis返回主键,MyBatis Insert操作返回主键

    MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...

  7. Mybatis批量insert 返回主键值和foreach标签详解

    Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...

  8. 函数----基础,参数传递,返回类型和return语句

    一.函数基础1.形参和实参 实参是形参的初始值.第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推.尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序.编译器能以任意可行的顺序对实 ...

  9. mybatis+sqlserver中返回非自增主键

    首先把实体类贴出来(这里只贴出属性,其它的就是getter和setter方法): public class Around {     private String xccd;  //对应主键      ...

随机推荐

  1. 开发读取.properties 配置文件工具类PropertiesUtil

    import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.juni ...

  2. java中三大集合框架

    一.List集合 1.List实现的超级父类接口:Collection 存储一组不唯一(允许重复),有序的对象. 2.了解ArrayList类 A):定义的格式:ArrayList<具体类型&g ...

  3. 简谈DFS

    所谓DFS就是“不撞南墙不回头”的一种搜索.其时间复杂度为O(V+E). 能算出从起点到终点的全部路径,在算法执行的过程中需要一个visit[vi]数组来维护每个结点的访问情况,这样就能避免重复访问. ...

  4. 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入

    MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级 ...

  5. gtk.Builder.AddFromFile SIGSEGV.

    可能是由于GTK没有初始化的缘故,在程序开头加上gtk.Init(nil)进行初始化 或者参考我这篇博客就不会出错了

  6. Mybatis-03-日志

    日志 1 日志工厂 如果一个数据库操作,出现了异常,需要排错,此时需要日志. 曾经:sout debug 现在:日志工厂 logImpl SLF4J/log4j(掌握)/log4j2 设置中可以设定日 ...

  7. C++ STL sort 函数的用法

    sort 在 STL 库中是排序函数,有时冒泡.选择等 $\mathcal O(n^2)$ 算法会超时时,我们可以使用 STL 中的快速排序函数 $\mathcal O(n \ log \ n)$ 完 ...

  8. 总结关于Ubuntu 安装 Docker 配置相关问题及解决方法

    总结关于Ubuntu 安装 Docker 配置相关问题及解决方法 Tomcat 示例 软件镜像(xx安装程序)----运行镜像----产生一个容器(正在运行的软件,运行的xx): 步骤: 1.搜索镜像 ...

  9. echarts 导出为word文档

    https://www.jianshu.com/p/5bd47ab59bbe 主要思路:前台echarts生成图片后,获取base64码,传给后台解析,然后写入freemarker模板,进行下载. 图 ...

  10. centos AAVMF_CODE.fd 文件下载

    centos: yum install AAVMF -y ubuntu: apt-get install qemu-efi*