mybaits-plus条件构造器

简介: mybaits-plus条件构造器

条件构造器


在MP中,Wrapper接口的实现类关系如下:



在MP查询中,还可以使用lambda方式查询,降低数据库列表写错的风险。


Wrapper中基本比较操作


image.png


测试案例:


    @Test
    public void testEqCp() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,password,name,age,email 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);
        }
    }


也可以用Lambda方式构造条件:


    @Test
    public void testEqCp() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
        wrapper.eq(User::getPassword, "123456")
                .ge(User::getAge, 20)
                .in(User::getName, "李四", "王五", "赵六");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


上面是最简单的查询方法,通常在开发中要根据表达式进行判断,表达式为true则拼接条件,如下:


eq(boolean condition, R column, Object val) 
in(boolean condition, R column, Object... values) ...


上面代码中的condition就是要进行计算的表达式,最终表达式结果为boolean类型。


举个例子:


比如根据name来判断,如果name不为空则拼接条件 String name = null;


wrapper.eq(User::getPassword, "123456") 
    .ge(User::getAge, 20) 
    .in(name!=null,User::getName, "李四", "王五", "赵六");


下面那个具体的案例,条件查询测试案例:


    @Test
    public void testEq3() {
        //条件
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        Integer age = 20;
        queryWrapper.eq(name != null && !name.equals(""), User::getName, name);//等于
        queryWrapper.gt(age != null, User::getAge, age);//大于?
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }


模糊查询


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 testWrapper() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name LIKE ?
        //Parameters: %曹%(String)
        wrapper.likeRight("name", "曹");
        wrapper.select("id", "name","birthday");
        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,password,name,age,email FROM tb_user WHERE name = ? OR age = ?
        wrapper.eq("name", "李四").or().eq("age", 24);
        //变为and方式
        wrapper.eq("name", "李四").eq("age", 24);
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


将上面代码改为lambda方式构造条件:


    @Test
    public void testOr() {
      LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();    
        //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name = ? OR age = ?
    wrapper.eq(User::getName,"李四").or().eq(User::getAge, 24);
        //变为and方式
        wrapper.eq(User::getName, "李四").eq(User::getAge", 24);
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


select


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

测试案例:


    @Test
    public void testWrapper() {
        QueryWrapper<User> wrapper = new QueryWrapper<>(); //SELECT id,name,age FROM tb_user WHERE name = ? OR age = ? 
        wrapper.eq("name", "李四")
                .or()
                .eq("age", 24)
                .select("id", "name", "age");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }


Lambda方式构造条件:


LambdaQueryWrapper<User> w


LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "李四")
        .or()
        .eq(User::getAge, 24)
        .select(User::getId, User::getName, User::getAge);


排序


orderByAsc :升序排序


参数:变长数组,设置多个字段名 
例: orderByAsc("id", "name") ---> order by id ASC,name ASC


orderByDesc :降序排序


参数:变长数组,设置多个字段名 
例: orderByDesc("id", "name") ---> order by id DESC,name DESC


orderBy : 自定义排序规则


方法定义:orderBy(boolean condition, boolean isAsc, R... columns) 
参数1:true有效,false无效 ,参数2:是否升序,参数3..设置多个字段 
例: `orderBy(true, true, "id", "name")`‐‐‐>`order by id ASC,name ASC` 


也可以多个orderBy拼装,如下:


orderBy(true, true, "id").orderBy(true, true, "name")


效果同上面语句。


测试案例:


    @Test
    public void testOrder() {
        QueryWrapper<User> wrapper = new QueryWrapper<>(); 
        //SELECT id,user_name,password,name,age,email 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);
        }
    }


Lambda方式构造条件:


LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); 
wrapper.orderByDesc(User::getAge);
相关文章
|
SQL 关系型数据库 MySQL
Mybatis-plus4条件构造器方式
Mybatis-plus4条件构造器方式
52 0
|
SQL
MyBatis-Plus条件构造器之wapper介绍(一)
MyBatis-Plus条件构造器之wapper介绍
538 0
|
24天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
14 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
简化对象和函数写法
简化对象和函数写法
38 1
|
SQL Java 数据库
MyBatis-Plus 条件构造器
MyBatis-Plus 条件构造器
129 0
MyBatis-Plus条件构造器之wapper介绍(二)
MyBatis-Plus条件构造器之wapper介绍
187 0
|
Java
Java面向对象(17)--类代码块
Java面向对象(17)--类代码块
91 1
Java面向对象(17)--类代码块
MybatisPlus条件构造器 多个组合OR嵌套拼接写法
MybatisPlus条件构造器 多个组合OR嵌套拼接写法
711 0
|
SQL JSON 编译器
MyBatis-Plus 条件构造器 上
MyBatis-Plus 条件构造器 上
101 0
|
SQL XML Java
MyBatis-Plus 条件构造器 下
MyBatis-Plus 条件构造器 下
325 0