SpringBoot3快速整合MyBatisPlus的示例代碼
一、前言
MyBatis 最佳搭檔,只做增強不做改變,為簡化開發(fā)、提高效率而生。 這個發(fā)展到目前階段已經(jīng)很成熟了,社區(qū)也比較活躍,可以放心使用。官網(wǎng)地址:https://baomidou.com
二、快速開始
引入依賴
這里我引入了核心 starter 依賴,以及官方提供的代碼生成器依賴,如果你不用代碼生成器可以不引用
<properties> <mybatis-plus.version>3.5.7</mybatis-plus.version> <!-- mybatis增強 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ā)流程一般是這樣的,他和一些全自動的 ORM 框架還是有點區(qū)別的,比如 SpringDataJPA 或者 Hibernate 并不能根據(jù)實體對象自動執(zhí)行 ddl 創(chuàng)建表結(jié)構(gòu)(現(xiàn)在可以通過插件做到,這里我們不深究),一般都是通過先有表,再有實體對象
通常是:
創(chuàng)建數(shù)據(jù)表 -> 代碼生成器生成基礎(chǔ)類 -> 在這個基礎(chǔ)上開發(fā)業(yè)務(wù)代碼
當然你可以在代碼生成器階段盡可能的抽象出相似的地方,甚至可以生成簡單的 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<>(""); // 獲取當前路徑 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ī)范注解 把這個放開 // 指定輸出目錄 .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") // 設(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("請輸入表名,多個英文逗號分隔?所有輸入 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引擎模板,默認的是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/
運行測試一下:我習(xí)慣將生成的放在 test 下,然后再復(fù)制到項目下,方便調(diào)試,如果你足夠自信,可以指定到想要的地方,一步到位。
這個時候還差最后一步,開啟 mapper 掃描,就可以正常使用了
@MapperScan("com.yang.itshare.*.mapper")
你可以加在啟動類上,或者其它可以被掃描到的類上,我習(xí)慣加載 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 掃描,我一般就放默認地址,這里不加也可以,防止大家想要修改位置,可以在這里配置路徑。
加邏輯刪除注解
如果你使用的是我上面的代碼生成器代碼,會自動添加注解
否則,需要自己完成這一步。
之后在調(diào)用 mybatis-plus 封裝的查詢以及刪除操作時,會默認加上這個刪除的判斷,比如查詢會過濾掉以刪除的,刪除會變成修改這個刪除標記的狀態(tài)值,并不會真正的刪除。注意,如果是使用自己編寫的 xml 將不會生效。
4.2 自動填充字段
實現(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()); }
實體類上添加注解
如果你使用我上面的代碼生成器,會自動添加,否則要自己指定
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); // 如果配置多個插件, 切記分頁最后添加 return interceptor; } }
我一般會在這里加上 mapper 的掃描,當然你也可以加在啟動類上
還有很多可用插件,大家根據(jù)需要引入即可 https://baomidou.com/plugins/
五、總結(jié)
這樣我們完成了基本的整合,已經(jīng)可以滿足我們前期的開發(fā)工作。至于一些高級功能,比如 多數(shù)據(jù)源支持,數(shù)據(jù)權(quán)限插件,等等。等我們需要的時候,可以自己查閱官方文檔進行添加,官方文檔寫的很詳細。
到此這篇關(guān)于SpringBoot3快速整合MyBatisPlus的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot3整合MyBatisPlus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何利用return結(jié)束方法調(diào)用
這篇文章主要介紹了Java如何利用return結(jié)束方法調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程
今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識,文章圍繞著Springboot連接數(shù)據(jù)庫及查詢數(shù)據(jù)完整流程展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06Jmeter參數(shù)化獲取序列數(shù)據(jù)實現(xiàn)過程
這篇文章主要介紹了Jmeter參數(shù)化獲取序列數(shù)據(jù)實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07Java中Lambda表達式和函數(shù)式接口的使用和特性
Java Lambda表達式是一種函數(shù)式編程的特性,可簡化匿名內(nèi)部類的寫法,與函數(shù)式接口搭配使用,實現(xiàn)代碼簡潔、可讀性高、易于維護的特點,適用于集合操作、多線程編程等場景2023-04-04關(guān)于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題
這篇文章主要介紹了mybatis if else if 條件判斷SQL片段表達式取值和拼接,文章通過自己真實使用的例子給大家詳細介紹,需要的朋友可以參考下2021-09-09springboot?vue測試平臺接口定義及發(fā)送請求功能實現(xiàn)
這篇文章主要為大家介紹了springboot+vue測試平臺接口定義及發(fā)送請求功能實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05zuulGateway 通過filter統(tǒng)一修改返回值的操作
這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10