上一节我们学习基于 mybatis-plus
的条件构造器——QueryWrapper,这一节我们来学习一下mybatis-plus
的ActiveRecord(活动记录)
。
在开始之前,我们先来了解一下什么是ActiveRecord(活动记录)?
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索
那么我们如何使用AR模式呢?
仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅 。
下面我们来介绍详细内容,首先按照快速开始——Spring集成Mybatis-Plus
一节的操作,新建一个mp04
的 Module
,可以将mp02
中的内容全部复制过来,然后进行下面的修改:
修改 Employee
实体类:
/**
* mybatis-plus 默认会使用实体类的小写类名作为表名
*
* 继承 Model 类,开启AR模式
*/
@Data
@ToString
public class Employee extends Model {
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Integer age;
// 当前字段是否在数据库中存在,如果不存在则忽略该字段插入到数据库中
@TableField(exist = false)
private Double salary;
// 注意:我们这里需要重写pkVal()方法,return当前类的主键。 在实际的实践中,发现如果未重写pkVal()方法,并不会影响AR的使用
@Override
protected Serializable pkVal() {
return this.id;
}
}
注意
:mybatis-plus 默认会使用实体类的小写类名作为表名,因为我们在 applicationContext.xml
中已经配置了表的前缀生成策略
所以,不会出现数据库表和实体类不匹配的状况,如果想要使用单独的表名,可以在实体类上使用@TableName("表名")
注解。
@TableName("tbl_employee")
public class Employee extends Model{
// .. fields
// .. getter and setter
@Override
protected Serializable pkVal() {
return this.id;
}
}
注意
:mapper不用做修改,但是也不能少,虽然AR模式用不到该接口,但一定要定义,否则使用AR时会报空指针异常。
public interface EmployeeMapper extends BaseMapper {
}
修改mp04的pom.xml
文件:
mybatis-plus-in-action
com.demo.mybatis-plus
1.0-SNAPSHOT
4.0.0
mp04
com.baomidou
mybatis-plus
${mybatis.plus.version}
junit
junit
${junit.version}
log4j
log4j
${log4j.version}
com.alibaba
druid
${druid.version}
mysql
mysql-connector-java
${mysql.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.projectlombok
lombok
${lombok.version}
provided
删除TestMp.java
中的内容,方便我们来进行测试。
上面的准备工作做完了,下面我们可以来使用AR进行操作了:
/**
* AR 插入操作
*/
@Test
public void testARInsert() {
Employee employee = new Employee();
employee.setGender(1);
employee.setLastName("ar_insert");
boolean b = employee.insert();
System.out.println(b);
}
注意
:AR操作是通过对象本身调用相关方法,AR增强了实体类的功能,比如要insert一个Employee,那就用这个Employee调用insert方法即可。可以看到在上面的代码中并不需要注入mapper接口,不过正如之前所说,不使用但还是要定义,否则会报错。
/**
* AR 修改操作
*/
@Test
public void testARUpdate() {
Employee employee = new Employee();
employee.setId(27);
employee.setLastName("李老师");
employee.setGender(2);
employee.setAge(23);
boolean r = employee.updateById();
System.out.println(r);
}
/**
* AR 查询操作
*/
@Test
public void testARSelect() {
Employee employee = new Employee();
// 1、查询操作,直接根据id查询 selectById(id)
Employee result = employee.selectById(14);
System.out.println(result);
// 2、查询操作
employee.setId(23);
Employee employee1 = employee.selectById();
System.out.println(employee1);
//3、查询操作 selectAll
List employees = employee.selectAll();
System.out.println(employees);
//4、查询操作 selectList
List employeeList = employee.selectList(
new QueryWrapper().like("last_name", "M"));
System.out.println(employeeList);
//5、统计查询
Integer count = employee.selectCount(
new QueryWrapper().like("last_name", "M"));
System.out.println(count);
}
/**
* AR 删除操作
*/
@Test
public void testARDelete() {
// 1、根据id删除
Employee employee = new Employee();
boolean deleteById = employee.deleteById(25);
System.out.println(deleteById);
//2、根据id删除
employee.setId(26);
boolean delete = employee.deleteById();
System.out.println(delete);
//3、wrapper 删除
boolean delete1 = employee.delete(
new QueryWrapper().like("last_name", "M"));
System.out.println(delete1);
}
/**
* AR 复杂分页操作
*/
@Test
public void testARPage() {
Employee employee = new Employee();
IPage page = employee.selectPage(
new Page<>(1, 2),
new QueryWrapper().like("email", ".com"));
System.out.println(page.getRecords());
}
public class TestMp {
private ApplicationContext ioc = new
ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper = ioc.getBean("employeeMapper", EmployeeMapper.class);
/**
* AR 复杂分页操作
*/
@Test
public void testARPage() {
Employee employee = new Employee();
IPage page = employee.selectPage(
new Page<>(1, 2),
new QueryWrapper().like("email", ".com"));
System.out.println(page.getRecords());
}
/**
* AR 删除操作
*/
@Test
public void testARDelete() {
// 1、根据id删除
Employee employee = new Employee();
boolean deleteById = employee.deleteById(25);
System.out.println(deleteById);
//2、根据id删除
employee.setId(26);
boolean delete = employee.deleteById();
System.out.println(delete);
//3、wrapper 删除
boolean delete1 = employee.delete(
new QueryWrapper().like("last_name", "M"));
System.out.println(delete1);
}
/**
* AR 查询操作
*/
@Test
public void testARSelect() {
Employee employee = new Employee();
// 1、查询操作,直接根据id查询 selectById(id)
Employee result = employee.selectById(14);
System.out.println(result);
// 2、查询操作
employee.setId(23);
Employee employee1 = employee.selectById();
System.out.println(employee1);
//3、查询操作 selectAll
List employees = employee.selectAll();
System.out.println(employees);
//4、查询操作 selectList
List employeeList = employee.selectList(
new QueryWrapper().like("last_name", "M"));
System.out.println(employeeList);
//5、统计查询
Integer count = employee.selectCount(
new QueryWrapper().like("last_name", "M"));
System.out.println(count);
}
/**
* AR 修改操作
*/
@Test
public void testARUpdate() {
Employee employee = new Employee();
employee.setId(27);
employee.setLastName("李老师");
employee.setGender(2);
employee.setAge(23);
boolean r = employee.updateById();
System.out.println(r);
}
/**
* AR 插入操作
*/
@Test
public void testARInsert() {
Employee employee = new Employee();
employee.setGender(1);
employee.setLastName("ar_insert");
boolean b = employee.insert();
System.out.println(b);
}
}
完成上面的操作后,mp04的代码结构如下所示:
至此,基于 mybatis-plus
的ActiveRecord(活动记录)
演示就完成了,下面我们就可以进入到下一节代码生成器
的学习了。
相关示例完整代码:mybatis-plus-in-action
上一节:四、条件构造器——AbstractWrapper
下一节:六、代码生成器——逆行工程