【MyBatis-Puls】入门快速搭建及案例、主键自动生成、自动填充的使用

本文主要是介绍【MyBatis-Puls】入门快速搭建及案例、主键自动生成、自动填充的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

1、什么是MyBatis-Plus

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

我们的愿景是成为MyBatis最好的搭档,就像魂斗罗中的 1P2P,基友搭配,效率翻倍。

2、特点

  Mybatis-Plus简化了Mybatis的开发流程,提高了开发效率。它提供了一些常用功能的增强,使得开发者无需编写繁琐的SQL语句,即可完成常见的数据库操作。同时,它也提供了一些附加功能,如条件构造器、自动分页、代码生成器等,进一步提升了开发效率和代码质量。

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
  2. 损耗小:启动即会自動注入基本CURD,性能基本无损耗,直接面向对象操作。
  3. 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
  4. 支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需再担心字段写错。
  5. 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器- Sequence),可自由配置,完美解决主键问题。
  6. 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
  7. 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
  8. 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用。
  9. 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
  10. 分页插件支持多种数据库
    1. MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift。

    2. 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库。

  11. 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
  12. 内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可自定义拦截规则,预防误操作。

3、结构

  1. MyBatis-Plus内核:这是MyBatis-Plus的核心部分,它包括了对MyBatis的基础增强功能,例如简化CRUD操作、支持Lambda表达式等。
  2. 代码生成器:MyBatis-Plus提供了一个代码生成器,可以快速生成Mapper、Model、Service和Controller层的代码,大大提高了开发效率。
  3. 分页插件:MyBatis-Plus内置了一个分页插件,基于MyBatis的物理分页,可以让开发者无需关心具体的分页操作。
  4. 性能分析插件:MyBatis-Plus提供了一个性能分析插件,可以输出Sql语句以及其执行时间,帮助开发者快速找到慢查询。
  5. 全局拦截插件:MyBatis-Plus提供了一个全局拦截插件,可以对全表delete、update操作进行智能分析并阻断,预防误操作。

二、MyBatis-Puls快速搭建

使用Spring Initializer快速初始化一个 Spring Boot 工程(工程将以 MySQL 作为默认数据库)

1、导入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></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><!--导入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><!--    引入freemarker    --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency></dependencies>

2、配置

application.yml 配置文件中添加 MySQL 数据库的相关配置。

server:port: 8080
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456
mybatis-plus:# Mybatis Mapper所对应的XML位置mapper-locations: classpath:mapper/*.xml# 别名包扫描路径 实体类type-aliases-package: com.wfzl.demopuls.model# 是否开启自动驼峰命名规则(camel case)映射configuration:map-underscore-to-camel-case: true
logging:level:com.wfzl.demopuls.mapper: debug

需要注意的地方

3、代码生成

导入我们的代码生成类MySQLGenerator.java

package com.wfzl.demopuls.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("请输入作者名称?"))builder.author("wfzldr")
//                                        指定输出目录 System.getProperty("user.dir"):当前用户的项目名.outputDir(System.getProperty("user.dir") + "\\src\\main\\java").commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK))
//                包配置.packageConfig((builder) ->
//                        对应的项目名路径builder.parent("com.wfzl.demopuls")
//                                        实体类.entity("model").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")))
//                                如果要生成这个数据库所有的表填写:all 即可builder.addInclude(getTables("sys_user_post"))//                                过滤表前缀.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、注意

Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

Mapper类里面添加@Repository注解。

以上添加成功才能运行你的Controller层。

三、综合案例

在我们的Controller 层编写我们的方法。

我们的Mapper层的CRUD方法和我们的ServiceCRUD方法是不一样的。

package com.wfzl.demopuls.controller;import com.github.yitter.idgen.YitIdHelper;
import com.wfzl.demopuls.model.Book;
import com.wfzl.demopuls.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** <p>* 前端控制器* </p>** @author wfzldr* @since 2023-12-15*/
@RestController
@RequestMapping("/book")
public class BookController {@Autowiredprivate IBookService bookService;@RequestMapping("/list")public Object list() {return bookService.list();}@RequestMapping("/save")public Object save(Book book) {return bookService.save(book);}@RequestMapping("/edit")public Object edit(Book book) {return bookService.updateById(book);}@RequestMapping("/del")public Object del(Book book) {return bookService.removeById(book);}}

四、主键生成策略

1、@TableId注解属性

在我们的实体类上有一个@TableId的注解。

@TableIdMyBatis-Plus中用于标识表主键的注解。它用于指定实体类属性与数据库表主键字段的映射关系。

属性类型必须指定默认值描述
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 方法)

2、雪花ID的使用

①导依赖

        <dependency><groupId>com.github.yitter</groupId><artifactId>yitter-idgenerator</artifactId><version>1.0.6</version></dependency>

②使用

在我们的Controller层的增加的方法里面添加我们的雪花ID。

我们在调用的时候需要在实体里面的这个属性改成Long类型,我们的数据库也是Long类型,比如我们的MySQL就是要改成bigint类型

import com.github.yitter.idgen.YitIdHelper;
import com.wfzl.demopuls.model.Book;
import com.wfzl.demopuls.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** <p>* 前端控制器* </p>** @author wfzldr* @since 2023-12-15*/
@RestController
@RequestMapping("/book")
public class BookController {@Autowiredprivate IBookService bookService;@RequestMapping("/save")public Object save(Book book) {
//         YitIdHelper.nextId(); 雪花id  需实体改long类型book.setId(YitIdHelper.nextId());return bookService.save(book);}}

在测试结果可以看到我们的ID已经增加进去了。

五.自动填充

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

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

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

添加我们的自定义实现类。

  • 参数二:你的字段名
  • 参数三:你字段的数据类型
  • 参数四:你要自动添加的数据
package com.wfzl.demopuls.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("开始新增操作自动填充 ....");this.strictInsertFill(metaObject, "booktype", String.class, "玄幻");}@Overridepublic void updateFill(MetaObject metaObject) {log.info("开始更新操作自动填充 ....");this.strictUpdateFill(metaObject, "booktype", String.class, "悬疑");}
}

如果我们没添加这个字段的数据,则它自己默认添加提前设置好的数据进去。

我的分享就到这里!

这篇关于【MyBatis-Puls】入门快速搭建及案例、主键自动生成、自动填充的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/500918

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat