一、概述
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
二、<if>
我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
<mapper namespace="xyz.nchu200462.mapper.UserMapper">
<select id="findByCondition" parameterType="user" resultType="user">
select * from user
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
</mapper>
测试
@Test
public void testUserIf() throws IOException {
User user = new User();
user.setId(2);
user.setUsername("capkin");
user.setPassword("123456");
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper sqlSessionMapper = sqlSession.getMapper(UserMapper.class);
List<User> byCondition = sqlSessionMapper.findByCondition(user);
for (User user1 : byCondition) {
System.out.println(user1.toString());
}
}
执行结果
若if成立则将if里面的放入sql语句,若不成立则不放入
三、<foreach>
<select id="findByIds" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
测试
@Test
public void testForEach() throws IOException {
List list = new LinkedList();
for (int i = 0; i < 12; i++) {
list.add(i);
}
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List byIds = userMapper.findByIds(list);
for (Object byId : byIds) {
System.out.println(byId);
}
}
标签含义详解
foreach标签的属性含义如下:
<foreach>标签用于遍历集合,它的属性:
- collection:代表要遍历的集合元素,注意编写时不要写#{}
- open:代表语句的开始部分
- close:代表结束部分
- item:代表遍历集合的每个元素,生成的变量名
- sperator:代表分隔符
四、Sql片段抽取
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
<sql id="selectUser">select * from user</sql>
//通过<sql></sql>标签实现,通过id标出
<select id="findByIds" parameterType="list" resultType="user">
//通过<include></include>引入
<include refid="selectUser"></include>
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>