🎉🎉欢迎来到我的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的一些主要特性及功能:
主要特性及功能 | 说明 |
简化 CRUD 操作 | MyBatis-Plus 提供了一套简单而强大的 CRUD 操作方法,通过继承 接口,可以直接使用它提供的方法,无需手写 SQL 语句,减少了重复的代码。 |
条件构造器 | MyBatis-Plus 提供了灵活的条件构造器,可以方便地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加简便。 |
分页插件 | MyBatis-Plus 集成了分页插件,可以方便地进行分页查询。 |
主键生成策略 | MyBatis-Plus 支持多种主键生成策略,包括雪花算法、UUID、自增等,可以根据需求灵活配置。 |
自动填充 | MyBatis-Plus 支持自动填充功能,可以在插入或更新数据时自动填充指定字段的值。 |
3. 特点
MyBatis-Plus的特点包括:
- 无侵入:它在MyBatis的基础上进行增强,没有改变MyBatis的原有架构,因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。
- 依赖少:使用起来相对方便、快捷。
- 集MyBatis与Hibernate的优点于一身。
4. 结构
图示
MyBatis-Plus 的结构组成主要包括核心模块、插件模块以及代码生成器。下面是对这些组成部分的简要描述:
核心模块(Core Module):
- BaseMapper 接口: 定义了常用的 CRUD 操作,如 、、、 等,开发者可以通过继承该接口来获得这些基本的数据库操作方法,无需手动编写 SQL 语句。
insert
update
delete
select
- Wrapper 类: 提供了条件构造器,用于灵活地拼接查询条件,支持链式调用,使得动态 SQL 的构建更加方便。
插件模块(Plugin Module):
- 分页插件: 集成了分页插件,使得在进行分页查询时更加便捷。
- 逻辑删除插件: 支持逻辑删除的功能,通过注解和配置实现逻辑删除。
- 性能分析插件: 提供了性能分析的功能,可以输出 SQL 的执行时间等信息,方便开发者进行性能优化。
- 动态表名插件: 允许在运行时动态指定表名,适用于一些需要动态切换表的场景。
代码生成器(Code Generator):
- MyBatis-Plus 提供了一个代码生成器工具,可以根据数据库表自动生成对应的 Entity、Mapper 接口以及 Service 类,减少了开发者的重复劳动,提高了开发效率。
- 通过配置代码生成器,可以灵活地指定生成的代码结构和规范。
注解(Annotation):
- MyBatis-Plus 使用了一系列注解来辅助开发,如 用于指定数据库表名, 用于指定主键, 用于指定数据库字段与实体类属性的映射关系, 用于指定逻辑删除字段等。
@TableName
@TableId
@TableField
@TableLogic
配置项(Configuration):
- MyBatis-Plus 支持丰富的配置选项,通过配置文件或者注解,可以对其行为进行定制,包括主键策略、逻辑删除配置、自动填充配置等。
5. 数据库
MyBatis-Plus 作为 MyBatis 的增强工具库,对数据库的使用没有特殊的要求。它与 MyBatis 一样,可以与各种支持 JDBC 的关系型数据库集成,包括但不限于 MySQL、Oracle、SQL Server、PostgreSQL 等。
但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.Driverusername: rootpassword: 123456url: jdcb:mysql://localhost:3306/bookshop
mybatis-plus:
# 类别名type-aliases-package: com.yx.mybatisplus.pojoconfiguration:
# 是否启用驼峰命名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 介绍
主键生成策略是关系型数据库中用于生成主键值的一种机制。每个数据库表都需要一个主键,它唯一标识表中的每一行数据。当你向表中插入新记录时,需要为主键字段生成一个唯一的值。
常见的主键策略包括以下:
自增(Auto-increment): 数据库系统会自动为主键字段分配一个唯一的递增值。在MySQL中,通常使用关键字来定义自增主键。
AUTO_INCREMENT
序列(Sequence): 一些数据库系统提供了序列对象,允许你预先定义一组唯一的数字,并在插入记录时使用这些数字。在Oracle数据库中,通常使用序列生成主键值。
UUID(Universally Unique Identifier): 使用UUID算法生成全局唯一的标识符。UUID主键不依赖于数据库的实现,通常以字符串形式存储。
雪花算法(Snowflake): 通过使用分布式ID生成算法,生成具有一定唯一性和有序性的主键。这对于分布式系统中生成唯一标识符很有用。
实例:
2.2 注解介绍
@TableId
主键注解,放置于实体类中的主键字段上。
-
@TableId注解属性
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | "" | 主键字段名 |
type | Enum | 否 | IdType.NONE | 指定主键类型 |
@TableId注解type属性IdType
主键生成策略介绍:
值 | 描述 |
---|---|
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert 前自行 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 {@Overridepublic void insertFill(MetaObject metaObject) {log.info("开始新增操作自动填充 ....");this.strictInsertFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("开始更新操作自动填充 ....");this.strictUpdateFill(metaObject, "createdate", LocalDateTime.class, LocalDateTime.now());}
}
使用情景
情况一:fill = FieldFill.DEFAULT,无论是新增和更新都不进行自动填充;
情况二:fill = FieldFill.INSERT,执行新增操作自动填充数据;
情况三:fill = FieldFill.UPDATE,执行更新操作,若字段不为空则自动填充数据;再次执行更新操作不会刷新数据
案例演示:
首先在自定义实现类中指定指定的字段,在不同的情况下填充指定内容
编写对应的请求方法
实体对象的指定字段标记使用实现类
测试结果
新增
修改
🎉🎉本期的博客分享到此结束🎉🎉
📚📚各位老铁慢慢消化📚📚
🎯🎯下期博客博主会带来新货🎯🎯
🎁三连加关注,阅读不迷路 !🎁