动态 SQL 之 <if> 标签
根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,
如果 username 不为空时还要加入用户名作为条件。
持久层 Dao 接口
List<User> findByCondition(User user);
持久层 Dao 映射配置
<select id="findByCondition" parameterType="com.fgy.domain.User" resultType="com.fgy.domain.User">
select * from user where 1=1
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
测试:
@Test
public void testFindByCondition() {
User user = new User();
user.setUsername("");
user.setSex("男");
List<User> users = userDao.findByCondition(user);
// List<User> users = userDao.findByCondition(null);
System.out.println(users);
}
动态 SQL 之 <where> 标签:为了简化上面 where 1=1 的条件拼装,可以采用<where>标签
持久层 Dao 映射配置
<select id="findByCondition" parameterType="com.fgy.domain.User" resultType="com.fgy.domain.User">
select * from user
<where>
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
动态标签之 <foreach> 标签
持久层 Dao 接口
List<User> findUserInIds(QueryVo vo);
持久层 Dao 映射配置
<select id="findUserInIds" parameterType="com.fgy.domain.QueryVo" resultType="com.fgy.domain.User">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
测试:
@Test
public void testFindUserInIds() {
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.findUserInIds(vo);
System.out.println(users);
}
mybatis 中简化编写的 SQL 片段:Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
定义代码片段:
<!-- 抽取重复的语句代码片段 -->
<sql id="defaultSql">
select * from user
</sql>
引用代码片段:
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="user">
<include refid="defaultSql"></include>
</select>
<!-- 根据 id 查询 -->
<select id="findById" resultType="UsEr" parameterType="int">
<include refid="defaultSql"></include>
where id = #{uid}
</select>