1 什么是 Active Record
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
在 Active Record 模式中,对象中既有持久存储的数据,也有针对数据的操作,Active Record 模式把数据增删改查的逻辑作为对象的一部分,处理对象的用户知道如何读写数据,提升了开发效率。
其实底层仍然使用的是Mapper层在完成数据库操作。只不过由我们自己调用Mapper对象操作数 据库,变成了通过实体类对象来调用Mapper完成数据库操作。从代码的物理视图上我们是看不到实体类调用Mapper的过程的。也就说,本质上仍然是Mapper层在操作数据库实体类型操作数据掩盖了底层的mapper的方法的调用。
2 Active Record 用法
2.1 创建 mapper 接口
在 MyBatisPlus 中,Active Record 模式即在实体类中封装了对数据库的访问,而不需要通过 mapper 类来对数据库进行操作。
但是在实际使用中,我们仍然需要编写 mapper 接口并继承 BaseMapper 父接口,虽然并不会通过 mapper 来操作数据库。
代码语言:java复制import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.test.pojo.User;
public interface UserMapper extends BaseMapper<User> {
}
同时,需要在 SpringBoot 主类中对 mapper 文件进行扫描:
代码语言:java复制import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.test.mapper")
public class ArApplication {
public static void main(String[] args) {
SpringApplication.run(ArApplication.class, args);
}
}
如果缺少 mapper 接口,或者未在主类中使用 @MapperScan 进行注册,则在运行时会报如下错误:
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: com.test.pojo.User Not Found TableInfoCache.
2.2 创建实体类
创建的实体类需要继承 Model 类,才能开启 Active Record 模式。
实体类除了继承 Model 类外,其它设计与非 Active Record 模式相同,包含表名@TableName
、字段名@TableField
、主键@TableId
及主键类型的设置等。
因为引入了 lombok 类,使用注解可以大大简化编写的代码量。
代码语言:java复制import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value="user")
public class User extends Model<User> {
@TableId(value = "id", type = IdType.AUTO)
Integer id;
String username;
String gendar;
String remark;
}
2.3 创建测试类
创建实体类后,直接使用实体类的 insert() 方法,即可向数据库中插入数据,不再需要将 mapper 接口实例化后进行调用。
代码语言:java复制import com.test.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class TestAR {
@Test
public void testAddUser(){
User user = new User(20, "成吉思汗", "男", "一代天骄");
boolean res = user.insert();
System.out.println(res);
}
}
输出如下:
==> Preparing: INSERT INTO user ( id, username, gendar, remark ) VALUES ( ?, ?, ?, ? )
==> Parameters: 20(Integer), 成吉思汗(String), 男(String), 一代天骄(String)
<== Updates: 1
3 工程
整个工程结构如下:
3.1 配置文件
配置文件中主要有数据库的配置及 mybatisplus 执行的sql语句打印,内容如下:
application.yml
代码语言:txt复制spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3366/test?serverTimezone=UTC
username: root
password: 123456
# 打印SQL语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.2 Maven 配置
代码语言:html复制<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>testMyBatisPlusAR</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.8</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!