南京酒店網(wǎng)站制作新聞頭條
文章目錄
- 概述
- 介紹
- MyBatis-Plus 常用配置
- 分頁插件配置類
- 注解配置
- 快速入門
- maven 依賴
- 編寫配置文件
- 編寫啟動類
- 編寫 MybatisPlus 配置類
- 代碼生成器:MybatisPlusGenerator
- maven依賴
- 代碼生成器核心類
概述
介紹
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生。
主頁: 傳送門
引入 MyBatis-Plus
之后請不要再次引入 MyBatis
以及 MyBatis-Spring
,以避免因版本差異導致的問題。
特性:
- 無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/li>
- 強大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支持 Lambda 形式調(diào)用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
- 支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數(shù)據(jù)庫
- 支持主鍵自動生成:支持多達 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支持 XML 熱加載:Mapper 對應的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持關鍵詞自動轉(zhuǎn)義:支持數(shù)據(jù)庫關鍵詞(order、key…)自動轉(zhuǎn)義,還可自定義關鍵詞
- 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
- 內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
- 內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
- 內(nèi)置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預防誤操作
- 內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊
MyBatis-Plus 常用配置
MyBatis-Plus 的配置可以通過 application.properties
或 application.yml
文件進行。以下是一些常用的配置選項及其說明。
mybatis-plus:# 指定MyBatis-Plus映射文件的位置mapper-locations: classpath:mapper/*.xml# 指定MyBatis-Plus映射文件的位置。遞歸查找所有子目錄中符合.xml格式的文件#mapper-locations: "classpath*:/mapper/**/*.xml"# 指定實體類的包路徑,自動掃描并注冊別名type-aliases-package: com.example.yourproject.entity# 全局配置。用于設置MyBatis-Plus的一些整體行為global-config:db-config:# 主鍵生成策略。默認auto。可選值有auto(自動增長)、none(無)、input(手動輸入)、id_worker(雪花算法)、uuid等id-type: auto# 表前綴,用于生成 SQL 時自動去掉前綴table-prefix: t_# 配置邏輯刪除字段(如果使用了邏輯刪除功能)logic-delete-field: deleted# 邏輯刪除字段的值,表示已刪除logic-delete-value: 1# 邏輯刪除字段的值,表示未刪除logic-not-delete-value: 0# 字段策略,可選值有 not_null(非空插入)、not_empty(非空插入)、ignore(忽略)等field-strategy: not_empty# 是否開啟大寫模式,生成的 SQL 字段名將全部大寫capital-mode: true# 是否刷新緩存,默認為 truerefresh: true# 分頁配置。用于啟用分頁功能pagination:# 每頁大小。默認10page-size: 10# 是否統(tǒng)計總記錄數(shù)。默認truetotal: true# 是否合理化分頁,當分頁參數(shù)不合理時,自動調(diào)整。默認falsereasonable: true# 是否支持方法參數(shù)作為分頁參數(shù)。默認falsesupport-methods-arguments: true# 分頁參數(shù)名,可以自定義params: null# 配置。用于configuration:# 開啟下劃線轉(zhuǎn)駝峰命名規(guī)則。默認truemap-underscore-to-camel-case: true# 設置MyBatis-Plus的日志輸出。日志實現(xiàn)類,org...logging.stdout.StdOutImpl (控制臺輸出)或其他日志實現(xiàn)類log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
注:
-
mybatis-plus.mapper-locations
:指定MyBatis-Plus映射文件的位置。若不指定,MyBatis-Plus 會嘗試從
resources/mapper/
目錄下加載 XML 文件(這是 Spring Boot 和 MyBatis 的默認行為) -
type-aliases-package
:指定實體類的包路徑,自動掃描并注冊別名。如果實體類名與數(shù)據(jù)庫表名一致,或者已經(jīng)通過@TableName 注解指定了正確的表名,則該配置可以缺省
該配置缺省時,MyBatis-Plus會自動識別實體類并映射到相應的數(shù)據(jù)庫表,但在 XML 中引用實體類時需要使用全限定名
分頁插件配置類
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {/*** 分頁插件* 注:3.5.9版本,MyBatis-Plus 對分頁插件做了拆分,需要單獨引用mybatis-plus-jsqlparser依賴以支持PaginationInnerInterceptor類*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
注解配置
-
@MapperScan:用于掃描 Mapper 接口,并將這些接口注冊為 Spring 容器中的 Bean
-
注解位置:通常放在 Spring Boot 應用的主類上,或者放在配置類上
-
支持通配符:支持使用通配符
*
來匹配一級包路徑,如果需要匹配多級包路徑,可以使用**
來代替 -
屬性:
-
value 或 basePackages:指定需要掃描的包路徑。可以是一個或多個包路徑,用逗號分隔。
-
markerInterface:指定一個標記接口,只有實現(xiàn)了該接口的 Mapper 接口才會被掃描。
這個參數(shù)可以用于更細粒度地控制掃描范圍。
-
sqlSessionFactoryRef:指定 SQL 會話工廠的引用名稱。
-
這個參數(shù)通常用于多數(shù)據(jù)源配置時,指定不同數(shù)據(jù)源對應的 SQL 會話工廠。
-
-
注意:
- 包路徑的正確性:在使用
@MapperScan
注解時,需要確保指定的包路徑是正確的,并且包含了所有需要掃描的 Mapper 接口。 - 避免重復掃描:如果項目中已經(jīng)通過其他方式(如
@Mapper
注解)將 Mapper 接口注冊為 Bean,那么在使用@MapperScan
注解時,需要避免重復掃描這些接口,否則可能會導致 Bean 沖突或性能問題。 - 多數(shù)據(jù)源配置:在配置多數(shù)據(jù)源時,需要注意
sqlSessionFactoryRef
參數(shù)的使用,以確保不同數(shù)據(jù)源對應的 Mapper 接口能夠正確注冊和使用。
- 包路徑的正確性:在使用
-
-
@TableName:指定實體類對應的數(shù)據(jù)庫表名
-
說明:如果實體類的名稱與數(shù)據(jù)庫表名在命名上保持一致(即遵循駝峰轉(zhuǎn)下劃線的命名規(guī)則),則此注解不是必需的。但如果命名不一致,則需要使用此注解來明確指定表名。
-
示例:
@TableName("user") public class User {// 實體類屬性 }
-
-
@TableId:指定實體類中的主鍵字段
-
說明:如果實體類中有一個名為
id
的字段,并且希望它作為主鍵,則此注解不是必需的,因為 MyBatis-Plus 默認會將名為id
的字段作為主鍵。但如果主鍵字段的名稱不是id
,或者需要指定主鍵的生成策略(如自增、UUID等),則需要使用此注解。 -
屬性:
value
:字段名。type
:主鍵類型??蛇x值有IdType.AUTO
(自增)、IdType.NONE
(無主鍵)、IdType.ASSIGN_ID
(全局唯一ID)、IdType.ASSIGN_UUID
(全局唯一UUID)等。
-
示例:
@TableId(value = "id", type = IdType.AUTO) private Long id;
-
-
@TableField:指定實體類中的普通字段與數(shù)據(jù)庫表字段之間的映射關系
-
說明:如果實體類的字段名與數(shù)據(jù)庫表的字段名在命名上保持一致(即遵循駝峰轉(zhuǎn)下劃線的命名規(guī)則),則此注解不是必需的。但如果字段名不一致,或者字段名與數(shù)據(jù)庫的關鍵字沖突,或者需要處理成員變量以
is
開頭且是布爾值的情況,則需要使用此注解。 -
屬性:
-
value
:字段名。 -
exist
:字段是否存在,默認為true
。如果實體類中有一些字段不需要映射到數(shù)據(jù)庫表中,則可以設置為
false
-
fill
:字段填充策略,可選值有FieldFill.INSERT
(插入時填充)、FieldFill.UPDATE
(更新時填充)等。
-
-
示例:
@TableField(value = "name", fill = FieldFill.INSERT) private String name;
-
-
@TableLogic:指定邏輯刪除字段
-
屬性:
value
:字段名。delval
:刪除標記值。undelval
:未刪除標記值。
-
示例:
@TableLogic(value = "0", delval = "1") private Integer deleted;
-
是否必需:如果需要使用邏輯刪除功能,則必須使用此注解。
-
-
@Version:指定樂觀鎖字段
-
示例:
@Version private Integer version;
-
是否必需:如果需要使用樂觀鎖功能,則必須使用此注解。
@KeySequence:指定 Oracle 數(shù)據(jù)庫的序列
-
屬性:
value
:序列名。
-
示例:
@TableId(type = IdType.SEQUENCE, value = "user_seq") private Long id;
-
是否必需:如果使用 Oracle 數(shù)據(jù)庫的序列生成主鍵,則必須使用此注解。
@Transient:指定不持久化的字段
-
示例:
@Transient private String tempField;
-
是否必需:如果實體類中有一些臨時字段不需要持久化到數(shù)據(jù)庫,則可以使用此注解。
-
快速入門
maven 依賴
<!-- MyBatis-plus啟動器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.9</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></exclusion></exclusions>
</dependency>
<!--引入較新的mybatis-spring,支持springboot3-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version>
</dependency>
<!--3.5.9版本,MyBatis-Plus 對分頁插件做了拆分,需要單獨引用依賴。jdk8引入mybatis-plus-jsqlparser-4.9 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser</artifactId><version>3.5.9</version>
</dependency><!-- MyBatis-plus-generator 代碼生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.9</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
編寫配置文件
application.yml
spring:application:name: plus-testdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///mytest?characterEncoding=UTF-8username: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource# myBatis-plus
mybatis-plus:# 指定MyBatis-Plus映射文件的位置mapper-locations: classpath*:mapper/*.xml# 指定實體類的包路徑,自動掃描并注冊別名type-aliases-package: com.example.entityconfiguration:# 設置MyBatis-Plus的日志輸出。日志實現(xiàn)類,org...logging.stdout.StdOutImpl (控制臺輸出)或其他日志實現(xiàn)類log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
編寫啟動類
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.**.mapper")
public class SpringBootRunner {public static void main(String[] args) {SpringApplication.run(SpringBootRunner.class,args);}
}
編寫 MybatisPlus 配置類
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {/*** 分頁插件* 注:3.5.9版本,MyBatis-Plus 對分頁插件做了拆分,需要單獨引用mybatis-plus-jsqlparser依賴以支持PaginationInnerInterceptor類*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
代碼生成器:MybatisPlusGenerator
maven依賴
<!-- MyBatis-plus-generator 代碼生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
代碼生成器核心類
示例是將代碼生成器集成到 Spring 環(huán)境中,部分配置參數(shù)放到了配置文件中。
-
核心類
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.stereotype.Component;import java.util.Arrays; import java.util.Collections;/*** MyBatis-Plus代碼生成器*/ @Component public class MybatisPlusGeneratorRunner {@Autowiredprivate DataSourceProperties dbProp;@Autowiredprivate MybatisPlusGeneratorProperties generatorProp;@PostConstructpublic void run() {execute();}private void execute() {FastAutoGenerator// 數(shù)據(jù)庫配置.create(dbProp.getUrl(), dbProp.getUsername(), dbProp.getPassword())// 全局配置.globalConfig((builder) -> {// 設置注釋信息-作者builder.author(generatorProp.getAuthor());// 設置swagger注解//builder.enableSwagger();// 設置代碼生成的路徑builder.outputDir(generatorProp.getOutputDirRoot() + "/src/main/java");// 完成后不打開文件夾builder.disableOpenDir();// 不生成service接口,但是依然會生成serviceImpl//builder.disableServiceInterface();})// 包配置.packageConfig((builder) -> {// 設置父包路徑builder.parent(generatorProp.getPackagePath());//設置xml文件路徑builder.pathInfo(Collections.singletonMap(OutputFile.xml,generatorProp.getOutputDirRoot() + "/src/main/resources/mapper"));// 設置實體類包名builder.entity(generatorProp.getPackageEntity());// 設置Mapper接口包名//builder.mapper("mapper");// 設置Service接口包名//builder.service("service");// 設置Service實現(xiàn)類包名//builder.serviceImpl("service.impl");})// 策略配置.strategyConfig((builder) -> {// 指定表builder.addInclude("all".equals(generatorProp.getDbTables()) ?Collections.emptyList() : Arrays.asList(generatorProp.getDbTables().split(",")));// controller的策略配置builder.controllerBuilder()// 啟用rest風格.enableRestStyle()// 開啟駝峰轉(zhuǎn)連字符.enableHyphenStyle()// 禁用生成.disable()// 覆蓋已有文件//.enableFileOverride().build();// service的策略配置builder.serviceBuilder()// 格式化service接口文件名稱.formatServiceFileName("%sService")// 格式化service實現(xiàn)類文件名稱.formatServiceImplFileName("%sServiceImp")// 禁用生成.disable()// 覆蓋已有文件//.enableFileOverride().build();// entity的策略配置builder.entityBuilder()// 啟用Lombok插件.enableLombok()// 啟用表字段注解.enableTableFieldAnnotation()// 版本字段名稱.versionColumnName(generatorProp.getVersionColumnName())// 邏輯刪除字段名稱.logicDeleteColumnName(generatorProp.getLogicDeleteColumnName())// 設置字段名的命名策略為下劃線轉(zhuǎn)駝峰命名.columnNaming(NamingStrategy.underline_to_camel)// 主鍵策略遞增.idType(IdType.ASSIGN_UUID)// 格式化實體類名稱.formatFileName("%sEntity")// 覆蓋已有文件//.enableFileOverride().build();// mapper的策略配置builder.mapperBuilder().enableBaseColumnList().enableBaseResultMap();}).execute();} }
-
配置類
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component;@Data @Component @RefreshScope @ConfigurationProperties(prefix = "mybatis-plus.generator") public class MybatisPlusGeneratorProperties {// 作者private String author = "blackcrow";// 代碼生成的模塊路徑,例如:D:\IdeaProjects\open_multielement\userprivate String outputDirRoot;// 父包路徑,例如:com.example.userprivate String packagePath;// 實體類包名,例如:entityprivate String packageEntity = "entity";// 表名,多個英文逗號分隔,所有輸入 allprivate String dbTables;// 版本字段名稱private String versionColumnName = "version";// 邏輯刪除字段名稱private String logicDeleteColumnName = "is_delete"; }