上一节我们学习基于 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<Employee> { 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
中已经配置了表的前缀生成策略
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig"> <!-- 全局表主键生成策略 --> <property name="idType" value="AUTO"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> </bean> 复制代码
所以,不会出现数据库表和实体类不匹配的状况,如果想要使用单独的表名,可以在实体类上使用 @TableName("表名")
注解。
@TableName("tbl_employee") public class Employee extends Model<Employee>{ // .. fields // .. getter and setter @Override protected Serializable pkVal() { return this.id; } } 复制代码
注意
:mapper不用做修改,但是也不能少,虽然AR模式用不到该接口,但一定要定义,否则使用AR时会报空指针异常。
public interface EmployeeMapper extends BaseMapper<Employee> { } 复制代码
修改mp04的 pom.xml
文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>mybatis-plus-in-action</artifactId> <groupId>com.demo.mybatis-plus</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>mp04</artifactId> <dependencies> <!-- mp 依赖 mybatis-plus 会自动维护mybatis 以及 mybatis-spring相关的依赖 Mybatis 及 Mybatis-Spring 依赖请勿加入项目配置,以免引起版本冲突!!!Mybatis-Plus 会自动帮你维护! --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatis.plus.version}</version> </dependency> <!--junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!--lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies> </project> 复制代码
删除 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<Employee> employees = employee.selectAll(); System.out.println(employees); //4、查询操作 selectList List<Employee> employeeList = employee.selectList( new QueryWrapper<Employee>().like("last_name", "M")); System.out.println(employeeList); //5、统计查询 Integer count = employee.selectCount( new QueryWrapper<Employee>().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<Employee>().like("last_name", "M")); System.out.println(delete1); } 复制代码
/** * AR 复杂分页操作 */ @Test public void testARPage() { Employee employee = new Employee(); IPage<Employee> page = employee.selectPage( new Page<>(1, 2), new QueryWrapper<Employee>().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<Employee> page = employee.selectPage( new Page<>(1, 2), new QueryWrapper<Employee>().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<Employee>().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<Employee> employees = employee.selectAll(); System.out.println(employees); //4、查询操作 selectList List<Employee> employeeList = employee.selectList( new QueryWrapper<Employee>().like("last_name", "M")); System.out.println(employeeList); //5、统计查询 Integer count = employee.selectCount( new QueryWrapper<Employee>().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(活动记录)
演示就完成了,下面我们就可以进入到下一节 代码生成器
的学习了。