【MyBatis-Puls】入门快速搭建及案例、主键自动生成、自动填充的使用
一、引言
1、什么是MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis?的增强工具,在 MyBatis
的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了一些常用功能的增强,使得开发者可以更加便捷地进行数据库访问操作。
我们的愿景是成为
MyBatis
最好的搭档,就像魂斗罗中的1P
、2P
,基友搭配,效率翻倍。
2、特点
??Mybatis-Plus
简化了Mybatis
的开发流程,提高了开发效率。它提供了一些常用功能的增强,使得开发者无需编写繁琐的SQL语句,即可完成常见的数据库操作。同时,它也提供了一些附加功能,如条件构造器、自动分页、代码生成器等,进一步提升了开发效率和代码质量。
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
- 损耗小:启动即会自動注入基本CURD,性能基本无损耗,直接面向对象操作。
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
- 支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需再担心字段写错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器- Sequence),可自由配置,完美解决主键问题。
- 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
- 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用。
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
- 分页插件支持多种数据库:
-
MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift。
-
达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库。
-
- 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
- 内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可自定义拦截规则,预防误操作。
3、结构
- MyBatis-Plus内核:这是MyBatis-Plus的核心部分,它包括了对MyBatis的基础增强功能,例如简化CRUD操作、支持Lambda表达式等。
- 代码生成器:MyBatis-Plus提供了一个代码生成器,可以快速生成Mapper、Model、Service和Controller层的代码,大大提高了开发效率。
- 分页插件:MyBatis-Plus内置了一个分页插件,基于MyBatis的物理分页,可以让开发者无需关心具体的分页操作。
- 性能分析插件:MyBatis-Plus提供了一个性能分析插件,可以输出Sql语句以及其执行时间,帮助开发者快速找到慢查询。
- 全局拦截插件: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.Driver
url: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf8
username: root
password: 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方法和我们的Service的CRUD方法是不一样的。
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 { @Autowired private 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的注解。
@TableId
是MyBatis-Plus中用于标识表主键的注解。它用于指定实体类属性与数据库表主键字段的映射关系。
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
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 方法) |
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 { @Autowired private 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 { @Override public void insertFill(MetaObject metaObject) { log.info("开始新增操作自动填充 ...."); this.strictInsertFill(metaObject, "booktype", String.class, "玄幻"); } @Override public void updateFill(MetaObject metaObject) { log.info("开始更新操作自动填充 ...."); this.strictUpdateFill(metaObject, "booktype", String.class, "悬疑"); } }
如果我们没添加这个字段的数据,则它自己默认添加提前设置好的数据进去。
我的分享就到这里!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!