Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担, 能够有效提高开发效率
实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
注意: 使用的是数据库字段,不是 Java 属性
需要分页查询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和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")
);
}
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的 一个表,而模型类的一个实例对应表中的一行记录
如何使用 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;
}
...
}
根据一个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 );
}
根据一个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 );
}
这是个重载方法,可以不传参,通过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 );
}
查询所有记录,返回一个list
@Test
public void testARSelect() {
Employee employee = new Employee();
List<Employee> emps = employee.selectAll();
System.out.println(emps);
}
通过条件构造器查询,把条件封装在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);
}
通过条件构造器查询,把条件封装在Wrapper中,返回查询到的记录数
@Test
public void testARSelect() {
Employee employee = new Employee();
Integer result = employee.selectCount(new EntityWrapper().eq("gender", 1));
System.out.println("result: " +result );
}
这是个重载方法,可以不传参,通过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 );
}
封装条件删除指定记录
@Test
public void testARDelete() {
Employee employee = new Employee();
boolean result = employee.delete(new EntityWrapper<Employee>().like("last_name", "老师"));
System.out.println(result );
}
@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);
}