前言
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
特性
無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
損耗小:啟動即會自動注入基本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、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數據庫
內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢 - 內置全局攔截插件:提供全表 delete、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
支持數據庫
mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver 、 presto
達夢數據庫 、 虛谷數據庫 、 人大金倉數據庫
框架結構
@TableName
- @TableName(表名注解)
@TableName(value = "em_t") public class Test { private String id; private String name; }
屬性 | 類型 | 必須指定 | 默認值 | 描述 |
---|---|---|---|---|
value | String | 否 | "" | 表名 |
schema | String | 否 | "" | schema |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(如果設置了全局 tablePrefix 且自行設置了 value 的值) |
resultMap | String | 否 | "" | xml 中 resultMap 的 id |
autoResultMap | boolean | 否 | false | 是否自動構建 resultMap 並使用(如果設置 resultMap 則不會進行 resultMap 的自動構建並注入) |
excludeProperty | String[] | 否 | {} | 需要排除的屬性名(@since 3.3.1) |
關於`autoResultMap`的說明: mp會自動構建一個ResultMap並注入到mybatis里(一般用不上).下面講兩句:
因為mp底層是mybatis,所以一些mybatis的常識你要知道,mp只是幫你注入了常用crud到mybatis里 注入之前可以說是動態的(根據你entity的字段以及注解變化而變化)
但是注入之后是靜態的(等於你寫在xml的東西) 而對於直接指定typeHandler,mybatis只支持你寫在2個地方: (1)定義在resultMap里,只作用於select查詢的返回結果封裝 (2)定義在insert和updatesql的#{property}里的property后面(例:#{property,typehandler=xxx.xxx.xxx}),只作用於設置值
而除了這兩種直接指定typeHandler,mybatis有一個全局的掃描你自己的typeHandler包的配置,這是根據你的property的類型去找typeHandler並使用.
@TableId
- @TableId(表名主鍵)
value:主鍵字段名
type:主鍵類型:
寫法:IdType.NONE
AUTO——數據庫自增
INPUT——自行輸入
ID_WORKER——分布式全局唯一ID長整型類型
UUID——32位UUID字符串
NONE——無狀態,該類型為未設置主鍵類型(注解里等於跟隨全局,全局里約等於 INPUT)
ID_WORKER_STR——分布式全局唯一ID字符串類型
@TableId(value = “id”, type = IdType.AUTO):自增 @TableId(value = “id”, type = IdType.ID_WORKER_STR):分布式全局唯一ID字符串類型 @TableId(value = “id”, type = IdType.INPUT):自行輸入 @TableId(value = “id”, type = IdType.ID_WORKER):分布式全局唯一ID 長整型類型 @TableId(value = “id”, type = IdType.UUID):32位UUID字符串 @TableId(value = “id”, type = IdType.NONE):無狀態
例如:
@TableName(value = "em_t") public class Test { @TableId(value = "emid",type= IdType.AUTO) private String emid; private String name; }
@TableField
- @TableField
- value:字段名
- exit:是否為數據庫表字段
- Strategy:字段驗證
- 寫法:FieldStrategy.NOT_NULL
IGNORED——忽略判斷
NOT_NULL——非NULL判斷
NOT_EMPTY——非空判斷(字符串類型)
DEFAULT——追隨全局配置
fill:字段自動填充策略(需要寫相關的配置類)
寫法:FieldFill.DEFAULT
DEFAULT——默認不處理
INSERT——插入時填充字段
UPDATE——更新時填充字段
INSERT_UPDATE——插入和更新時填充字段
@TableField(value = “age”)// 用來解決數據庫中的字段和實體類的字段不匹配問題
@TableField(exist = false) // 用來解決實體類中有的屬性但是數據表中沒有的字段,默認為true
@TableField(condition = SqlCondition.LIKE):表示該屬性可以模糊搜索。
@TableField(fill = FieldFill.INSERT):注解填充字段 ,生成器策略部分也可以配置!
FieldStrategy:
- 字段填充策略 FieldFill:
值 | 描述 |
---|---|
DEFAULT | 默認不處理 |
INSERT | 插入時填充字段 |
UPDATE | 更新時填充字段 |
INSERT_UPDATE | 插入和更新時填充字段 |
@TableField(value = "ename") private String ename; @TableField(.. , update="%s+1") 其中 %s 會填充為字段 //輸出 SQL 為:update 表 set 字段=字段+1 where ... @TableField(.. , update="now()") 使用數據庫時間 //輸出 SQL 為:update 表 set 字段=now() where ... @TableField(condition = SqlCondition.LIKE) private String name; //輸出 SQL 為:select 表 where name LIKE CONCAT('%',值,'%')
@Version:樂觀鎖注解、標記
@KeySequence:序列主鍵策略
- 屬性:value、resultMap
@EnumValue:通枚舉類注解((注解在枚舉字段上))
@TableLogic:表字段邏輯處理注解(邏輯刪除)
- 描述:表字段邏輯處理注解(邏輯刪除)
屬性 | 類型 | 必須指定 | 默認值 | 描述 |
---|---|---|---|---|
value | String | 否 | "" | 邏輯未刪除值 |
delval | String | 否 | "" | 邏輯刪除值 |
@SqlParser:租戶注解
@OrderBy:排序注解
- 描述:內置 SQL 默認指定排序,優先級低於 wrapper 條件查詢
屬性 | 類型 | 必須指定 | 默認值 | 描述 |
---|---|---|---|---|
isDesc | boolean | 否 | 是 | 是否倒序查詢 |
sort | short | 否 | Short.MAX_VALUE | 數字越小越靠前 |