05 Mybatis的动态Sql
2020-04-24 本文已影响0人
better_future
Mybatis的动态Sql
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
动态 SQL 之<if> 标签
List<User> findByUser(User user);
<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.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>
注意:<if>
标签的test
属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。
另外要注意 where 1=1
的作用~!
测试:
@Test
public void testFindUser(){
User user = new User();
user.setUsername("%王");
user.setAddress("北京");
List<User> users = userDao.findByUser(user);
System.out.println(users);
}
动态 SQL 之<where> 标签
为了简化上面 where 1=1
的条件拼装,我们可以采用<where>标签来简化开发。
<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.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>
有代码片段拼接的时候不要使用分号;
动态标签之<foreach> 标签
传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
public class QueryIdVo implements Serializable {
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
List<User> findInIds(QueryIdVo vo);
<select id="findInIds" resultType="com.it.pojo.user" parameterType="com.it.vo.QueryIdVo">
select * from user
<where>
<if test="ids !=null and ids.size() > 0">
<foreach open="id in (" close=")" collection="ids" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
先判断pojo中的ids属性是否为空,然后执行sql语句,将ids进行遍历,获得所有id的值再ids中的数据。
SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection
:代表要遍历的集合元素,注意编写时不要写#{}
open
:代表语句的开始部分
close
:代表结束部分
item
:代表遍历集合的每个元素,生成的变量名
sperator
:代表分隔符
@Test
public void testFindInds(){
QueryIdVo queryIdVo = new QueryIdVo();
ArrayList<Integer> ids = new ArrayList<Integer>();
ids.add(41);
ids.add(42);
ids.add(43);
ids.add(46);
ids.add(57);
queryIdVo.setIds(ids);
List<User> users = userDao.findInIds(queryIdVo);
for(User user:users){
System.out.println(user);
}
}
相当于
select * from user where id in (41,42,43,46,57)
Mybatis 中简化编写的 SQL
<!-- 抽取重复的语句代码片段 -->
<sql id="defaultSql">
select * from user
</sql>
引用代码片段
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="user">
<include refid="defaultSql"></include>
</select>