SpringBoot 集成 MybatisPlus 五——ActiveRecord介绍

2023-11-03 20:34:15 浏览数 (2)

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞