av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot環(huán)境下Mybatis Plus的快速應(yīng)用操作

瀏覽:35日期:2023-07-30 14:05:00

一、簡介

Mybatis-Plus(簡稱MP)是一個 Mybatis 的一個增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。其愿景是成為Mybatis最好的搭檔,將開發(fā)效率翻倍,由于受到學(xué)習(xí)研究深入限制,本例只進(jìn)行Mybatis Plus在Spring Boot環(huán)境下的基本應(yīng)用(如Select、Insert、Update、Delete等基本操作,其中還包括動態(tài)生成組合查詢與更新的動態(tài)SQL語句)。

特性:

無侵入:Mybatis-Plus 在 Mybatis 的基礎(chǔ)上進(jìn)行擴(kuò)展,只做增強(qiáng)不做改變,引入 Mybatis-Plus 不會對您現(xiàn)有的 Mybatis 構(gòu)架產(chǎn)生任何影響,而且 MP 支持所有 Mybatis 原生的特性。

依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring

損耗小:啟動即會自動注入基本CURD,性能基本無損耗,直接面向?qū)ο蟛僮鳌?/p>

預(yù)防Sql注入:內(nèi)置Sql注入剝離器,有效預(yù)防Sql注入攻擊。

通用CRUD操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求。

多種主鍵策略:支持多達(dá)4種主鍵策略(內(nèi)含分布式唯一ID生成器),可自由配置,完美解決主鍵問題。

支持ActiveRecord:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可實現(xiàn)基本 CRUD 操作。

支持代碼生成:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強(qiáng)大!)。

支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )。

支持關(guān)鍵詞自動轉(zhuǎn)義:支持?jǐn)?shù)據(jù)庫關(guān)鍵詞(order、key……)自動轉(zhuǎn)義,還可自定義關(guān)鍵詞。

內(nèi)置分頁插件:基于Mybatis物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通List查詢。

內(nèi)置性能分析插件:可輸出Sql語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能有效解決慢查詢。

內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,預(yù)防誤操作。

二、快速入門開發(fā)

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配置內(nèi)容如下:

#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:'數(shù)據(jù)庫ID自增', 1:'用戶輸入ID',2:'全局唯一ID (數(shù)字類型唯一ID)', 3:'UUID'; id-type: 0 #字段策略 0:'忽略判斷',1:'非 NULL 判斷'),2:'非空判斷' field-strategy: 2 #駝峰下劃線轉(zhuǎn)換 db-column-underline: true #刷新mapper 調(diào)試神器(由于本例中采用注解方式編寫sql,故而不需要刷新mapper.xml文件) #refresh-mapper: true #數(shù)據(jù)庫大寫下劃線轉(zhuǎn)換 capital-mode: true #序列接口實現(xiàn)類配置,在新的mybatis-plus-boot-starter中不推薦此方式進(jìn)行配置,推薦自定義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基本快速開發(fā)配置,接下來我們看看具體如何快速進(jìn)行開發(fā)。

2、簡單示例

假設(shè)我們已存在一張 Role 表,且已有對應(yīng)的實體類 Role,實現(xiàn) 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實體數(shù)據(jù)操作對象 */@Mapperpublic interface RoleDAO extends BaseMapper<RoleDO> { //其他公共方法!}

以上就是所需的所有操作,不需要您創(chuàng)建任何XML文件,接下來我們?nèi)绾问褂盟镜腃RUD呢?

*角色的CRUD操作代碼信息

/** * 根據(jù)角色I(xiàn)D查詢角色 * * @param id 角色I(xiàn)D * @return 角色信息 */ RoleDO roleDO = roleDAO.selectById(id); /** * 根據(jù)查詢條件查詢角色列表(分頁) * * @roleParam 查詢條件 * @return 角色列表分頁信息 */ Page<RoleDO> page = new Page<RoleDO>(roleParam.getPi().intValue(), roleParam.getPs().intValue()); //這里會動態(tài)根據(jù)前臺所傳入的值自動組合需要查詢的字段信息,從而實現(xiàn)動態(tài)查詢語句 EntityWrapper<RoleDO> eWrapper = new EntityWrapper<RoleDO>(roleDO); List<RoleDO> roleDOList = roleDAO.selectPage(page,eWrapper); /** * 角色新增 * * @param roleParam 角色信息 * @return 角色信息 */ roleDAO.insert(roleDO); /** * 角色更新(這里mybatis plus的CRUD 操作會自動更新所需要更新的字段動態(tài)生成更新語句) * * @param roleParam 角色信息 * @return 角色信息 */ roleDAO.updateById(roleDO); /** * 角色刪除(如果需要邏輯刪除而非物理刪除的話,需要結(jié)合@TableLogic標(biāo)簽使用,后續(xù)會說明) * * @param id 角色I(xiàn)d * @return 刪除角色 */ roleDAO.deleteById(id);

以上是基本的 CRUD 操作,當(dāng)然可用的 API 遠(yuǎn)不止這幾個,目前最新版本可提供了多達(dá) 19 個方法給大家使用,可以極其方便的實現(xiàn)單一、批量、分頁等操作,上述中 selectPage即是MP 實現(xiàn)分頁的強(qiáng)大操作,而對于EntityWrapper還可以動態(tài)組合各種復(fù)雜的查詢條件各種組合。如上述所見,僅僅需要繼承一個 BaseMapper 即可實現(xiàn)大部分單表 CRUD 操作,極大的減少的開發(fā)負(fù)擔(dān)。有人也許會質(zhì)疑:這難道不是通用 Mapper 么?別急,咱們接著往下看。

現(xiàn)有一個需求,我們需要分頁查詢 User 表中,年齡在18~50之間性別為男且姓名為張三的所有用戶,這時候我們該如何實現(xiàn)上述需求呢?

傳統(tǒng)做法是 Mapper 中定義一個方法,然后在 Mapper XML 中填寫對應(yīng)的 SELECT 語句或者使用@SelectProvider注解來進(jìn)行SQL語句代碼的硬拼接,且還要集成分頁,實現(xiàn)以上一個簡單的需求,往往需要我們做很多重復(fù)單調(diào)的工作,普通的通用 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_userWHERE (name=’王五’ AND sex=0 AND age BETWEEN ’18’ AND ’50’)LIMIT 0,10

Mybatis-Plus 通過 EntityWrapper(簡稱 EW,MP 封裝的一個查詢條件構(gòu)造器)或者 Condition(與EW類似) 來讓用戶自由的構(gòu)建查詢條件,簡單便捷,沒有額外的負(fù)擔(dān),能夠有效提高開發(fā)效率。關(guān)于具體的EntityWrapper與Condition的用法請關(guān)注后續(xù)更多的文章說明,本例中不進(jìn)行詳細(xì)展開敘述。

ActiveRecord 一直廣受動態(tài)語言( PHP 、 Ruby 等)的喜愛,而 Java 作為準(zhǔn)靜態(tài)語言,對于 ActiveRecord 往往只能感嘆其優(yōu)雅,所以我們也在 AR 道路上進(jìn)行了一定的探索,喜歡大家能夠喜歡,也同時歡迎大家反饋意見與建議。

我們?nèi)绾问褂?AR 模式?

三、開啟AR模式

直接貼代碼觀內(nèi)容:

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> { /** * 角色I(xiàn)D */ @TableId(type = IdType.AUTO) private Long id; /** * 角色名稱 */ @TableField(condition = SqlCondition.LIKE) private String name; /** * 角色描述 */ private String description; /** * 是否啟用:0-不可用,1-可用 */ private Boolean enabled; /** * 刪除標(biāo)示:0-未刪除,1-已刪除 */ @TableLogic private Boolean deleted; /** * 創(chuàng)建人ID */ protected Long creatorId; /** * 創(chuàng)建人 */ protected String creator; /** * 創(chuàng)建時間 */ @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 類且實現(xiàn)主鍵pkVal指定方法 即可讓實體開啟 AR 之旅,開啟 AR 之路后,又將如何使用它呢?其實比較簡單,在上述<角色的CRUD操作代碼信息>中角色新增、更新與查詢角色列表我們通過roleDAO.selectPage方法進(jìn)行分頁查詢,而現(xiàn)在只需要直接通過roleDO.selectPage直接進(jìn)行查詢,具體代碼如下所示:

/** * 查詢角色列表(分頁) * * @param roleParam 角色參數(shù) * @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方式的調(diào)用. Page<RoleDO> roleDOList = roleDO.selectPage(page, eWrapper);//這里使用的就是Model提供的AR return roleDOList; }

AR 模式提供了一種更加便捷的方式實現(xiàn) CRUD 操作,其本質(zhì)還是調(diào)用的 Mybatis 對應(yīng)的方法。

通過以上兩個簡單示例,我們簡單領(lǐng)略了 Mybatis-Plus 的魅力與高效率,可以快速開發(fā)代碼開發(fā),真正的做到了即開即用。

對于上述RoleDO中的部分注解現(xiàn)就進(jìn)行說明如下:

@TableName('admin_role') // 注解指定表名

//主鍵類型 AUTO:'數(shù)據(jù)庫ID自增', INPUT:'用戶輸入ID',UUID:'全局唯一ID UUID';

@TableId(type = IdType.AUTO)

@TableField(condition = SqlCondition.LIKE)//在查詢時匹配like動態(tài)語句

MP支持以下4中主鍵類型策略,可根據(jù)需求自行選用:

值 描述 IdType.AUTO 數(shù)據(jù)庫ID自增 IdType.INPUT 用戶輸入ID IdType.ID_WORKER 全局唯一ID,內(nèi)容為空自動填充(默認(rèn)配置) IdType.UUID 全局唯一ID,內(nèi)容為空自動填充

上述三個注解是最為基本注解,也較為常用,對于各注解里面的參數(shù)詳細(xì)部分不屬于本示例范疇故而不一一詳細(xì)說明。

四、總結(jié)

通過上述三個注解可以動態(tài)生成Insert語句,在插入新增角色時,自動生成Insert into admin_role (name,description,enabled deleted,...) values(...)對應(yīng)的字段,而自動忽略id字段,因id主鍵通過@TableId注解為數(shù)據(jù)庫自增類型。

而對于name這樣的字段在日常查詢中往往是通過like方式來進(jìn)行匹配的而非精確匹配,所以此處通過@TableField(condition = SqlCondition.LIKE)來實現(xiàn)動態(tài)組合查詢條件,其應(yīng)用示例如上<根據(jù)查詢條件查詢角色列表(分頁)>selectPage的應(yīng)用,會根據(jù)前臺傳入的參數(shù)自動組合查詢語句并進(jìn)行分頁。

其他update操作本示例中通過指定ID字段進(jìn)行動態(tài)語句更新操作,當(dāng)傳入的值不為空時自動組合所需要更新的字段,而where條件即為指定的主鍵,自動生成update admin_role set name = ’王五’ where id=1,當(dāng)然如果想實現(xiàn)某些字段更新成空的情況下,也可通過field-strategy屬性配置的方式來進(jìn)行實現(xiàn)。通過new EntityWrapper<RoleDO>(roleDO)這種模式從而解決當(dāng)一張表有眾多字段拼接冗長的SQL或增加字段時而修改大量代碼及SQL時極易造成某些地方未完全修改導(dǎo)致地隱性BUG的風(fēng)險。

在本例中delete操作并不是真正意義上的物理刪除,而是邏輯刪除,如果不配置@TableLogic注解的話,則為物理刪除,會自動生成delete admin_role where id=1的語句。如yml文件中配置了邏輯刪除結(jié)合使用@TableLogic注解的話為邏輯刪除,自動生成UPDATE admin_role SET deleted=1 WHERE id=1的語句(本例中不刪除為0(False),刪除為1(Ture),故而logic-delete-value: 1與logic-not-delete-value: 0如是配置)。

注:當(dāng)配置了@TableLogic注解時在mp自帶查詢和更新方法的sql后面,追加『邏輯刪除字段』=『LogicNotDeleteValue默認(rèn)值』 刪除方法: deleteById()和其他delete方法, 底層SQL調(diào)用的是update tbl_xxx set 『邏輯刪除字段』=『logicDeleteValue默認(rèn)值』

至此我們完成了數(shù)據(jù)庫的DML與DQL的基本操作,在不改變現(xiàn)有的框架下,快速啟用Mybatis plus的插件,簡化操作提高開發(fā)效率,極大了解決了編寫SQL語句的繁重工作,同時集成分頁實現(xiàn),減少代碼量,從而為快速開發(fā)做好基礎(chǔ)!

以上這篇Spring Boot環(huán)境下Mybatis Plus的快速應(yīng)用操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 欧美日韩高清在线观看 | 日本午夜一区二区三区 | 日本不卡一区二区三区在线观看 | 免费黄色网址视频 | 亚洲国产精品久久久久秋霞不卡 | 日日干干夜夜 | 国产成人综合一区二区三区 | 亚洲一区二区三区免费视频 | 日韩一区二区三区在线看 | 在线免费观看黄a | www.色.com| 久久久久久天堂 | 81精品国产乱码久久久久久 | 国产精品免费一区二区三区 | 99精品欧美一区二区三区综合在线 | 激情欧美一区二区三区中文字幕 | 国产精品日韩一区二区 | 久久国产精品99久久久大便 | 男女精品网站 | 欧美日韩国产在线 | 久久高清国产视频 | 午夜在线影院 | 日韩亚洲视频 | 亚洲一区精品在线 | 国产69久久精品成人看动漫 | www.久久久久久久久 | 在线超碰 | 国产a区 | 国产日韩免费观看 | 欧美午夜精品 | 黄色一级毛片 | av激情影院 | 欧美日韩在线免费 | 狠狠操狠狠色 | 91精品在线观看入口 | 亚洲成网 | 国产福利观看 | 日韩精品免费看 | 亚洲国产精品福利 | 精品99久久 | 欧美成人激情 |