发表于: 2020-02-24 17:17:34
1 1165
今天完成的事情:
在执行查询操作时查询条件可能比较复杂,比如查询条件包括:username、sex、address。此时需要在sql语句中加上这三个查询条件。但是这三个条件来自用户输入,可能会缺少某些条件,可能只输入了一个,也可能输入了三个,此时使用动态SQL语句就可以解决这个问题,动态SQL语句会根据条件拼接sql语句。
if标签
if标签主要是判断某个条件是否存在,如下的示例中表示根据username和address查询用户,示例中使用别名:
<select id="findByUser" resultType="user" parameterType="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>
详解:
test属性:判断条件,其值为参数对象的属性名,如果参数是包装类的对象要使用OGNL表达式的写法,例如user.username。
1=1的作用:防止出现类似where and id=1或者只有where而其后没有条件的情况发生。
在持久层接口(UserDao)中添加findByUser方法,如下:
/**
* 根据用户信息,查询用户
* @param user
* @return
*/
List<User> findByUser(User user);
在测试类中添加如下测试方法,运行该测试方法即可看效果:
/**
* 测试根据用户信息,查询用户
*/
@Test
public void testFindByUser() {
User u = new User();
u.setUsername("%王%");
List<User> users = userDao.findByUser(u);
for (User user:users){
System.out.println(user);
}
}
where标签
在if标签中,我们使用了1=1这个条件来避免因为一些特殊情况而引发的错误,但是这个条件并没有意义,对此我们可以使用where标签,只需将上述映射文件中的内容做如下修改即可:
<select id="findByUser" resultType="user" parameterType="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>
choose, when, otherwise标签
有时我们不想使用所有的条件语句,而只想从中选择一个。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
修改上面的例子如下,提供了username就按username查找,提供了address就按address查找,若两者都没有提供,就按照otherwise标签中的条件查找,运行测试方法就能看想要的结果啦:
<select id="selectChoose" resultType="student">
select * from user
<where>
<choose>
<when test="username!=null and username!=''">
username like #{username}
</when>
<when test="address!=null and address!=''">
address=#{address}
</when>
<otherwise>
sex='男'
</otherwise>
</choose>
</where>
</select>
foreach标签
如果我们想查询id在某个集合或数组中存在的用户该如何使用动态SQL语句实现呢?答案是使用foreach标签遍历改集合或数组,构造出我们想要的SQL语句,例如:
<select id="findUserInIds" resultType="user">
select * from user
<where>
<if test="list!=null and list.size>0">
<foreach collection="list" open="id in(" close=")" separator="," item="id">
#{id}
</foreach>
</if>
</where>
</select>
在持久层接口(UserDao)中添加如下方法:
/**
* 根据提供的id集合查询用户信息
* @return
*/
List<User> findUserInIds(List list);
在测试类中添加如下测试方法,运行该测试方法即可看效果:
/**
* 测试根据提供的id集合查询用户信息
*/
@Test
public void testFindUserInIds() {
List<Integer> list = new ArrayList<>();
list.add(42);
list.add(43);
list.add(44);
list.add(45);
List<User> users = userDao.findUserInIds(list);
for (User user:users){
System.out.println(user);
}
}
1
foreach标签各属性详解:
collection:要遍历的集合或数组,集合使用list.size获取长度,数组使用array.length获取长度。
open:添加在遍历结果句首的字符串。
close:添加在遍历结果句尾的字符串。
separator:遍历各项之间的分隔符。
item:遍历各项的名字。
注意: 当遍历的是数组时,无论参数名是什么,在动态sql中都必须且只能使用array这个名称。
sql标签
sql标签可以用来定义一个可被重复使用的sql片段,在使用的时候使用include标签就可以将sql标签中的内容引入。
评论