动态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时,最后的结果只会出现一次。