动态sql
一:if标签使用:
我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接。
Mapper配置文件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="jd.com.vodemo.voMapper" > 6 <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo"> 7 SELECT * FROM t_account WHERE 1=1 AND 8 <if test="ac.name!=null and ac.name!=''"> 9 NAME LIKE '%${ac.name}%' 10 </if> 11 <if test="ac.id!=null and ac.id!=''"> 12 AND id >#{ac.id} 13 </if> 14 </select> 15 </mapper>
注意:我们需要使用SELECT * FROM t_account WHERE 1=1 AND 条件1 AND 条件2.。。。。。这种使用。
其中if标签中的test表达式是测试条件和字段是否为空或者nul,注意这里也是属性.属性。
实际的输出语句:
2018-04-25 18:40:14,733 DEBUG [main] voMapper.findAccByIdAndName.debug:139 | ==> Preparing: SELECT * FROM t_account WHERE 1=1 AND NAME LIKE '%ok%' AND id >?
二、where标签:可以帮我们补全where关键字也不需要1=1的条件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="jd.com.vodemo.voMapper" > 6 <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo"> 7 SELECT * FROM t_account 8 <where> 9 <if test="ac.name!=null and ac.name!=''"> 10 NAME LIKE '%${ac.name}%' 11 </if> 12 <if test="ac.id!=null and ac.id!=''"> 13 And id >#{ac.id} 14 </if> 15 </where> 16 17 </select> 18 </mapper>
sql语句:
如果别的查询语句也需要这些条件 我们可以进行重用。
在<mapper>标签下面 使用sql标签。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="jd.com.vodemo.voMapper" > 6 <sql id="useMangCon" > 7 <where> 8 <if test="ac.name!=null and ac.name!=''"> 9 NAME LIKE '%${ac.name}%' 10 </if> 11 <if test="ac.id!=null and ac.id!=''"> 12 And id >#{ac.id} 13 </if> 14 </where> 15 </sql> 16 <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" > 17 18 SELECT * FROM t_account 19 <include refid="useMangCon" /> 20 21 </select> 22 </mapper>
其种id是唯一是别人调用的时候标识。
相应的引用使用的标签是include标签。
1 <include refid="useMangCon" />
这样这部分的条件可以进行复用。
三、foreach的标签
当前端传来一些列的id,为列表的时候,我们可以使用id进行查询。这时候sql使用的是in而 不是or or的效率很低。
1 <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," > 2 #{xx} 3 </foreach>
首先了解下foreach的里的属性意思:
1、collection:集合,就是传入的变量的集合的名称。这个需要跟你传入的对象内的属性字段相对应!
2、item:循环的元素,将元素放入这个item中(是将ids的元素放在item里面不是一个而是整个集合)。
3、open:循环开始的拼接符。
4、colse:循环结束的拼接符。
5、separator:就是sql语句中集合内的元素之间的分隔符。
6、#{xx}:取出item的集合。这个名字要和item的名字一样。因为是同一个变量的名称。
完整的例子:
1 <select id="findAccByIdList" parameterType="jd.com.vodemo.vodemo" resultType="jd.com.mybaitstest.account" > 2 SELECT * FROM t_account 3 <!--<where>--> 4 <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," > 5 #{xx} 6 </foreach> 7 <!--</where>--> 8 9 10 </select>
其中的where标签可以有也可以没有,只是在foreach中的open拼接的时候需要注意带不带where就可以。
其中parameterType不能写:List<Integer> 会报:columnNumber: 53; 与元素类型 "select" 相关联的 "parameterType" 属性值不能包含 '<' 字符 所以传入对象。
vo类:
1 package jd.com.vodemo; 2 import jd.com.mybaitstest.account; 3 4 import java.util.List; 5 6 public class vodemo { 7 private List<Integer> ids; 8 9 private account ac; 10 11 public void setAc(account ac) { 12 this.ac = ac; 13 } 14 15 public account getAc() { 16 return ac; 17 } 18 19 public void setIds(List<Integer> ids) { 20 this.ids = ids; 21 } 22 23 public List<Integer> getIds() { 24 return ids; 25 } 26 }
接口:
1 package jd.com.vodemo; 2 import jd.com.mybaitstest.account; 3 import java.util.List; 4 5 public interface voMapper { 6 7 List<account> findAccByIdAndName(vodemo vo); 8 List<account> findAccByIdList(vodemo vo); 9 }
mapper类:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="jd.com.vodemo.voMapper" > 6 <sql id="useMangCon" > 7 <where> 8 <if test="ac.name!=null and ac.name!=''"> 9 NAME LIKE '%${ac.name}%' 10 </if> 11 <if test="ac.id!=null and ac.id!=''"> 12 And id >#{ac.id} 13 </if> 14 </where> 15 </sql> 16 <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" > 17 18 SELECT * FROM t_account 19 <include refid="useMangCon" /> 20 21 </select> 22 <select id="findAccByIdList" parameterType="List<Integer>" resultType="jd.com.mybaitstest.account" > 23 SELECT * FROM t_account 24 <!--<where>--> 25 <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," > 26 #{xx} 27 </foreach> 28 <!--</where>--> 29 30 31 </select> 32 </mapper>