MyBatis之动态SQL

本文最后更新于:1 年前

用户的筛选条件不同,我们完成筛选所执行的 SQL 语句也不一样。虽然可以通过穷举来一一完成不同条件的筛选,但是这种实现思路过于繁琐和复杂,MyBatis就提供了动态SQL的配置方式来实现多条件查询。

什么是动态SQL?

动态SQL是指根据查询条件动态完成SQL的拼接

动态SQL案例

1
2
3
4
5
6
7
create table members(
member_id int primary key auto_increment,
member_nick varchar(20) not null unique,
member_gender char(2) not null,
member_age int not null,
member_city varchar(30) not null
);
1
2
3
4
5
6
7
8
9
10
11
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Member implements Serializable {
private int memberId;
private String memberNick;
private String memberGender;
private int memberAge;
private String memberCity;
}

方式一:自定义查询条件的实体类存放参数

DAO接口

MemberSearchCondition.java
1
2
3
4
5
6
7
8
9
10
11
public interface MemberDAO {

/**
* 可以定义专门用于存放查询条件的实体类存放参数
* -> 优点:设置参数时无需关注属性名
* -> 缺点:需要单独定义一个类来封装参数
* @param params
* @return
*/
public List<Member> searchMember(MemberSearchCondition params);
}

映射文件

MemberMapping.xml

测试

MemberDAOTest.java
MemberDAOTest.java
MemberDAOTest.java

方式二:HashMap作为参数

DAO接口

1
2
3
4
5
6
7
8
9
public interface MemberDAO {

/**
* 在多条件查询中,如果查询条件不确定,可以直接使用HashMap作为参数
* -> 优点:无需单独定义传递查询条件的类
* -> 缺点:当向Map中存放参数时,key必须与动态sql保持一致()
*/
public List<Member> searchMember(HashMap<String, Object> params);
}

映射文件

MemberMapper.xml

测试

MemberDAOTest.java

where标签

使用where标签后,会将sql语句中第一个条件前的 and 或 or 去掉。

MemberMapper.xml

trim标签

可以给sql语句的条件加前缀和后缀,并去除第一个条件前的 and 或 or。

MemberMapper.xml

foreach标签

foreach标签用于sql语句中的 in 操作符,在WHERE 子句中规定多个值。

DAO接口

1
2
3
4
public interface MemberDAO {
/** 只查询指定几个城市的会员 **/
public List<Member> searchMemberByCity(List<String> cities);
}

映射文件

MemberMapper.xml

测试

MemberDAOTest.java
MemberDAOTest.java

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!