JAVA框架 Mybaits 动态sql

动态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>

 

posted @ 2018-04-25 18:07  evil_liu  阅读(448)  评论(0编辑  收藏  举报