Mybatis plus註解使用
阿新 • • 發佈:2021-08-30
前言
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 | 數字越小越靠前 |