条件构造器(EntityWrapper)

1,341 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

我们上一篇说完了利用MyBatiesPlus对数据库的基本操作,,这一篇就简述了比较复杂带有条件的操作。

要介绍的就是我们的条件构造器,Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率。实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等。

!!!使用的是数据库字段,不是 Java 属性!!!

我们通过几个需求来演示我们的条件构造器

范围查找

我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户

 	@Test
    public void demo10(){
        List<Employee> employees = employeeMapper.selectPage(new Page<Employee>(1, 2),
                new EntityWrapper<Employee>()
                        .between("age", 18, 50)
                        .eq("gender", 1)
                        .eq("name", "Tom"));
        System.out.println(employees);
    }

先使用分页查询函数,在参数中创建EntityWrapper,注意我们需要指定泛型,在利用between函数查找值;

在源码中他还是将Wrapper返回,所以我们可以继续使用。

模糊查询

查询性别为女并且名字中带有“老师”或者邮箱中带有“a”

使用方法和范围查找差不多

 	@Test
    public void dome11(){
        List<Employee> employees = employeeMapper.selectList(
                new EntityWrapper<Employee>()
                        .eq("gender", 0)
                        .like("name", "老师")
                        //.or()   
                        .orNew()   
                        .like("email", "a")
        );
        System.out.println(employees);
    }

这时候我们看到了我们在代码中间使用了两种或者,在这个需求中他们两个函数没有多少区别,我们通过查看日志中SQL语句分析他们两个的不同

or() ==>>SELECT id AS id,`name`,email,gender,age FROM tbl_employee WHERE (gender = ? AND name LIKE ? OR email LIKE ?)

orNew() ==>>SELECT id AS id,`name`,email,gender,age FROM tbl_employee WHERE (gender = ? AND name LIKE ?) OR (email LIKE ?)

通过观察我们发现他们就是其中括号的区别,在后续更复杂的需求我们会使用

条件修改

将我们修改数值封装成对象,再用条件构造器去查找

@Test
    public void demo12(){
        Employee employee=new Employee();
        employee.setName("小明");
        employee.setEmail("小明@测试邮箱");
        employee.setGender(1);
        employeeMapper.update(employee,
                new EntityWrapper<Employee>()
                        .eq("name","Tom")
                        .eq("age",22)
        );
    }

条件删除

其实我们写,大家也应知道咋用了

	@Test
    public void demo13(){
        
        employeeMapper.delete(
                new EntityWrapper<Employee>()
                        .eq("name","Tom")
                        .eq("age",22)
        );
    }

Condition

我们使用EntityWrapper时,我们需要创建对象之后才能去使用,但是我们如果使用Condition,我们就可以直接去调用方法,因为他给我们提供了一个静态方法(单例模式)

@Test
    public void demo14(){

        employeeMapper.delete(
                Condition.create()
                        .eq("name","Tom")
                        .eq("age",22)
        );
    }