zoukankan      html  css  js  c++  java
  • Mybatis参数传递及返回类型

    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
       

  • 相关阅读:
    linux内核中GNU C和标准C的区别
    linux内核中GNU C和标准C的区别
    Getting start with dbus in systemd (02)
    Getting start with dbus in systemd (01)
    Getting start with dbus in systemd (03)
    物理内存相关的三个数据结构
    数据类型对应字节数(32位,64位 int 占字节数)
    Linux kernel 内存
    共模电感的原理以及使用情况
    [原创]DC-DC输出端加电压会烧毁
  • 原文地址:https://www.cnblogs.com/staticking/p/7001091.html
Copyright © 2011-2022 走看看