zoukankan      html  css  js  c++  java
  • MyBatis-参数处理

    1、单个参数 mybatis不会做特殊处理。

      #{参数名/任意名}:取出参数值。

    2、多个参数 mybatis会做特殊处理。

      多个参数会被封装成 一个map。

      key:param1...paramN,或者参数的索引也可以。

      value:传入的参数值。

      #{}就是从map中获取指定的key的值;

      多个参数传递的时候要使用命名参数的形式:

    3、命名参数:明确指定封装参数时map的key;@Param("id")

      多个参数会被封装成 一个map,
      key:使用@Param注解指定的值
      value:参数值
      #{指定的key}取出对应的参数值

    4、PoJO

    如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;#{属性名}:取出传入的pojo的属性值。

    5、Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map。

         #{key}:取出map中对应的值

    6、TO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象。

      例如分页:

        Page{
        int index;
        int size;
        }

    7、例子

    public Employee getEmp(@Param("id")Integer id,String lastName);
        取值:id==>#{id/param1}   lastName==>#{param2}
    public Employee getEmp(Integer id,@Param("e")Employee emp);
        取值:id==>#{param1}    lastName===>#{param2.lastName/e.lastName}

      特别注意: 如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。

      key的取值:

          key:Collection(collection)。

             List(list)

             数组(array)

    public Employee getEmpById(List<Integer> ids);
        取值:取出第一个id的值:   #{list[0]}

    8、参数值的获取

      #{}:可以获取map中的值或者pojo对象属性的值;

      ${}:可以获取map中的值或者pojo对象属性的值;

    select * from tbl_employee where id=${id} and last_name=#{lastName}
    Preparing: select * from tbl_employee where id=2 and last_name=?

      区别:

        #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入。

        ${}:取出的值直接拼装在sql语句中;会有安全问题;大多情况下,我们去参数的值都应该去使用#{};

      原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如分表、排序。。。;按照年份分表拆分 

    select * from ${year}_salary where xxx;
    select * from tbl_employee order by ${f_name} ${order}

    9、#{}:更丰富的用法:

      规定参数的一些规则:

      javaType、 jdbcType、 mode(存储过程)、 numericScale、

      resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

      jdbcType通常需要在某种特定的条件下被设置:

        在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);

        JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;

        由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法

        1、#{email,jdbcType=OTHER};

        2、jdbcTypeForNull=NULL

           <setting name="jdbcTypeForNull" value="NULL"/>

      

      

      

     

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/zhaobingqing/p/7093303.html
Copyright © 2011-2022 走看看