MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)

三、条件构造器 EntityWrapper & ActiveRecord(活动记录)

条件构造器 EntityWrapper

  • Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率

  • 实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等

  • 注意: 使用的是数据库字段,不是 Java 属性

  • 条件参数说明
    MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第1张图片

带条件的查询

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

 @Test
    public void testEntityWrapperSelect() {
     
        //我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户
		List<Employee> emps =employeeMapper.selectPage(new Page<Employee>(1, 4),
					new EntityWrapper<Employee>()
					.between("age", 18, 50)
					.eq("gender", 1)
					.eq("last_name", "Tom")
				);
		System.out.println(emps);
    }

查询tbl_employee表中, 性别为女并且名字中带有"老师" 或者 邮箱中带有"a"

 @Test
    public void testEntityWrapperSelect() {
     
		List<Employee> emps = employeeMapper.selectList(
				new EntityWrapper<Employee>()
				.eq("gender", 0)
				.like("last_name", "老师")
				//.or()    // SQL: (gender = ? AND last_name LIKE ? OR email LIKE ?)
				.orNew()   // SQL: (gender = ? AND last_name LIKE ?) OR (email LIKE ?)
				.like("email", "a")
				);
		System.out.println(emps);

说明:or()与orNew()的区别:发出的sql不同

or() SQL: (gender = ? AND last_name LIKE ? OR email LIKE ?)
orNew() SQL: (gender = ? AND last_name LIKE ?) OR (email LIKE ?)

查询性别为女的, 根据age进行排序(asc/desc), 简单分页

@Test
    public void testEntityWrapperSelect() {
     
        // 查询性别为女的, 根据age进行排序(asc/desc), 简单分页

		List<Employee> emps  = employeeMapper.selectList(
				new EntityWrapper<Employee>()
				.eq("gender", 0)
				.orderBy("age")
				//.orderDesc(Arrays.asList(new String [] {"age"}))
				.last("desc limit 1,3")
				);
		System.out.println(emps);

    }

说明:last()是直接拼接在sql上,所以有sql注入问题,小心使用

带条件的修改

@Test
    public void testEntityWrapperUpdate() {
     

        Employee employee = new Employee();
        employee.setLastName("苍老师");
        employee.setEmail("[email protected]");
        employee.setGender(0);


        employeeMapper.update(employee,
                new EntityWrapper<Employee>()
                        .eq("last_name", "Tom")
                        .eq("age", 44)
        );
    }

带条件的删除

@Test
    public void testEntityWrapperDelete() {
     

        employeeMapper.delete(
                new EntityWrapper<Employee>()
                        .eq("last_name", "Tom")
                        .eq("age", 22)
        );
    }

Condition的使用

Condition和EntitWarapper都继承了Warapper,所以用法相似

@Test
    public void testEntityWrapperSelect() {
     
        //我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户
        List<Employee > emps = employeeMapper.selectPage(
                new Page<Employee>(1,2),
                Condition.create()
                        .between("age", 18, 50)
                        .eq("gender", "1")
                        .eq("last_name", "Tom")

        );
    }

ActiveRecord(活动记录)

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的 一个表,而模型类的一个实例对应表中的一行记录

如何使用 AR 模式

  • 仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅
public class Employee extends Model<Employee> {
     
    private Integer id ;
    private String  lastName;
    private String  email ;
    private Integer gender;
    private Integer age ;
    @TableField(exist=false)
    private Double salary ;

    /**
     * 指定当前实体类的主键属性
     * @return
     */
    @Override
    protected Serializable pkVal() {
     
        return this.id;
    }
    ...
}

AR插入操作

根据一个Employee对象中的属性,通过对象调用父类Model中的插入方法,把自身插入到数据库中,返回操作是否成功

 /**
     * AR  插入操作
     */
    @Test
    public void  testARInsert() {
     
        Employee employee = new Employee();
        employee.setLastName("宋老师");
        employee.setEmail("[email protected]");
        employee.setGender(1);
        employee.setAge(35);

        boolean result = employee.insert();
        System.out.println("result:" +result );
    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第2张图片

AR修改操作

根据一个Employee对象中的属性,通过对象调用父类Model中的修改方法,根据id修改其数据库中的内容,返回操作是否成功

/**
     * AR 修改操作
     */
    @Test
    public void testARUpdate() {
     
        Employee employee = new Employee();
        employee.setId(10);
        employee.setLastName("宋老湿");
        employee.setEmail("[email protected]");
        employee.setGender(1);
        employee.setAge(36);

        boolean result = employee.updateById();
        System.out.println("result:" +result );

    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第3张图片

AR查询操作

  • T selectById() 方法

这是个重载方法,可以不传参,通过employee中的自身id查询,也可以手动传入id查询,返回查询到的结果

@Test
    public void testARSelect() {
     
        Employee employee = new Employee();
		//手动传参
        Employee result = employee.selectById(14);
        
        //不传参,使用对象中的自身id
		//employee.setId(14);
		//Employee result = employee.selectById();
		System.out.println(result );

    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第4张图片

  • List selectAll() 方法

查询所有记录,返回一个list

@Test
    public void testARSelect() {
     
        Employee employee = new Employee();

		List<Employee> emps = employee.selectAll();
		System.out.println(emps);
    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第5张图片

  • List selectList(Wrapper wrapper)

通过条件构造器查询,把条件封装在Wrapper中,返回查询到的结果集

@Test
    public void testARSelect() {
     
        Employee employee = new Employee();
		List<Employee > emps=
				employee.selectList(new EntityWrapper<Employee>().like("last_name", "To"));
		System.out.println(emps);

    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第6张图片

  • int selectCount(Wrapper wrapper)方法

通过条件构造器查询,把条件封装在Wrapper中,返回查询到的记录数

@Test
    public void testARSelect() {
        Employee employee = new Employee();
        Integer result = employee.selectCount(new EntityWrapper().eq("gender", 1));
        System.out.println("result: " +result );


    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第7张图片

AR删除操作

  • boolean deleteById()

这是个重载方法,可以不传参,通过employee中的自身id查询,也可以手动传入id查询,返回操作的结果

注意:删除不存在的数据理论上也算删除成功会返回true

@Test
    public void testARDelete() {
     

        Employee employee = new Employee();
        //手动传参
        boolean result = employee.deleteById(2);
        
       	//用兑现本身的参数
//		employee.setId(2);
//		boolean result = employee.deleteById();
		System.out.println("result:" +result );
    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第8张图片

  • boolean delete(Wrapper wrapper) 方法

封装条件删除指定记录

 @Test
    public void testARDelete() {
     

        Employee employee = new Employee();
        boolean result = employee.delete(new EntityWrapper<Employee>().like("last_name", "老师"));
        System.out.println(result );
    }

MyBatis-Plus篇-(三)条件构造器 EntityWrapper & ActiveRecord(活动记录)_第9张图片

分页复杂操作

 @Test
    public void  testARPage() {
     

        Employee employee = new Employee();

        Page<Employee> page = employee.selectPage(new Page<>(1, 1),
                new EntityWrapper<Employee>().like("last_name", "Tom"));
        List<Employee> emps = page.getRecords();
        System.out.println(emps);
    }

小结

  • AR 模式提供了一种更加便捷的方式实现 CRUD 操作,其本质还是调用的 Mybatis 对 应的方法,类似于语法糖
  • 语法糖是指计算机语言中添加的某种语法,这种语法对原本语言的功能并没有影响. 可以更方便开发者使用,可以避免出错的机会,让程序可读性更好

你可能感兴趣的:(SSM,#,MyBatis-Plus)