SpringBoot3 + MyBatisPlus 快速整合

news2024/11/23 16:48:10

一、前言

MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。 这个发展到目前阶段已经很成熟了,社区也比较活跃,可以放心使用。官网地址:https://baomidou.com

二、快速开始

引入依赖

这里我引入了核心 starter 依赖,以及官方提供的代码生成器依赖,如果你不用代码生成器可以不引用

<properties>
  <mybatis-plus.version>3.5.7</mybatis-plus.version> <!-- mybatis增强 orm 框架 -->
</properties>

<dependencies>
  <!--   mybatis-plus 相关依赖   -->
  <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
      <version>${mybatis-plus.version}</version>
  </dependency>
  <!-- 代码生成器 -->
  <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>${mybatis-plus.version}</version>
  </dependency>
  <!--  mysql 依赖 版本由继承的 spring-boot-starter-parent 控制,也可以自己指定  -->
  <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
  </dependency>
</dependencies>

配置数据库连接

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/itshare-dev?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true
    username: root
    password: root

这样整合就完成了,接下来就可以编写我们的业务代码了。

三、业务开发

使用 mybatis-plus 的基本开发流程一般是这样的,他和一些全自动的 ORM 框架还是有点区别的,比如 SpringDataJPA 或者 Hibernate 并不能根据实体对象自动执行 ddl 创建表结构(现在可以通过插件做到,这里我们不深究),一般都是通过先有表,再有实体对象

通常是:

创建数据表 -> 代码生成器生成基础类 -> 在这个基础上开发业务代码

当然你可以在代码生成器阶段尽可能的抽象出相似的地方,甚至可以生成简单的 CRUD 代码,市面上有很多案例可供参考,若依,eladmin 等等。这里我只介绍基础的 entity、mapper、service 生成。

3.1 创建数据表

这里我就不列举了,根据你自己业务来。

3.2 代码生成器

引入依赖

<!-- 代码生成器 -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-generator</artifactId>
  <version>${mybatis-plus.version}</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
</dependency>

代码生成工具类

public class CodeGenerator {


    private static final String DB_URL = "jdbc:mysql://localhost:3306/itshare-dev?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    public static void main(String[] args) {

        AtomicReference<String> loadModulePackageName = new AtomicReference<>("");
        // 获取当前路径
        String path = System.getProperty("user.dir");
        // &tinyInt1isBit=false
        FastAutoGenerator.create(DB_URL, USERNAME, PASSWORD)
        .globalConfig((scanner, builder) -> {
            // 设置作者
            builder.author("曹申阳")
            .disableOpenDir()
            .enableSpringdoc() // 如果想用swagger,生成 springdoc 规范注解 把这个放开
            // 指定输出目录
            .outputDir(path + "\\src\\test\\java");
        })
        .dataSourceConfig(builder ->
                          builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                              if (JdbcType.TINYINT == metaInfo.getJdbcType()) {
                                  return DbColumnType.INTEGER;
                              }
                              return typeRegistry.getColumnType(metaInfo);
                          })
                         )
        .packageConfig((scanner, builder) -> {
            loadModulePackageName.set(scanner.apply("请输入当前父包模块名称:"));
            builder.parent("com.yang.itshare") // 设置父包名
            .moduleName(loadModulePackageName.get()) // 设置父包模块名
            .service("service")
            .serviceImpl("service.impl")
            .mapper("mapper")
            .controller("controller")
            .entity("entity")
            // 设置mapperXml生成路径
            .pathInfo(Collections.singletonMap(OutputFile.xml, path + "\\src\\main\\resources\\mapper\\" + loadModulePackageName.get()));
        })
        .strategyConfig((scanner, builder) -> {
            // 设置需要生成的表名
            builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
            .addTablePrefix("itshare_") // 设置过滤表前缀
            .entityBuilder() // 设置 entity 生成规则
            .addTableFills(new Column("create_time", FieldFill.INSERT))
            .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
            .logicDeleteColumnName("is_deleted")
            .idType(IdType.AUTO)
            .enableLombok()// lombok 注解
            .controllerBuilder() // 设置 controller 生成规则
            .enableRestStyle() // 开启生成@RestController 控制器
            .build();
        }
                       )
        .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
        .execute();
    }

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

}

亲测可用,注释也很清楚,想要自己配置可以参考配置文件 https://baomidou.com/reference/new-code-generator-configuration/

运行测试一下:我习惯将生成的放在 test 下,然后再复制到项目下,方便调试,如果你足够自信,可以指定到想要的地方,一步到位。

这个时候还差最后一步,开启 mapper 扫描,就可以正常使用了

@MapperScan("com.yang.itshare.*.mapper")

你可以加在启动类上,或者其它可以被扫描到的类上,我习惯加载 mybatis 的插件配置类上,后面会介绍。

四、常用插件功能

4.1 逻辑删除

配置全局逻辑删除属性

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: is_deleted # 全局逻辑删除字段名
      logic-delete-value: 1 # 逻辑已删除值
      logic-not-delete-value: 0 # 逻辑未删除值
  # 打印 sql 日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 配置mapper的扫描,找到所有的mapper.xml映射文件 如果和默认路径一样可以不配置
  mapper-locations: classpath*:/mapper/**/*.xml

这里我把常用的也放出来了,日志打印,以及 xml 扫描,我一般就放默认地址,这里不加也可以,防止大家想要修改位置,可以在这里配置路径。

加逻辑删除注解

如果你使用的是我上面的代码生成器代码,会自动添加注解

否则,需要自己完成这一步。

之后在调用 mybatis-plus 封装的查询以及删除操作时,会默认加上这个删除的判断,比如查询会过滤掉以删除的,删除会变成修改这个删除标记的状态值,并不会真正的删除。注意,如果是使用自己编写的 xml 将不会生效。

4.2 自动填充字段

实现 MetaObjectHandler

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

@Override
public void insertFill(MetaObject metaObject) {
    log.info("start insert fill ....");
    this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

@Override
public void updateFill(MetaObject metaObject) {
    log.info("start update fill ....");
    this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

实体类上添加注解

如果你使用我上面的代码生成器,会自动添加,否则要自己指定

4.3 分页插件和防止全表更新与删除插件

创建配置类

@Configuration
@MapperScan("com.yang.itshare.*.mapper")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防全表更新与删除插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(1000L);
        interceptor.addInnerInterceptor(paginationInnerInterceptor); // 如果配置多个插件, 切记分页最后添加
        return interceptor;
    }
}

我一般会在这里加上 mapper 的扫描,当然你也可以加在启动类上

还有很多可用插件,大家根据需要引入即可 https://baomidou.com/plugins/

五、总结

这样我们完成了基本的整合,已经可以满足我们前期的开发工作。至于一些高级功能,比如 多数据源支持,数据权限插件,等等。等我们需要的时候,可以自己查阅官方文档进行添加,官方文档写的很详细。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.Three.js程序基本框架结构和API说明

Three.js程序基本框架结构和API说明 1.基本框架结构代码 一个基本的Three.js程序&#xff0c;基本都需要设置场景、渲染器、相机、灯光等等通用操作&#xff0c;因而我们可以把Three.js基本程序框架进行整理&#xff0c;如下。其中&#xff0c;我们可以用Three.js提供的Orbit…

深度解析计数排序:原理、特性与应用

目录 &#x1f4af;引言 &#x1f4af;计数排序的原理 ⭐核心概念 ⭐工作流程 1.确定计数范围 2.统计元素出现次数 3.计算累计计数 4.放置元素到正确位置 &#x1f4af;计数排序的实现 ⭐代码示例&#xff08;以 C 为例&#xff09; ⭐时间复杂度分析 ⭐稳定性分析…

【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录 1 -> Jsoncpp 1.1 -> 特性 1.2 -> 安装 2 -> 序列化 3 -> 反序列化 4 -> Json::Value 1 -> Jsoncpp Jsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的&#xf…

CSS选择器及背景属性介绍

1.复合选择器 &#xff08;1&#xff09;后代选择器 &#xff08;2&#xff09;子代选择器 &#xff08;3&#xff09;并集选择器 &#xff08;4&#xff09;交集选择器 2.伪类选择器 即鼠标所悬停的内容变色 扩展&#xff1a;伪类选择器关于超链接 3.CSS三大特性 &#xff…

路由表来源(基于华为模拟器eNSP)

概叙 在交换网络中&#xff0c;若要实现不同网段之间的通信&#xff0c;需要依靠三层设备&#xff08;路由器、三层交换机等&#xff09;&#xff0c;而路由器只知道其直连网段的路由条目&#xff0c;对于非直连的网段&#xff0c;在默认情况下&#xff0c;路由器是不可达的&a…

心理咨询评估|基于springBoot的学生心理咨询评估系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信…

Metasploit渗透测试之社会工程学工具SET

概述 社会工程师工具包&#xff08;SET&#xff09;是一个开源渗透测试框架&#xff0c;专门设计用于对人为因素执行高级攻击&#xff0c;并迅速成为渗透测试人员武器库中的标准工具。SET是TrustedSec&#xff0c;LLC的产品&#xff0c;TrustedSec&#xff0c;LLC是一家位于俄…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

安装指定node.js 版本 精简版流程

首先 我们本机上是否安装有node 如果有 需要先卸载 卸载完成后 使用命令查看是否卸载干净 打开WinR 输入cmd 然后输入如下名: where node 如果没有目录显示 说明node 很干净 本机没有相关安装 在输入命令: where npm 如果有相关目录 需要删除掉 要不然 后续安装的…

阿里云数据库导出 | 数据管理(兼容数据库备份)

文章目录 1、数据库导出2、操作步骤3、DMS - Data Management Service 1、数据库导出 2、操作步骤 3、DMS - Data Management Service

MySQL 【日期】函数大全(五)

目录 1、QUARTER() 返回一个指定日期所在季度值。 2、SEC_TO_TIME() 将指定的秒数转为一个格式为 HH:MM:SS 的时间值。 3、SECOND() 提取并返回时间的秒部分。 4、STR_TO_DATE() 将指定的字符串根据指定日期格式转为日期/时间。 5、SUBDATE() 在指定的日期/时间上减去指定…

127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

一、板卡概述: FMC 高速 AD 模块 FL9627 为 4 路 125MSPS&#xff0c; 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片&#xff0c;每个 AD9627 芯片支持 2 路 AD 输入转换&#xff0c;所以 2 片 AD9627 芯片一共支持 4 路的 AD 输入…

FLORR.IO回顾

No.1 subulaxi No.2 qwert 2青加全红 我将在2024.11.1退游!

Wails 学习笔记:Wails核心思想理解

文章目录 1. Wails 的核心思想2. 工作流程2.1 前端渲染2.2 后端逻辑2.3 前后端通信2.4 应用打包与分发 3. Wails 主要组件3.1 WebView3.2 事件与数据绑定3.3 窗口管理 4. Wails 的优点5. Wails 的使用场景6. 启动函数Runwails.Run() 的主要功能wails.Run() 的参数&#xff1a;w…

MySQL8.0.28解压版安装windows

1.下载 https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-winx64.zip 2.文档 MySQL :: MySQL 8.0 Reference Manual :: 2.3.4 Installing MySQL on Microsoft Windows Using a noinstall ZIP Archive 3.创建配置文件my.ini。默认解压文件中没有 内容如下&#xff…

【LangChain系列1】【LangChain表达式 (LCEL)】

目录 前言一、LangChain1-1、介绍1-2、LangChain抽象出来的核心模块1-3、特点1-4、langchain解决的一些行业痛点1-5、安装 二、LangChain表达式——LCEL2-1、LCEL介绍2-2、基本示例&#xff1a;提示 模型 输出解析器2-3、接口 附录、ZhiPuAI API0、安装1、设置API密钥2、基本…

无法获得下列许可 SolidWorks standard。无法连接到服务器(-15,10,10061)

太久没启动SolidWorks&#xff0c;今天想打开&#xff0c;结果给我报错&#xff0c;如下图所示&#xff1a; 看网上说是开机启动项被杀毒软件给关了&#xff0c;于是打开360&#xff0c;看了一下&#xff0c;果然&#xff1a; 还有好几个和SolidWorks相关的项目&#xff0c;这里…

WebRTC音频 04 - 关键类

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架 WebRTC音频 04 - 关键类(本文) 一、前言&#xff1a; 在WebRTC音频代码阅读过程中&#xff0c;我们发现有很多关键的类比较抽象&#xff0c;搞不清楚会导致代码阅读一脸懵逼。比如…

吴恩达深度学习笔记(5)

调试处理&#xff08;随机采样、非格网、由粗到细&#xff09;及超参数 深度学习中涉及大量超参数&#xff0c;如下所示 在不知道哪个参数更为重要的情况下&#xff0c;机器学习参数较少&#xff0c;可以利用网络化的参数取值试验&#xff0c;但是深度学习参数较多的情况下&am…