欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis之动态SQL

程序员文章站 2022-07-12 22:38:41
...

动态元素

mybatis之动态SQL

 

1、if的用法

    <if test="userId != null and userId !=''"> AND a.id = #{userId }</if>

2、choose、when、otherwise元素,相当于Java的 if else操作 

    <choose>
         <when></when>
         <otherwise></otherwise>
    </choose>

如:

mybatis之动态SQL

 

注:<where> </where>中含有<if> </if>会自动去掉第一个if中的and

mybatis之动态SQL

3、foreach元素:遍历集合,支持数组和List、Set接口的集合。 

   collection 配置的sexList是传递进来的参数名称,它可以是一个数组或者List、Set等集合。
   item  配置的是循环中当前的元素
   index 配置的是当前元素在集合的位置下标
   open和close配置的是以什么符号将这些集合元素包装起来。
   separator是各个元素的间隔符

 

   A、字符串的形式传到映射器,如:itForm.buildDeptIds = "1,2,3,4,5"

 <if test="itForm.buildDeptIds != null and itForm.buildDeptIds != ''">
   AND c.build_dept_id IN
   <foreach collection="itForm.buildDeptIds.split(',')" item="item" separator="," open="(" close=")">
      #{item}
    </foreach>
  </if>

  B、数组的形式传到映射器,如:String[] itForm.buildDeptIds = {1,2,3,4}

 <if test="itForm.buildDeptIds != null and itForm.buildDeptIds.length > 0">
      AND c.build_dept_id IN
      <foreach collection="itForm.buildDeptIds" item="item" separator="," open="(" close=")">
         #{item}
      </foreach>
 </if>

C、List数组传到映射器,如 List itForm.buildDeptIds = null;

 <if test="itForm.buildDeptIds != null and itForm.buildDeptIds.size() > 0">
    AND c.build_dept_id IN
    <foreach collection="itForm.buildDeptIds" item="item" separator="," open="(" close=")">
       #{item}
    </foreach>
</if>

  D、Set传到映射器:如下

Set参数:

Set<Integer> set = new HashSet<>();

   set.add(2);

   set.add(3);

mapper方式:

<foreach collection="collection" open="(" separator="," close=")" item="val">#{val}</foreach>

源码原因:

private Object wrapCollection(Object object) {
    DefaultSqlSession.StrictMap map;
   if (object instanceof Collection) {
      map = new DefaultSqlSession.StrictMap();
      map.put("collection", object);
      if (object instanceof List) {
        map.put("list", object);
      }
    return map;
   } else if (object != null && object.getClass().isArray()) {
     map = new DefaultSqlSession.StrictMap();
     map.put("array", object);
     return map;
   } else {
     return object;
   }
}

4、模糊查找方式

A、直接使用 % 拼接字符串

注意:此处不能写成 "%#{name}%" ,#{name}就成了字符串的一部分,会发生这样一个异常: The error occurred while setting parameters,应该写成:

"%"#{name}"%",即#{name}是一个整体,前后加上% <if test="name != null"> name like "%"#{name}"%" </if>

B、使用concat(str1,str2,str3)函数将两个参数连接 <if test="phone != null"> and phone like concat("%",#{phone},"%") </if>

C、使用 bind 标签,对字符串进行绑定,然后对绑定后的字符串使用 like 关键字进行模糊查询

<if test="email != null"> <bind name="pattern" value="'%'+email+'%'"/> and email like #{pattern} </if>

 5、$ 和 # 区别

1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 “4,44,514”就会变成“ '4,44,514' ”;

2、是字符串替换,在处理{ }是字符串替换, MyBatis在处理{ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。

注意:使用${ }会导致sql注入,不利于系统的安全性

SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等

 

<<深入浅出MyBatis技术原理与实战>>学习笔记