文章目录
条件构造器
- 在 IService 中提供了一个 query 方法,该方法返回 QueryChainWrapper 对象实现链式查询,避免每次都创建 QueryWrapper 对象
// 链式查询 普通
QueryChainWrapper<T> query();
- QueryChainWrapper 对象提供的方法和 QueryWrapper 方法基本一样,其中下面几个用于获取记录
// 应用查询条件,返回一个结果列表
// 例如:userService.query().eq("sex", "男").gt("salary", 7000).lt("age", 30).list();
public List<T> list()
// 应用查询条件,返回一个结果
// 例如:userService.query().eq("user_id", 100).one();
public T one()
// 应用查询条件,返回数据记录数
// 例如:userService.query().eq("sex", "男").gt("salary", 7000).lt("age", 30).one();
public Integer count()
- 采用链式查询,查找性别为“男”,薪水大于 7000,年龄小于 30 的用户列表
@Test
void contextLoads() {
List<UserBean> userBeanList = userService.query()
.eq("sex", "男")
.gt("salary", 7000)
.lt("age", 30).list();
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
allEq 条件
- allEq 方法把参数 Map 中的参数使用 and 进行连接
- 传递如下 Map 参数给 allEq 方法:
Map<String,Object> params = new HashMap<>();
params.put("age", 40);
params.put("sex", "男");
- allEq 方法组成如下 SQL 语句
age=50 and sex='男'
- allEq 方法定义
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
- 参数说明
- params:查询条件,key 为数据库字段名,value 为字段值
- null2IsNull:指定当 params 条件的 value 为 null 时,是否转换成 SQL 的 is null。如果为 true 则在 map 的 value为 null 时,调用 isNull 方法。为 false 时则忽略 value 为 null 的条件。例如:
// 示例1:
Map<String,Object> params = new HashMap<>();
params.put("age", null);
params.put("sex", "男");
allEq(params )
// 对应的 SQL 语句
sex = '男' and age is null
// 示例2:
Map<String,Object> params = new HashMap<>();
params.put("age", null);
params.put("sex", "男");
allEq(params , false)
// 对应的 SQL 语句,忽略了 value 等于 null 的条件
sex = '男'
- filter:过滤函数,判断是否允许某个字段传入此对条件中
Map<String,Object> map = new HashMap<>();
map.put("sex", "男");
map.put("age", null);
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.allEq(new BiPredicate<String,Object>(){
@Override
public boolean test(String s, Object o) {
System.out.println(s + "=>" + o);
// 过滤条件值为 null 的条件
// 如果条件的值为 null,则不参与过滤
return null != o;
}
}, map);
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
- condition:使用这个条件可以构建动态SQL条件,而不需要使用 if-else。如果当 condition 为 true,则将 allEq 方法中的可用条件添加到 SQL 条件中。如果为 false,则所有 allEq 条件均不添加到 SQL 条件中
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.gt("salary", 7000); // 用户薪水大于7000
UserBean userBean = getUserBeanById(100);
Map<String,Object> params = new HashMap<>();
if(null != userBean) {
params.put("age", userBean.getAge());
params.put("sex", userBean.getSex());
}
wrapper.allEq(null != userBean, params , true); // 如果 userBean 为 null,则应用 params 条件
eq 和 ne
- eq(等于)和 ne(不等于)判断条件
- eq(等于 =)
eq(R column, Object val)
eq(boolean condition, R column, Object val)
// 过滤 name 等于“张三”的用户信息
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三"); // 等价 SQL 语句:name = '张三'
- ne(不等于 != 或 <>):查询 name 不等于“张三”的用户信息
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.ne("name", "张三");// 等价的 SQL 语句:name <> '张三' 或 name != '张三'
- 参数说明:
- column:要用于条件筛选的数据库表列名称,如:name
- val:用于指定数据表列的值,条件将根据该值进行筛选
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
- 运行下面程序,将执行如下 SQL 语句:参数为 30(Integer), 男(String)
@Test
void contextLoads() {
// 查询:age=30 and sex!='男'
// 或者:age=30 and sex<>'男'
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.eq("age", 30);
wrapper.ne("sex", "男");
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
System.out.println("result size=" + userBeanList.size());
}
执行如下 SQL 语句
SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (age = ? AND sex <> ?)
gt、ge、lt 和 le
- gt(大于 >)
gt(R column, Object val)
gt(boolean condition, R column, Object val)
查询 age 大于 18 岁
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18); // 等价 SQL 语句:age > 18
- ge(大于等于 >=)
ge(R column, Object val)
ge(boolean condition, R column, Object val)
查询 age 大于等于 18 岁
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.ge("age", 18); // 等价 SQL 语句:age >= 18
- lt(小于 <)
lt(R column, Object val)
lt(boolean condition, R column, Object val)
查询 age 小于 18 岁
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.lt("age", 18); // 等价 SQL 语句:age < 18
- le(小于等于 <=)
le(R column, Object val)
le(boolean condition, R column, Object val)
查询 age 小于等于 18 岁
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.le("age", 18); // 等价的 SQL 语句:age <= 18
- 参数说明
- column:要用于条件筛选的数据库表列名称,如:name
- val:用于指定数据表列的值,条件将根据该值进行筛选
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.gt("user_id", 100);
wrapper.lt("user_id", 105);
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.ge("user_id", 100);
wrapper.le("user_id", 105);
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
between 和 notBetween
- between(BETWEEN 值1 AND 值2)
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
- between 对应 SQL 语句中的 between 关键字
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.between("age", 18, 30); // 等价于 SQL 语句:age between 18 and 30
- notBetween(NOT BETWEEN 值1 AND 值2)
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
- between 对应 SQL 语句中的 not between 关键字
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.notBetween("age", 18, 30); // 等价于 SQL 语句:age not between 18 and 30
- 参数说明
- column:要用于条件筛选的数据库表列名称,如:name
- val1:用于指定数据表列的值,条件将根据该值进行筛选
- val2:用于指定数据表列的值,条件将根据该值进行筛选
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.between("user_id", 100, 105);
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.notBetween("age", 21, 90);
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
like模糊查询
- like(完全模糊,即“like ‘%val%’”)
like(R column, Object val)
like(boolean condition, R column, Object val)
- 参数说明
- like(R column, Object val)
like(boolean condition, R column, Object val) - val:用于指定数据表列的值,条件将根据该值进行筛选
- val:用于指定数据表列的值,条件将根据该值进行筛选
- like(R column, Object val)
- 查询用户名称中包含“王”值的用户信息,如下
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.like("name", "王"); // 等价 SQL 语句:name like '%王%'
notLike(完全模糊取非,即“not like ‘%val%’”)
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
- 参数说明
- column:要用于条件筛选的数据库表列名称,如:name、
- val:用于指定数据表列的值,条件将根据该值进行筛选
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
- 查询用户名以“王”值结束的用户信息列表
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.likeLeft("name", "王"); // 等价 SQL 语句:name like '%王'
likeRight(仅右边模糊,即“like ‘val%’”)
likeRight(R column, Object val)
wrapper.likeRight(boolean condition, R column, Object val)
- 参数说明:
- column:要用于条件筛选的数据库表列名称,如:name
- val:用于指定数据表列的值,条件将根据该值进行筛选
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
- 查询用户名以“王”值开始的用户信息列表
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
likeRight("name", "王"); // 等价 SQL 语句:name like '王%'
样例总结
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.like("name", "佳");
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.notLike("name", "佳");
userBeanList = simpleMapper.selectList(wrapper);
System.out.println("result size=" + userBeanList.size());
for(int i = 0; i < (userBeanList.size() > 10 ? 10 : userBeanList.size()); i++) {
System.out.println(userBeanList.get(i));
}
wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "黄");
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.likeLeft("name", "佳");
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
isNull 和 isNotNull
isNull 和 isNotNull
isNull(R column)
isNull(boolean condition, R column)
- 参数说明
- column:字段名
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
isNotNull(字段 IS NOT NULL)
isNotNull(R column)
isNotNull(boolean condition, R column)
- 参数说明
- column:字段名
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
- 构造 name 为空,或者 name 不为空的查询条件
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.isNull("name"); // 等价 SQL 语句:name is null
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name"); // 等价 SQL 语句:name is not null
样例代码
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.isNull("sex");
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.isNotNull("face");
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
in 和 notIn
in(对应SQL中的 in 操作符)
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
in(R column, Object... values)
in(boolean condition, R column, Object... values)
- 参数
- column:列名称
- value:要查询的目标值列表,如:ID列表
- values:要查询的目标值数组,如:[1,2,3,5]
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
- 查询 ID 为 1,2,3 的用户信息
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("user_id", 1, 2, 3); // 等价 SQL 语句:user_id in(1, 2, 3)
List<Integer> userIdList = new ArrayList<>();
userIdList.add(1);
userIdList.add(2);
userIdList.add(3);
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("user_id", userIdList ); // 等价 SQL 语句:user_id in(1, 2, 3)
notIn(对应SQL中的 not in 操作符
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
- 参数说明
- column:列名称
- value:要查询的目标值列表,如:ID列表
- values:要查询的目标值数组,如:[1,2,3,5]
- condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
- 查询所有性别不是“男”或“女”的用户列表
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.notIn("sex", "男", "女"); // 等价 SQL 语句:sex not in("男", "女")
List<Integer> sexList= new ArrayList<>();
sexList.add("男");
sexList.add("女");
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("sex", sexList); // 等价 SQL 语句:sex not in("男", "女")
样例代码
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("user_id", 1, 3, 5, 9);
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.notIn("sex", "男", "女");
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}