Spring Boot環境下Mybatis Plus的快速應用操作
一、簡介
Mybatis-Plus(簡稱MP)是一個 Mybatis 的一個增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。其願景是成為Mybatis最好的搭檔,將開發效率翻倍,由於受到學習研究深入限制,本例只進行Mybatis Plus在Spring Boot環境下的基本應用(如Select、Insert、Update、Delete等基本操作,其中還包括動態生成組合查詢與更新的動態SQL語句)。
特性:
無侵入:Mybatis-Plus 在 Mybatis 的基礎上進行擴充套件,只做增強不做改變,引入 Mybatis-Plus 不會對您現有的 Mybatis 構架產生任何影響,而且 MP 支援所有 Mybatis 原生的特性。
依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring
損耗小:啟動即會自動注入基本CURD,效能基本無損耗,直接面向物件操作。
預防Sql注入:內建Sql注入剝離器,有效預防Sql注入攻擊。
通用CRUD操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求。
多種主鍵策略:支援多達4種主鍵策略(內含分散式唯一ID生成器),可自由配置,完美解決主鍵問題。
支援ActiveRecord:支援 ActiveRecord 形式呼叫,實體類只需繼承 Model 類即可實現基本 CRUD 操作。
支援程式碼生成:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼,支援模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強大!)。
支援自定義全域性通用操作:支援全域性通用方法注入( Write once,use anywhere )。
支援關鍵詞自動轉義:支援資料庫關鍵詞(order、key……)自動轉義,還可自定義關鍵詞。
內建分頁外掛:基於Mybatis物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通List查詢。
內建效能分析外掛:可輸出Sql語句以及其執行時間,建議開發測試時啟用該功能,能有效解決慢查詢。
內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,預防誤操作。
二、快速入門開發
1、依賴配置(Spring Boot方式)
pom.xml引入MyBatis依賴類
<!--mybatis plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.9</version> </dependency>
application.yaml配置內容如下:
#mybatis plus配置 mybatis-plus: #由於本例中採用註解方式編寫sql,故而此處可不配置 #mapper-locations: classpath:/mapper/*Mapper.xml #實體掃描,多個package用逗號或者分號分隔 typeAliasesPackage: com.szss.admin.model #列舉掃描配置(本示例未使用到) #typeEnumsPackage: com.szss.admin.model.domain global-config: #主鍵型別 0:"資料庫ID自增",1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)",3:"UUID"; id-type: 0 #欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #重新整理mapper 除錯神器(由於本例中採用註解方式編寫sql,故而不需要重新整理mapper.xml檔案) #refresh-mapper: true #資料庫大寫下劃線轉換 capital-mode: true #序列介面實現類配置,在新的mybatis-plus-boot-starter中不推薦此方式進行配置,推薦自定義bean注入 key-generator: com.baomidou.mybatisplus.incrementer.H2KeyGenerator #邏輯刪除配置(下面3個配置) logic-delete-value: 1 logic-not-delete-value: 0 sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector # SQL 解析快取,開啟後多租戶 @SqlParser 註解生效 sql-parser-cache: true configuration: map-underscore-to-camel-case: true cache-enabled: false
這樣我們就完成了MyBatis Plus基本快速開發配置,接下來我們看看具體如何快速進行開發。
2、簡單示例
假設我們已存在一張 Role 表,且已有對應的實體類 Role,實現 Role 表的 CRUD 操作我們需要做什麼呢?
import com.baomidou.mybatisplus.mapper.BaseMapper; import com.szss.admin.model.domain.RoleDO; import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; /** * @author Allen * @date 2018/3/7 * <p> * RoleDO實體資料操作物件 */ @Mapper public interface RoleDAO extends BaseMapper<RoleDO> { //其他公共方法! }
以上就是所需的所有操作,不需要您建立任何XML檔案,接下來我們如何使用它基本的CRUD呢?
*角色的CRUD操作程式碼資訊
/** * 根據角色ID查詢角色 * * @param id 角色ID * @return 角色資訊 */ RoleDO roleDO = roleDAO.selectById(id); /** * 根據查詢條件查詢角色列表(分頁) * * @roleParam 查詢條件 * @return 角色列表分頁資訊 */ Page<RoleDO> page = new Page<RoleDO>(roleParam.getPi().intValue(),roleParam.getPs().intValue()); //這裡會動態根據前臺所傳入的值自動組合需要查詢的欄位資訊,從而實現動態查詢語句 EntityWrapper<RoleDO> eWrapper = new EntityWrapper<RoleDO>(roleDO); List<RoleDO> roleDOList = roleDAO.selectPage(page,eWrapper); /** * 角色新增 * * @param roleParam 角色資訊 * @return 角色資訊 */ roleDAO.insert(roleDO); /** * 角色更新(這裡mybatis plus的CRUD 操作會自動更新所需要更新的欄位動態生成更新語句) * * @param roleParam 角色資訊 * @return 角色資訊 */ roleDAO.updateById(roleDO); /** * 角色刪除(如果需要邏輯刪除而非物理刪除的話,需要結合@TableLogic標籤使用,後續會說明) * * @param id 角色Id * @return 刪除角色 */ roleDAO.deleteById(id);
以上是基本的 CRUD 操作,當然可用的 API 遠不止這幾個,目前最新版本可提供了多達 19 個方法給大家使用,可以極其方便的實現單一、批量、分頁等操作,上述中 selectPage即是MP 實現分頁的強大操作,而對於EntityWrapper還可以動態組合各種複雜的查詢條件各種組合。如上述所見,僅僅需要繼承一個 BaseMapper 即可實現大部分單表 CRUD 操作,極大的減少的開發負擔。有人也許會質疑:這難道不是通用 Mapper 麼?別急,咱們接著往下看。
現有一個需求,我們需要分頁查詢 User 表中,年齡在18~50之間性別為男且姓名為張三的所有使用者,這時候我們該如何實現上述需求呢?
傳統做法是 Mapper 中定義一個方法,然後在 Mapper XML 中填寫對應的 SELECT 語句或者使用@SelectProvider註解來進行SQL語句程式碼的硬拼接,且還要整合分頁,實現以上一個簡單的需求,往往需要我們做很多重複單調的工作,普通的通用 Mapper或@SelectProvider能夠解決這類痛點麼?答案是肯定的,不能!
用 MP 的方式開啟以上需求
// 分頁查詢 10 條姓名為‘王五'、性別為男,且年齡在18至50之間的使用者記錄 List<User> userList = userMapper.selectPage( new Page<User>(1,10),new EntityWrapper<User>().eq("name","王五") .eq("sex",0) .between("age","18","50") );
以上操作,等價於
SELECT * FROM sys_user WHERE (name='王五' AND sex=0 AND age BETWEEN '18' AND '50') LIMIT 0,10
Mybatis-Plus 通過 EntityWrapper(簡稱 EW,MP 封裝的一個查詢條件構造器)或者 Condition(與EW類似) 來讓使用者自由的構建查詢條件,簡單便捷,沒有額外的負擔,能夠有效提高開發效率。關於具體的EntityWrapper與Condition的用法請關注後續更多的文章說明,本例中不進行詳細展開敘述。
ActiveRecord 一直廣受動態語言( PHP 、 Ruby 等)的喜愛,而 Java 作為準靜態語言,對於 ActiveRecord 往往只能感嘆其優雅,所以我們也在 AR 道路上進行了一定的探索,喜歡大家能夠喜歡,也同時歡迎大家反饋意見與建議。
我們如何使用 AR 模式?
三、開啟AR模式
直接貼程式碼觀內容:
package com.szss.admin.model.domain; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableLogic; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.mapper.SqlCondition; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.Serializable; import java.util.Date; import lombok.Data; /** * @author Allen * @date 2018/3/7 角色實體 */ @Data @TableName("admin_role") public class RoleDO extends Model<RoleDO> { /** * 角色ID */ @TableId(type = IdType.AUTO) private Long id; /** * 角色名稱 */ @TableField(condition = SqlCondition.LIKE) private String name; /** * 角色描述 */ private String description; /** * 是否啟用:0-不可用,1-可用 */ private Boolean enabled; /** * 刪除標示:0-未刪除,1-已刪除 */ @TableLogic private Boolean deleted; /** * 建立人ID */ protected Long creatorId; /** * 建立人 */ protected String creator; /** * 建立時間 */ @SuppressFBWarnings("EI_EXPOSE_REP") protected Date dateCreated; /** * 修改人ID */ protected Long modifierId; /** * 修改人 */ protected String modifier; /** * 更新時間 */ @SuppressFBWarnings("EI_EXPOSE_REP") protected Date lastModified; /** 指定主鍵 */ @Override protected Serializable pkVal() { return this.id; } }
如上所述僅僅需要繼承 Model 類且實現主鍵pkVal指定方法 即可讓實體開啟 AR 之旅,開啟 AR 之路後,又將如何使用它呢?其實比較簡單,在上述<角色的CRUD操作程式碼資訊>中角色新增、更新與查詢角色列表我們通過roleDAO.selectPage方法進行分頁查詢,而現在只需要直接通過roleDO.selectPage直接進行查詢,具體程式碼如下所示:
/** * 查詢角色列表(分頁) * * @param roleParam 角色引數 * @return 查詢角色分頁列表 */ public Page<RoleDO> selectListPage(ListRoleParam roleParam) { RoleDO roleDO = new RoleDO(); BeanUtils.copyProperties(roleParam,roleDO); Page<RoleDO> page = new Page<RoleDO>((int)roleParam.getPi(),(int)roleParam.getPs()); EntityWrapper<RoleDO> eWrapper = new EntityWrapper<RoleDO>(roleDO); // Page<RoleDO> roleDOList = roleDAO.selectPage(page,eWrapper);//非AR方式的呼叫. Page<RoleDO> roleDOList = roleDO.selectPage(page,eWrapper);//這裡使用的就是Model提供的AR return roleDOList; }
AR 模式提供了一種更加便捷的方式實現 CRUD 操作,其本質還是呼叫的 Mybatis 對應的方法。
通過以上兩個簡單示例,我們簡單領略了 Mybatis-Plus 的魅力與高效率,可以快速開發程式碼開發,真正的做到了即開即用。
對於上述RoleDO中的部分註解現就進行說明如下:
@TableName("admin_role") // 註解指定表名
//主鍵型別 AUTO:"資料庫ID自增",INPUT:"使用者輸入ID",UUID:"全域性唯一ID UUID";
@TableId(type = IdType.AUTO)
@TableField(condition = SqlCondition.LIKE)//在查詢時匹配like動態語句
MP支援以下4中主鍵型別策略,可根據需求自行選用:
值 | 描述 |
---|---|
IdType.AUTO | 資料庫ID自增 |
IdType.INPUT | 使用者輸入ID |
IdType.ID_WORKER | 全域性唯一ID,內容為空自動填充(預設配置) |
IdType.UUID | 全域性唯一ID,內容為空自動填充 |
上述三個註解是最為基本註解,也較為常用,對於各註解裡面的引數詳細部分不屬於本示例範疇故而不一一詳細說明。
四、總結
通過上述三個註解可以動態生成Insert語句,在插入新增角色時,自動生成Insert into admin_role (name,description,enabled deleted,...) values(...)對應的欄位,而自動忽略id欄位,因id主鍵通過@TableId註解為資料庫自增型別。
而對於name這樣的欄位在日常查詢中往往是通過like方式來進行匹配的而非精確匹配,所以此處通過@TableField(condition = SqlCondition.LIKE)來實現動態組合查詢條件,其應用示例如上<根據查詢條件查詢角色列表(分頁)>selectPage的應用,會根據前臺傳入的引數自動組合查詢語句並進行分頁。
其他update操作本示例中通過指定ID欄位進行動態語句更新操作,當傳入的值不為空時自動組合所需要更新的欄位,而where條件即為指定的主鍵,自動生成update admin_role set name = '王五' where id=1,當然如果想實現某些欄位更新成空的情況下,也可通過field-strategy屬性配置的方式來進行實現。通過new EntityWrapper<RoleDO>(roleDO)這種模式從而解決當一張表有眾多欄位拼接冗長的SQL或增加欄位時而修改大量程式碼及SQL時極易造成某些地方未完全修改導致地隱性BUG的風險。
在本例中delete操作並不是真正意義上的物理刪除,而是邏輯刪除,如果不配置@TableLogic註解的話,則為物理刪除,會自動生成delete admin_role where id=1的語句。如yml檔案中配置了邏輯刪除結合使用@TableLogic註解的話為邏輯刪除,自動生成UPDATE admin_role SET deleted=1 WHERE id=1的語句(本例中不刪除為0(False),刪除為1(Ture),故而logic-delete-value: 1與logic-not-delete-value: 0如是配置)。
注:當配置了@TableLogic註解時在mp自帶查詢和更新方法的sql後面,追加『邏輯刪除欄位』=『LogicNotDeleteValue預設值』 刪除方法: deleteById()和其他delete方法,底層SQL呼叫的是update tbl_xxx set 『邏輯刪除欄位』=『logicDeleteValue預設值』
至此我們完成了資料庫的DML與DQL的基本操作,在不改變現有的框架下,快速啟用Mybatis plus的外掛,簡化操作提高開發效率,極大瞭解決了編寫SQL語句的繁重工作,同時整合分頁實現,減少程式碼量,從而為快速開發做好基礎!
以上這篇Spring Boot環境下Mybatis Plus的快速應用操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。