动态SQL之if标签
持久层Dao接口:
List<User> findUserByCondition(User user);
持久层Dao映射配置:
<select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
select * from user where 1=1
<if test="username!=null and username != ''">
and username like #{username}
</if>
<if test="sex != null">
and sex like #{sex}
</if>
</select>
测试:
@Test
public void testFindByUser() {
User u = new User();
u.setUsername("老王");
u.setSex("男");
List<User> users = userDao.findUserByCondition(u);
for (User user:users){
System.out.println(user);
}
}
控制台输出结果:
动态SQL之where标签
为了简化上面where 1=1的条件拼装,我们可以采用标签来简化开发。
持久层Dao映射配置:
<select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
select * from user
<where>
<if test="username!=null and username != ''">
and username like #{username}
</if>
<if test="sex != null">
and sex like #{sex}
</if>
</where>
</select>
控制台输出结果:
动态标签之foreach标签
<foreach>
标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
QueryVo类:
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> findUserInIds(QueryVo vo);
持久层Dao映射配置:
<select id="findUserInIds" resultMap="userMap" parameterType="com.review.domain.QueryVo">
select * from user
<!-- <include refid="defaultUser"></include>-->
<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>
测试类:
@Test
public void testFindInIds(){
QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(46);
vo.setIds(list);
//5.执行查询所有方法
List<User> users = userDao.findUserInIds(vo);
for(User user : users){
System.out.println(user);
}
}
控制台输出结果:
Mybatis中简化编写的SQL片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
<sql id="defaultUser">
select * from user
</sql>
引用代码片段:
<select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
<!-- 简化重复的sql语句-->
<include refid="defaultUser"></include>
<where>
<if test="username!=null and username != ''">
and username like #{username}
</if>
<if test="sex != null">
and sex like #{sex}
</if>
</where>
</select>