上一节咱们学习基于 mybatis-plus
的条件构造器——QueryWrapper,这一节咱们来学习一下mybatis-plus
的ActiveRecord(活动记录)
。java
在开始以前,咱们先来了解一下什么是ActiveRecord(活动记录)?mysql
Active Record(活动记录),是一种领域模型模式,特色是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。git
ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜好,而 Java 做为准静态语言,对于 ActiveRecord 每每只能感叹其优雅,因此 MP 也在 AR 道路上进行了必定的探索github
那么咱们如何使用AR模式呢?spring
仅仅须要让实体类继承 Model 类且实现主键指定方法,便可开启 AR 之旅 。sql
下面咱们来介绍详细内容,首先按照快速开始——Spring集成Mybatis-Plus
一节的操做,新建一个mp04
的 Module
,能够将mp02
中的内容所有复制过来,而后进行下面的修改:数据库
修改 Employee
实体类:apache
/**
* 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
中已经配置了表的前缀生成策略mybatis
<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("表名")
注解。app
@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();
// 一、查询操做,直接根据id查询 selectById(id)
Employee result = employee.selectById(14);
System.out.println(result);
// 二、查询操做
employee.setId(23);
Employee employee1 = employee.selectById();
System.out.println(employee1);
//三、查询操做 selectAll
List<Employee> employees = employee.selectAll();
System.out.println(employees);
//四、查询操做 selectList
List<Employee> employeeList = employee.selectList(
new QueryWrapper<Employee>().like("last_name", "M"));
System.out.println(employeeList);
//五、统计查询
Integer count = employee.selectCount(
new QueryWrapper<Employee>().like("last_name", "M"));
System.out.println(count);
}
复制代码
/**
* AR 删除操做
*/
@Test
public void testARDelete() {
// 一、根据id删除
Employee employee = new Employee();
boolean deleteById = employee.deleteById(25);
System.out.println(deleteById);
//二、根据id删除
employee.setId(26);
boolean delete = employee.deleteById();
System.out.println(delete);
//三、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() {
// 一、根据id删除
Employee employee = new Employee();
boolean deleteById = employee.deleteById(25);
System.out.println(deleteById);
//二、根据id删除
employee.setId(26);
boolean delete = employee.deleteById();
System.out.println(delete);
//三、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();
// 一、查询操做,直接根据id查询 selectById(id)
Employee result = employee.selectById(14);
System.out.println(result);
// 二、查询操做
employee.setId(23);
Employee employee1 = employee.selectById();
System.out.println(employee1);
//三、查询操做 selectAll
List<Employee> employees = employee.selectAll();
System.out.println(employees);
//四、查询操做 selectList
List<Employee> employeeList = employee.selectList(
new QueryWrapper<Employee>().like("last_name", "M"));
System.out.println(employeeList);
//五、统计查询
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(活动记录)
演示就完成了,下面咱们就能够进入到下一节代码生成器
的学习了。
相关示例完整代码:mybatis-plus-in-action