Mybatis入门笔记(6)——动态SQL
(会用)
if标签
<if>
标签的 test 属性中写的是对象的属性名,
映射配置文件
<!-- 根据用户名和性别查询 -->
<select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.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 != ''">
and sex = #{sex}
</if>
</select>
持久层接口
//根据用户名和性别查询
List<User> findUserByUserNameAndSex(User user);
测试文件
//根据用户名和性别查询
@Test
public void testFindUserByUserNameAndSex(){
User user = new User();
user.setUsername("王");
List<User> users = userdao.findUserByUserNameAndSex(user);
for(User u : users) {
System.out.println(u);
}
}
where标签
为了简化上面 where 1=1 的条件拼装,我们可以采用<where>
标签来简化开发。
作用
- 自动向sql语句中添加where关键字
- 去掉第一个条件的and关键字
映射配置文件
<select id="findUserByUserNameAndSex" parameterType="com.ben.domain.User" resultType="com.ben.domain.User">
select * from user
<where>
<if test="username != null and username != ''">
and username like '%${username}%'
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
</where>
</select>
SQL语句等价于:select * from user WHERE username like '%王%'
Sql片段
Sql 中可将重复的 sql 提取出来,使用时用 include
引用即可,最终达到 sql 重用的目的。
<!--抽取重复的语句代码片段-->
<sql id="defaultsql">
select * from user
</sql>
<!-- 查询所有-->
<select id="findAll" resultType="com.ben.domain.User">
<include refid="defaultsql"></include>
</select>
<!-- 通过Id查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="com.ben.domain.User">
<include refid="defaultsql"></include>
where id = #{v}
</select>
foreach标签
<foreach>
标签用于遍历集合.
属性:
collection:代表要遍历的集合元素,注意不要写#{}
open:语句的开始部分
close:结束部分
item:遍历集合的每个元素,生成的变量名
sperator:分隔符
举例:
select * from user where id in(1,45,46,47,48)
其对应的xml写法:
<select id="findByIds" parameterType="com.ben.domain.QueryVo" resultType="com.ben.domain.User">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
测试类写法:
@Test
public void testFindByIds(){
QueryVo vo = new QueryVo();
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(45);
ids.add(46);
ids.add(47);
ids.add(48);
vo.setIds(ids);
//6.执行操作
List<User> users = userdao.findByIds(vo);
for(User user : users) {
System.out.println(user);
}
}
QueryVo写法
package com.ben.domain;
import java.io.Serializable;
import java.util.List;
/**
* @ClassName: QueryVo
* @author: benjamin
* @version: 1.0
* @description: 查询条件对象
* @createTime: 2019/07/15/17:35
*/
public class QueryVo implements Serializable {
private User user;
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}