MyBatis笔记(二)
动态SQL语句
1.<if>标签
<if>标签用来有条件地执行标签内的SQL语句,例如当username不为空时将用户名作为匹配条件。
UserDao.java
/**
* 根据QueryVo中的条件查询用户
* @param vo
* @return
*/
List<User> findByVo(QueryVo vo);
UserDao.xml
<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>
MyBatisTests.java
@Test
public void testFindByUser() {
User user = new User();
user.setUsername("%g%");
user.setAddress("%黄%");
List<User> users = userDao.findByUser(user);
for (User u : users) {
System.out.println(u);
}
}
2.<where>标签
为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。
UserDao.xml
<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>
3.<foreach>标签
当需要用多个id查询用户时,SQL是这样的:select * from user where id in (1, 2, 3);
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
在QueryVo.java中加入一个List集合用于封装参数
private List<Integer> ids;
UserDao.java
/**
* 根据id集合查询用户列表
* @param vo
* @return
*/
List<User> findInIds(QueryVo vo);
UserDao.xml
<select id="findInIds" resultType="User" parameterType="QueryVo">
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>
MyBatisTests.java
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
vo.setIds(ids);
List<User> users = userDao.findInIds(vo);
for (User user : users) {
System.out.println(user);
}
}
<foreach>标签用于遍历集合,它的属性:
- collection: 代表要遍历的集合元素,注意编写时不要写#{}
- open: 代表SQL的开始部分
- close: 代表SQL的结束部分
- item: 代表遍历集合的每个元素,生成的变量名
- sperator: 代表分隔符
4.<sql>标签和<include>标签
Mapper中可将重复的SQL提取出来,使用<include>引用即可,最终达到SQL重复使用的目的。
UserDao.xml
<sql id="defaultSql">
select * from user
</sql>
<select id="findById" resultType="User" parameterType="int">
<include refid="defaultSql"></include>
<where>
<if test="username != null and username != '' ">
and username like #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
</select>

浙公网安备 33010602011771号