mybatis-plus 条件构造器

创建时间:2025-11-15 08:39
长度:1787
浏览:0
评论:0

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




评论(共0条)