您好,登錄后才能下訂單哦!
Mybatis Plus如何在Spring Boot環境下使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一、簡介
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默認值』
關于Mybatis Plus如何在Spring Boot環境下使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。