Mybatis-Plus条件构造器的具体使用方法

所属分类: 软件编程 / java 阅读数: 50
收藏 0 赞 0 分享

在Mybatis-Plus中,Wrapper接口的实现类关系如下:


可以看到,AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点看下AbstractWrapper以及其子类。

说明:QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql的 where 条件, entity 属性也用于生成 sql 的 where 条件

注意:entity 生成的 where 条件与使用各个 api 生成的 where 条件 没有任何关联行为

文档地址:https://mybatis.plus/guide/wrapper.html

allEq

说明

  • allEq(Map<R, V> params)
  • allEq(Map<R, V> params, boolean null2IsNull)
  • allEq(boolean condition, Map<R, V> params, boolean null2IsNull)

全部eq(或个别isNull)

个别参数说明: params : key 为数据库字段名, value 为字段值 null2IsNull : 为 true 则在 map 的 value 为

null 时调用 isNull 方法,为 false 时则忽略 value 为 null 的
例1: allEq({id:1,name:“老王”,age:null}) —> id = 1 and name = ‘老王' and age is null
例2: allEq({id:1,name:“老王”,age:null}, false) —> id = 1 and name = ‘老王'

  • 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)

个别参数说明: filter : 过滤函数,是否允许字段传入比对条件中 params 与 null2IsNull : 同上
例1: allEq((k,v) -> k.indexOf(“a”) > 0, {id:1,name:“老王”,age:null}) —> name = ‘老王' and age is null
例2: allEq((k,v) -> k.indexOf(“a”) > 0, {id:1,name:“老王”,age:null}, false) —> name = ‘老王'

测试用例

@Test
public void testAllEq() {
	// 设置条件
	Map<String, Object> params = new HashMap<>();
	params.put("name", "李四");
	params.put("age", "20");
	params.put("password", null);

	QueryWrapper<User> wrapper = new QueryWrapper<>();
	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE password IS NULL AND name = ? AND age = ?
	// wrapper.allEq(params);

	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ?
	// wrapper.allEq(params, false);

	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE age = ?
	// wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id")), params);

	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ?
	wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id") || k.equals("name")), params);

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

基本比较操作

  • eq:等于 =
  • ne:不等于 <>
  • gt:大于 >
  • ge:大于等于 >=
  • lt:小于 <
  • le:小于等于 <=
  • between:BETWEEN 值1 AND 值2
  • notBetween:NOT BETWEEN 值1 AND 值2
  • in:字段 IN (value.get(0), value.get(1), …)
  • notIn:字段 NOT IN (v0, v1, …)

测试用例

@Test
public void testEq() {
	QueryWrapper<User> wrapper = new QueryWrapper<>();

	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
	wrapper.eq("password", "123456").ge("age", 20).in("name", "李四", "王五", "赵六");

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

模糊查询like:LIKE ‘%值%'

例: like(“name”, “王”) —> name like ‘%王%'notLike:NOT LIKE ‘%值%'
例: notLike(“name”, “王”) —> name not like ‘%王%'likeLeft:LIKE ‘%值'
例: likeLeft(“name”, “王”) —> name like ‘%王'likeRight:LIKE ‘值%'
例: likeRight(“name”, “王”) —> name like ‘王%'

测试用例

@Test
public void testLike() {
	QueryWrapper<User> wrapper = new QueryWrapper<>();
	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name LIKE ?
	// 参数:%五(String)
	wrapper.likeLeft("name", "五");

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

排序

orderBy
排序:ORDER BY 字段, …
例: orderBy(true, true, “id”, “name”) —> order by id ASC,name ASC

orderByAsc
排序:ORDER BY 字段, … ASC
例: orderByAsc(“id”, “name”) —> order by id ASC,name ASC

orderByDesc
排序:ORDER BY 字段, … DESC
例: orderByDesc(“id”, “name”) —> order by id DESC,name DESC

测试用例

@Test
public void testOrderByAgeDesc() {
	QueryWrapper<User> wrapper = new QueryWrapper<>();
	// 按照年龄倒序排序
	// SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
	wrapper.orderByDesc("age");

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

逻辑查询

or
拼接 OR
主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)

and
AND 嵌套
例: and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”)) —> and (name = ‘李白' and status<> ‘活着')

测试用例

@Test
public void testOr() {
	QueryWrapper<User> wrapper = new QueryWrapper<>();
	// SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? OR age = ?
	wrapper.eq("name", "王五").or().eq("age", 21);

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

select

在Mybatis-Plus查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。

@Test
public void testSelect() {
	QueryWrapper<User> wrapper = new QueryWrapper<>();
	// SELECT id,name,age FROM tb_user WHERE name = ? OR age = ?
	wrapper.eq("name", "王五").or().eq("age", 21).select("id", "name", "age"); // 指定查询的字段

	List<User> users = this.userMapper.selectList(wrapper);
	for (User user : users) {
		System.out.println(user);
	}
}

查询方式 说明
setSqlSelect 设置 SELECT 查询字段
where WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last(“LIMIT 1”)

更多精彩内容其他人还在看

详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

这篇文章主要介绍了详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

了解spring中的CloudNetflix Hystrix弹性客户端

这篇文章主要介绍了了解spring中的CloudNetflix Hystrix弹性客户端,客户端弹性模式是在远程服务发生错误或表现不佳时保护远程资源(另一个微服务调用或者数据库查询)免于崩溃。,需要的朋友可以参考下
收藏 0 赞 0 分享

Spark学习笔记Spark Streaming的使用

这篇文章主要介绍了Spark学习笔记Spark Streaming的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

通过实例讲解springboot整合WebSocket

这篇文章主要介绍了通过实例讲解springboot整合WebSocket,WebSocket为游览器和服务器提供了双工异步通信的功能,即游览器可以向服务器发送消息,服务器也可以向游览器发送消息。,需要的朋友可以参考下
收藏 0 赞 0 分享

java虚拟机学习笔记进阶篇

在本篇内容里小编给大家分享了关于java虚拟机学习笔记的进阶内容,需要的朋友们跟着学习下。
收藏 0 赞 0 分享

java虚拟机学习高级篇

在本篇文章里小编给大家整理了关于java虚拟机学习高级篇的相关内容,有兴趣的朋友们跟着学习参考下。
收藏 0 赞 0 分享

java虚拟机中多线程总结

在本篇内容中小编给大家分享的是关于java虚拟机中多线程的知识点总结内容,需要的朋友们参考学习下。
收藏 0 赞 0 分享

java虚拟机多线程进阶篇总结

在本篇内容里小编给大家整理了关于java虚拟机多线程进阶篇的相关知识点内容,有兴趣的朋友们跟着参考下。
收藏 0 赞 0 分享

java数据结构和算法中数组的简单入门

在本文里小编给大家整理了关于java数据结构和算法中数组的简单入门知识点整理,需要的朋友们学习下。
收藏 0 赞 0 分享

java数据结构和算法中哈希表知识点详解

在本篇文章里小编给大家分享了关于java数据结构和算法中哈希表的相关知识点内容,需要的朋友们学习下。
收藏 0 赞 0 分享
查看更多