MyBatis映射文件的动态SQL

我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

If标签

  • 根据条件查询,比如可以根据姓名查询,可以根据ID查询,也可以结合两个一起查询
  1. 持久层Dao接口
1
List<User> findByCondition(User user);
  1. 持久层 Dao 映射配置

    注意:if标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。比如包装类VoUser类中有一个属性user,如果参数是VoUser的话,就要使用user.username表达式。

    关于大小写的问题:如果SQL语句上的内容就不区分大小写,比如select * from user where 1 = 1 、 and username like、and address like 但是涉及到Java中的类的属性就要严格区分大小大写,比如下面的test属性里面的内容:username和address,还有#{username},#{address} 要严格对应User类中的属性如:getUsername对应username

1
2
3
4
5
6
7
8
9
<select id="findByCondition" parameterType="user" resultType="user">
select * from user where 1 = 1
<if test="username!=null and username!=''">
and username like #{username}
</if>
<if test="address!=null">
and address like #{address}
</if>
</select>

3.测试

1
2
3
4
5
6
7
8
9
10
11
/*测试findByCondition*/
@Test
public void test7(){
User user = new User();
//user.setUsername("韩晓璇");
user.setAddress("陕西西安");
List<User> userList = mapper.findByCondition(user);
for (User u : userList) {
System.out.println(u);
}
}

where标签

  • 在多条件查询时,不需要使用where 1 = 1
1
2
3
4
5
6
7
8
9
10
11
<select id="findByCondition" parameterType="user" resultType="user">
select * from user
<where>
<if test="username!=null and username!=''">
and username like #{username}
</if>
<if test="address!=null">
and address like #{address}
</if>
</where>
</select>

foreach标签

  • SQL 语句:select 字段 from user where id in (?)

  • foreach标签用于遍历集合,它的属性:

    ​ collection:代表要遍历的集合元素,注意编写时不要写 #{}

    ​ open:代表语句的开始部分

    ​ close:代表结束部分

    ​ item:代表遍历集合的每个元素,生成的变量名

    ​ sperator:代表分隔符

  • 需求:根据ID集合查询

    持久层Dao接口

1
List<User> findByIds(queryVo vo);

持久层 Dao 映射配置

1
2
3
4
5
6
7
8
9
10
<select id="findByIds" parameterType="queryVo" resultType="user">
select * from user
<where>
<if test="ids!=null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>

测试

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test8(){
queryVo Vo = new queryVo();
List<Integer> ids = new ArrayList<>();
ids.add(41);
ids.add(42);
Vo.setIds(ids);
List<User> userList = mapper.findByIds(Vo);
for (User u : userList) {
System.out.println(u);
}
}

抽取重复的SQL语句

1
2
3
4
5
<sql id="defaultSql"> select * from user </sql>
<!--配置查询所有,id是UserDao的方法名-->
<select id="findAll" resultType="cn.hxx.domain.User">
<include refid="defaultSql"></include>
</select>