mybatis-plus 条件构造器
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
官网介绍: https://baomidou.com/guides/wrapper/
查询mybatisPlus源码可以看到,条件构造器wrapper继承情况
Wrapper:条件构造器,最顶端的一个类
AbstractWrapper:用于sq|语句条件的封装,主要是封装where条件
QueryWrapper: 查询条件封装(一般删除的条件也使用QueryWrapper)
UpdateWrapper:更新条件封装
AbstractLambdaWrapper:具有Lambda语法的条件封装
LambdaQueryWrapper:具有Lambda语法查询条件封装
LambdaUpdateWrapper:具有Lambda语法更新条件封装
@Test
void testQuery() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("name", "Huangcy");
userMapper.selectList( wrapper).forEach(System.out::println);
}Wrapper、QueryWrapper 基本都是这么使用的;
当然除了eq还有很比、比如ge、gt、between、like、notLike等等;这官网上面都有详细的介绍;这里就做个引路就好
lambda表达式执行条件
在QueryWrapper中有and或者or这样的方法,要注意的是默认都是通过and来进行连接条件,但是如果主动调用or方法,将会改变,还有一点如果and或者or表达式时中出现lambda表达式,将会改变条件的优先级,先来执行lambda表达式的条件
比如:查找出名字包含"Huang" 并且 (年龄大于18 或者邮箱不为空的数据)
错误写法:
@Test
void testQuery2() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "Huang").gt("age", 18).or().isNull("email");
userMapper.selectList(wrapper).forEach(System.out::println);
}sql 语句: SELECT id,name,age,email,version,deleted,create_time,update_time FROM user WHERE deleted=0 AND (name LIKE ? AND age > ? OR email IS NULL)
正确写法
@Test
void testQuery3() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "Huang")
.and(w -> w.gt("age", 18).or().isNull("email"));
userMapper.selectList(wrapper).forEach(System.out::println);
}sql 语句: SELECT id,name,age,email,version,deleted,create_time,update_time FROM user WHERE deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))