SpringBoot3快速整合MyBatisPlus的示例代碼
一、前言
MyBatis 最佳搭檔,只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。 這個(gè)發(fā)展到目前階段已經(jīng)很成熟了,社區(qū)也比較活躍,可以放心使用。官網(wǎng)地址:https://baomidou.com
二、快速開始
引入依賴
這里我引入了核心 starter 依賴,以及官方提供的代碼生成器依賴,如果你不用代碼生成器可以不引用
<properties>
<mybatis-plus.version>3.5.7</mybatis-plus.version> <!-- mybatis增強(qiáng) orm 框架 -->
</properties>
<dependencies>
<!-- mybatis-plus 相關(guān)依賴 -->
<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>
配置數(shù)據(jù)庫連接
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
這樣整合就完成了,接下來就可以編寫我們的業(yè)務(wù)代碼了。
三、業(yè)務(wù)開發(fā)
使用 mybatis-plus 的基本開發(fā)流程一般是這樣的,他和一些全自動(dòng)的 ORM 框架還是有點(diǎn)區(qū)別的,比如 SpringDataJPA 或者 Hibernate 并不能根據(jù)實(shí)體對(duì)象自動(dòng)執(zhí)行 ddl 創(chuàng)建表結(jié)構(gòu)(現(xiàn)在可以通過插件做到,這里我們不深究),一般都是通過先有表,再有實(shí)體對(duì)象
通常是:
創(chuàng)建數(shù)據(jù)表 -> 代碼生成器生成基礎(chǔ)類 -> 在這個(gè)基礎(chǔ)上開發(fā)業(yè)務(wù)代碼
當(dāng)然你可以在代碼生成器階段盡可能的抽象出相似的地方,甚至可以生成簡單的 CRUD 代碼,市面上有很多案例可供參考,若依,eladmin 等等。這里我只介紹基礎(chǔ)的 entity、mapper、service 生成。
3.1 創(chuàng)建數(shù)據(jù)表
這里我就不列舉了,根據(jù)你自己業(yè)務(wù)來。
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<>("");
// 獲取當(dāng)前路徑
String path = System.getProperty("user.dir");
// &tinyInt1isBit=false
FastAutoGenerator.create(DB_URL, USERNAME, PASSWORD)
.globalConfig((scanner, builder) -> {
// 設(shè)置作者
builder.author("曹申陽")
.disableOpenDir()
.enableSpringdoc() // 如果想用swagger,生成 springdoc 規(guī)范注解 把這個(gè)放開
// 指定輸出目錄
.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("請(qǐng)輸入當(dāng)前父包模塊名稱:"));
builder.parent("com.yang.itshare") // 設(shè)置父包名
.moduleName(loadModulePackageName.get()) // 設(shè)置父包模塊名
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.controller("controller")
.entity("entity")
// 設(shè)置mapperXml生成路徑
.pathInfo(Collections.singletonMap(OutputFile.xml, path + "\\src\\main\\resources\\mapper\\" + loadModulePackageName.get()));
})
.strategyConfig((scanner, builder) -> {
// 設(shè)置需要生成的表名
builder.addInclude(getTables(scanner.apply("請(qǐng)輸入表名,多個(gè)英文逗號(hào)分隔?所有輸入 all")))
.addTablePrefix("itshare_") // 設(shè)置過濾表前綴
.entityBuilder() // 設(shè)置 entity 生成規(guī)則
.addTableFills(new Column("create_time", FieldFill.INSERT))
.addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
.logicDeleteColumnName("is_deleted")
.idType(IdType.AUTO)
.enableLombok()// lombok 注解
.controllerBuilder() // 設(shè)置 controller 生成規(guī)則
.enableRestStyle() // 開啟生成@RestController 控制器
.build();
}
)
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默認(rèn)的是Velocity引擎模板
.execute();
}
/**
* 處理 all 情況
*/
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
}
親測(cè)可用,注釋也很清楚,想要自己配置可以參考配置文件 https://baomidou.com/reference/new-code-generator-configuration/
運(yùn)行測(cè)試一下:我習(xí)慣將生成的放在 test 下,然后再復(fù)制到項(xiàng)目下,方便調(diào)試,如果你足夠自信,可以指定到想要的地方,一步到位。

這個(gè)時(shí)候還差最后一步,開啟 mapper 掃描,就可以正常使用了
@MapperScan("com.yang.itshare.*.mapper")
你可以加在啟動(dòng)類上,或者其它可以被掃描到的類上,我習(xí)慣加載 mybatis 的插件配置類上,后面會(huì)介紹。
四、常用插件功能
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映射文件 如果和默認(rèn)路徑一樣可以不配置
mapper-locations: classpath*:/mapper/**/*.xml
這里我把常用的也放出來了,日志打印,以及 xml 掃描,我一般就放默認(rèn)地址,這里不加也可以,防止大家想要修改位置,可以在這里配置路徑。
加邏輯刪除注解
如果你使用的是我上面的代碼生成器代碼,會(huì)自動(dòng)添加注解


否則,需要自己完成這一步。
之后在調(diào)用 mybatis-plus 封裝的查詢以及刪除操作時(shí),會(huì)默認(rèn)加上這個(gè)刪除的判斷,比如查詢會(huì)過濾掉以刪除的,刪除會(huì)變成修改這個(gè)刪除標(biāo)記的狀態(tài)值,并不會(huì)真正的刪除。注意,如果是使用自己編寫的 xml 將不會(huì)生效。
4.2 自動(dòng)填充字段
實(shí)現(xiàn) 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());
}
實(shí)體類上添加注解
如果你使用我上面的代碼生成器,會(huì)自動(dòng)添加,否則要自己指定


4.3 分頁插件和防止全表更新與刪除插件
創(chuàng)建配置類
@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); // 如果配置多個(gè)插件, 切記分頁最后添加
return interceptor;
}
}
我一般會(huì)在這里加上 mapper 的掃描,當(dāng)然你也可以加在啟動(dòng)類上
還有很多可用插件,大家根據(jù)需要引入即可 https://baomidou.com/plugins/
五、總結(jié)
這樣我們完成了基本的整合,已經(jīng)可以滿足我們前期的開發(fā)工作。至于一些高級(jí)功能,比如 多數(shù)據(jù)源支持,數(shù)據(jù)權(quán)限插件,等等。等我們需要的時(shí)候,可以自己查閱官方文檔進(jìn)行添加,官方文檔寫的很詳細(xì)。
到此這篇關(guān)于SpringBoot3快速整合MyBatisPlus的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot3整合MyBatisPlus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何利用return結(jié)束方法調(diào)用
這篇文章主要介紹了Java如何利用return結(jié)束方法調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程
今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識(shí),文章圍繞著Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Jmeter參數(shù)化獲取序列數(shù)據(jù)實(shí)現(xiàn)過程
這篇文章主要介紹了Jmeter參數(shù)化獲取序列數(shù)據(jù)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java中Lambda表達(dá)式和函數(shù)式接口的使用和特性
Java Lambda表達(dá)式是一種函數(shù)式編程的特性,可簡化匿名內(nèi)部類的寫法,與函數(shù)式接口搭配使用,實(shí)現(xiàn)代碼簡潔、可讀性高、易于維護(hù)的特點(diǎn),適用于集合操作、多線程編程等場(chǎng)景2023-04-04
關(guān)于mybatis if else if 條件判斷SQL片段表達(dá)式取值和拼接問題
這篇文章主要介紹了mybatis if else if 條件判斷SQL片段表達(dá)式取值和拼接,文章通過自己真實(shí)使用的例子給大家詳細(xì)介紹,需要的朋友可以參考下2021-09-09
springboot?vue測(cè)試平臺(tái)接口定義及發(fā)送請(qǐng)求功能實(shí)現(xiàn)
這篇文章主要為大家介紹了springboot+vue測(cè)試平臺(tái)接口定義及發(fā)送請(qǐng)求功能實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
zuulGateway 通過filter統(tǒng)一修改返回值的操作
這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10

