动态SQL——<if>标签
- 根据实体类的不同取值,使用不同的SQL语句进行查询,比如在id不为空时进行id查询等操作。
-
- 首先在持久层DAO接口进行定义
/**
* 根据用户信息,查询用户列表
* @param user
* @return
*/
List<User> findByUser(User user);
-
- 其次在持久层DAO映射进行配置工作
<!-- 查询对象的属性值不定,可能只有用户名,或者性别或其他-->
<select id="findByUser" parameterType="com.mybatis.User" resultType="com.mybatis.User">
select * from user where 1=1
<if test="username != null">
and username=#{username}
</if>
</select>
-
- 测试用例
@Test
public void testfindByUser(){
User u=new User();
u.setUsername("L");
List<User> users = userDao.findByUser(u);
for(User user : users) {
System.out.println(user);
}
}
- 对于在持久层DAO的映射配置中使用where 1=1或where 1=0的原因,主要是因为,在实际的应用过程当中会出现很多情况,比如已经在上面写了where语句,但是之后的条件没有一个满足,导致语句出现了单个的where,造成不必要的SQL语句错误,因此会使用where 1=1或1=0这种恒true或false的错误,这就是一种在不确定因素的查询状态下,能够保证构造一条正确的SQL语句的方式。
动态SQL——<where>标签
- 之前在if标签中已经介绍了相关的为什么要使用where 1=1这种语句。今天where标签就是为了解决这个问题而存在的。
<!-- 查询对象的属性值不定,可能只有用户名,或者性别或其他-->
<select id="findByUser" parameterType="com.mybatis.User" resultType="com.mybatis.User">
select * from user
<where>
<if test="username != null">
and username=#{username}
</if>
</where>
</select>
动态SQL——<foreach>标签
- 在进行范围查询的时候,就可以将一个集合中的值作为参数动态添加进来。并进行参数的传递。
-
- 首先在QueryVo实体类中进行定义List<Interger>对象
public class QueryVo {
private User user;
private List<Integer> IDS;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Integer> getIDS() {
return IDS;
}
public void setIDS(List<Integer> IDS) {
this.IDS = IDS;
}
}
-
- 其次在持久层DAO中进行设置等工作
List<User> findByIDS(QueryVo vo);
-
- 然后在相应的xml配置文件当中进行配置等工作
<!-- 按照一定的数据进行查询 使用foreach语句进行查询 -->
<select id="findByIDS" parameterType="com.mybatis.QueryVo" resultType="com.mybatis.User">
select * from user
<where>
<if test="IDS != null and IDS.size()>0">
<foreach collection="IDS" open="id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
-
- 测试代码
@Test
public void testfindByIDS(){
QueryVo vo=new QueryVo();
List<Integer> IDS=new ArrayList<Integer>();
IDS.add(50);
IDS.add(51);
IDS.add(52);
IDS.add(50);
IDS.add(44);
vo.setIDS(IDS);
List<User> users = userDao.findByIDS(vo);
for(User user : users) {
System.out.println(user);
}
}
- 通过测试发现以下几个点
-
- 不管List中的数据是否顺序,最后查询出来的结果都是按从小到大的顺序显示
- 当重复出现数字,例如重复出现50时,最后的结果只会出现一次。
本文介绍MyBatis框架中动态SQL的实现方法,包括<if>、<where>和<foreach>标签的使用技巧,演示如何根据实体类不同属性动态构建SQL查询语句。
动态SQL&spm=1001.2101.3001.5002&articleId=110675149&d=1&t=3&u=4a46b11bef874db2a22ea5f4bbca8fd0)
514

被折叠的 条评论
为什么被折叠?



