【SpringBoot】之Mybatis=Plus集成及使用(入门级)

2023-12-16 12:31:12

?🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


?前言

? ? ? ? 在之前的几期有关SpringBoot开发系列的博客的分享中,我们学到了SpringBoot的一些基础使用、Freemarker的集成使用以及自定义Starter的集成及运用。今天我给各位老铁带来的是与数据库相关的知识分享,也是集成到我们的SpringBoot之中方便我们后续的开发。

一、Mybatis-Plus简介

1. 概述(基本概念)

????????MyBatis-Plus(简称 MP)是一个 MyBatis?的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了一些常用功能的增强,使得开发者可以更加便捷地进行数据库访问操作。

????????虽然MyBatis-Plus有许多优点,但它也可能存在不足之处。因此,在使用时需要根据项目需求和个人喜好进行选择。

? ? ? ? 官网:MyBatis-Plus (baomidou.com)

2. 主要特性与功能

? ? ? ? 以下是Mybatis-Plus的一些主要特性及功能:

Mybatis-Plus的主要特性及功能
主要特性及功能说明
简化 CRUD 操作MyBatis-Plus 提供了一套简单而强大的 CRUD 操作方法,通过继承 接口,可以直接使用它提供的方法,无需手写 SQL 语句,减少了重复的代码。
条件构造器MyBatis-Plus 提供了灵活的条件构造器,可以方便地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加简便。
分页插件MyBatis-Plus 集成了分页插件,可以方便地进行分页查询。
主键生成策略MyBatis-Plus 支持多种主键生成策略,包括雪花算法、UUID、自增等,可以根据需求灵活配置。
自动填充MyBatis-Plus 支持自动填充功能,可以在插入或更新数据时自动填充指定字段的值。

3. 特点

MyBatis-Plus的特点包括:

  1. 无侵入:它在MyBatis的基础上进行增强,没有改变MyBatis的原有架构,因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。
  2. 依赖少:使用起来相对方便、快捷。
  3. 集MyBatis与Hibernate的优点于一身。

4. 结构

图示

????????MyBatis-Plus 的结构组成主要包括核心模块、插件模块以及代码生成器。下面是对这些组成部分的简要描述:

  1. 核心模块(Core Module):

    • BaseMapper 接口:?定义了常用的 CRUD 操作,如?、、、?等,开发者可以通过继承该接口来获得这些基本的数据库操作方法,无需手动编写 SQL 语句。insertupdatedeleteselect
    • Wrapper 类:?提供了条件构造器,用于灵活地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加方便。
  2. 插件模块(Plugin Module):

    • 分页插件:?集成了分页插件,使得在进行分页查询时更加便捷。
    • 逻辑删除插件:?支持逻辑删除的功能,通过注解和配置实现逻辑删除。
    • 性能分析插件:?提供了性能分析的功能,可以输出 SQL 的执行时间等信息,方便开发者进行性能优化。
    • 动态表名插件:?允许在运行时动态指定表名,适用于一些需要动态切换表的场景。
  3. 代码生成器(Code Generator):

    • MyBatis-Plus 提供了一个代码生成器工具,可以根据数据库表自动生成对应的 Entity、Mapper 接口以及 Service 类,减少了开发者的重复劳动,提高了开发效率。
    • 通过配置代码生成器,可以灵活地指定生成的代码结构和规范。
  4. 注解(Annotation):

    • MyBatis-Plus 使用了一系列注解来辅助开发,如 用于指定数据库表名, 用于指定主键, 用于指定数据库字段与实体类属性的映射关系, 用于指定逻辑删除字段等。@TableName@TableId@TableField@TableLogic
  5. 配置项(Configuration):

    • MyBatis-Plus 支持丰富的配置选项,通过配置文件或者注解,可以对其行为进行定制,包括主键策略、逻辑删除配置、自动填充配置等。

5. 数据库

????????MyBatis-Plus 作为 MyBatis 的增强工具库,对数据库的使用没有特殊的要求。它与 MyBatis 一样,可以与各种支持 JDBC 的关系型数据库集成,包括但不限于 MySQL、Oracle、SQL Server、PostgreSQL 等。

? ? ? ? 但Mybatis-Plus在使用上数据库中还是有一些注意事项和要求:

Mybatis-Plus在数据库中使用注意事项
注意点事项说明
数据库兼容性MyBatis-Plus 可以与多种数据库进行兼容,但需要注意数据库驱动和版本的选择。通常,你需要根据你所使用的数据库,选择相应的 JDBC 驱动,并确保驱动的版本和 MyBatis-Plus 版本兼容。
主键策略MyBatis-Plus 提供了多种主键生成策略,包括雪花算法、UUID、自增等。在使用时,需要根据数据库支持的主键生成方式进行配置,以确保生成的主键能够被数据库正确识别和处理。
数据库连接配置和 MyBatis 一样,MyBatis-Plus 使用数据源来管理数据库连接。你需要配置数据源的相关信息,包括数据库 URL、用户名、密码等。数据源的配置通常在项目的配置文件中进行。
表和实体类映射MyBatis-Plus 通过注解 来指定实体类对应的数据库表名,而通过 注解来指定数据库字段与实体类属性的映射关系。确保实体类和数据库表之间的映射关系正确,以避免出现数据操作的错误。@TableName@TableField

?????????总的来说,MyBatis-Plus 并没有对数据库的使用提出过多的特殊要求。你可以根据自己项目的实际情况选择合适的数据库,并按照 MyBatis 和 MyBatis-Plus 的配置规范进行配置,就能够顺利地进行数据库操作。

二、SpringBoot集成Mybatis-Plus

1. pom依赖导入

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yx</groupId>
    <artifactId>Mybatis-Plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Mybatis-Plus</name>
    <description>Mybatis-Plus</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
<!--        导入Mybatis-Plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--     导入mybatis-plus生成器的依赖   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--        数据库依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.yx.mybatisplus.MybatisPlusApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2. yml文件配置

application.yml

spring:
#  数据库连接
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
    url: jdcb:mysql://localhost:3306/bookshop
mybatis-plus:
#  类别名
    type-aliases-package: com.yx.mybatisplus.pojo
    configuration:
#      是否启用驼峰命名
      map-underscore-to-camel-case: true
logging:
  level:
    com.yx.mybatisplus.mapper: debug

3. 生成Mybatis生成类

? ? ? ? 我们可以官网上去查找到生成器,但是官网的生成器并不是最完整的,因此我在下面放了我自己整合的生成器,较为完整。生成器的一些配置需要根据自身的项目信息就行修改。

?MySQLGenerator.java

package com.yx.mybatisplus.config;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Slf4j
public class MySQLGenerator {

    private final static String URL = "jdbc:mysql://localhost:3306/bookshop";
    private final static String USERNAME = "root";
    private final static String PASSWORD = "123456";

    private final static DataSourceConfig.Builder DATA_SOURCE_CONFIG =
            new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);

    public static void main(String[] args) {
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                .globalConfig(
                        (scanner, builder) ->
                                builder.author(scanner.apply("请输入作者名称?"))
                                        .outputDir(System.getProperty("user.dir") + "\\src\\main\\java")
                                        .commentDate("yyyy-MM-dd")
                                        .dateType(DateType.TIME_PACK)
                )
                .packageConfig((builder) ->
                        builder.parent("com.yx.mybatisplus")
                                .entity("pojo")
                                .service("service")
                                .serviceImpl("service.impl")
                                .mapper("mapper")
                                .xml("mapper.xml")
                                .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))
                )
                .injectionConfig((builder) ->
                        builder.beforeOutputFile(
                                (a, b) -> log.warn("tableInfo: " + a.getEntityName())
                        )
                )
                .strategyConfig((scanner, builder) ->
                        builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                                .addTablePrefix("tb_", "t_", "lay_", "meeting_", "sys_")
                                .entityBuilder()
                                .enableChainModel()
                                .enableLombok()
                                .enableTableFieldAnnotation()
                                .controllerBuilder()
                                .enableRestStyle()
                                .enableHyphenStyle()
                                .build()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

}

4. 生成代码

? ? ? ? 当我们对其配置根据我们的项目信息就行了修改之后,我们就可以运行生成器类进行生成代码。?

?

? ? ? ? ?由下面动图可以得知BookMapper.xml、BookMapper、Service层和Controller层都没有代码,其中BookMapper.xml、BookMapper、Service层都是Mybatis-Plus自带了方法代码,其中只要我们在Controller层编写请求代码即可。我们要记得在一些类上打上注解。

? ? ? ? ?注意事项:在启动类上记得添加mapper扫描类注解

5. 初步测试

? ? ? ? 我们在controller层编写一个查询的请求,在网页进行访问查看是否显示数据。

? ? ? ? ?我们在网页访问查看方法的请求路径即可

?

三、延伸

1. 第三方测试工具使用

? ? ? ? 在我们的一些请求方法中它发送的有时不一定是post请求,有get、del、put等等请求类型,因此我们要借助第三方工具进行测试,因为子啊网页测试路径不会显示。推荐使用Apifox

官网:

? ? ? ? 可以使用网页版也可以使用应用版

Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。

? ? ? ? ?我们接下来编写一个新增的请求,使用第三方工具进行测试

? ? ? ? 对应的数据我们可以去数据库进行查看?

2.? 主键生成策略

2.1 介绍

????????主键生成策略是关系型数据库中用于生成主键值的一种机制。每个数据库表都需要一个主键,它唯一标识表中的每一行数据。当你向表中插入新记录时,需要为主键字段生成一个唯一的值。

常见的主键策略包括以下:

  1. 自增(Auto-increment): 数据库系统会自动为主键字段分配一个唯一的递增值。在MySQL中,通常使用关键字来定义自增主键。AUTO_INCREMENT

  2. 序列(Sequence): 一些数据库系统提供了序列对象,允许你预先定义一组唯一的数字,并在插入记录时使用这些数字。在Oracle数据库中,通常使用序列生成主键值。

  3. UUID(Universally Unique Identifier): 使用UUID算法生成全局唯一的标识符。UUID主键不依赖于数据库的实现,通常以字符串形式存储。

  4. 雪花算法(Snowflake): 通过使用分布式ID生成算法,生成具有一定唯一性和有序性的主键。这对于分布式系统中生成唯一标识符很有用。

实例:

2.2 注解介绍

????????@TableId主键注解,放置于实体类中的主键字段上。

?

  • @TableId注解属性

属性类型必须指定默认值描述
valueString""主键字段名
typeEnumIdType.NONE指定主键类型

@TableId注解type属性IdType主键生成策略介绍:

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert 前自行 set 主键值
ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

? ? ? ? ?其中如果使用的是AUTO属性时,当你在新增数据时携带了id属性及值,他将不会自增,而是将id赋予你输入的值

雪花算法自动生成

? ? ? ? ?我们有时会使用id随机生成,这时我们就会使用雪花id,因为自带的可能效果不是很好,因此推荐使用网上的。下面是我推荐的一个雪花id。

网址:多语言新雪花算法(SnowFlake IdGenerator): 💎迄今为止最全面的分布式主键ID生成器。 💎优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 💎原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用动态库(FFI)。💎支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。 (gitee.com)

? ? ? ? ?引入依赖,修改数据类型为bigint,实体对象的id类型改为Long。

?

? ? ? ? 最后我们进行测试?

?2.3 自动填充

@TableField字段注解(非主键),其中fill字段自动填充策略,具体策略如下:

描述
DEFAULT默认不处理
INSERT插入时填充字段
UPDATE更新时填充字段
INSERT_UPDATE插入和更新时填充字段

????????注解则是指定该属性在对应情况下必有值,如果无值则入库会是null

? ? ? ? 自动填充需要借助自定义实现类完成

MyMetaObjectHandler.java

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始新增操作自动填充 ....");
        this.strictInsertFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新操作自动填充 ....");
        this.strictUpdateFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());
    }
}
使用情景

情况一:fill = FieldFill.DEFAULT,无论是新增和更新都不进行自动填充;

情况二:fill = FieldFill.INSERT,执行新增操作自动填充数据;

情况三:fill = FieldFill.UPDATE,执行更新操作,若字段不为空则自动填充数据;再次执行更新操作不会刷新数据

案例演示:

? ? ? ? 首先在自定义实现类中指定指定的字段,在不同的情况下填充指定内容

? ? ? ? 编写对应的请求方法?

?实体对象的指定字段标记使用实现类

测试结果?

新增

修改?


🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路?!🎁

文章来源:https://blog.csdn.net/weixin_74352229/article/details/135016115
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。