91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot + Mybatis-Plus的集成與使用方法

發布時間:2021-10-20 17:32:38 來源:億速云 閱讀:299 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關Spring Boot + Mybatis-Plus的集成與使用方法,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、自動注入SQL原理 

通過上一章節,我們可以很方便的使用繼承了BaseMapper接口的SysLogMapper進行CRUD操作。下面我們先來看下傳統MaBatis的特點:

Spring Boot + Mybatis-Plus的集成與使用方法

MyBatis-Plus官方介紹MyBatis-Plus是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變。只為簡化開發、提高效率。學習到這里,更直觀的使用體驗如下:

  • 基于MyBatis

    1. 需要編寫XXMapper接口,并手動編寫CRUD方法

    2. XXMapper.xml映射文件,并手動編寫每個方法對應的SQL語句

  • 基于MyBatis-Plus

    1. 只需要創建XXMapper接口并繼承BaseMapper接口,即可完成所有通用CRUD操作

    2. 可以無需創建SQL映射文件

只要繼承BaseMapper,就可完成所有通用CRUD操作。那么我們就來了解下BaseMapper接口。查看BaseMapper源碼,可以看到接口里定義了各種CRUD操作的17種方法,可以極其方便的實現單一、批量、分頁等操作。

Spring Boot + Mybatis-Plus的集成與使用方法

這里看到CRUD方法都在這里定義好了,那么最終執行操作數據庫的SQL語句是在哪編寫的呢。帶著這個疑惑,我先從使用源頭SysLogMapper接口開始分析。這接口只繼承了BaseMapper接口的定義的所有方法。

那這些方法又是如何實現的呢。

這里我們先要知道動態代理的這個概念。在Spring中動態代理實現有兩種:一種基于JDK使用接口代理,另一種是基于cglib的使用類繼承方式動態代理。有關動態代理原理這里不作深入講解,有興趣的同伴可以查閱資料了解,后續我們也會單獨對這塊進行講解學習。

我們選擇debug模式,打個斷點執行查詢操作。

Spring Boot + Mybatis-Plus的集成與使用方法

可以看到sysLogMpper被動態代理后,在對象結構里可以看selSessionFactory對象以及對象里的configuration對象。configuration對象就是MyBatis-Plus全局配置對象,包含所有配置信息。configuration對象中有mappedStatements屬性,這里就是sysLogMpper接口方法的SQL語句映射,mappedStatements是一個HashMapkey為方法名,value對應一個個MappedStatement對象。

Spring Boot + Mybatis-Plus的集成與使用方法

我們點開一個鍵值對看下,在MappedStatement對象里有DynamicSqlSource類對象sqlSource,在對象中就編寫了CRUD操作方法的動態SQL語句。

Spring Boot + Mybatis-Plus的集成與使用方法

那么這些動態的SQL是如何放進MappedStatement對象中的呢。在官網文檔中提到了SQL注入器,默認為DefaultSqlInjector。我們打開這個類看下

public class DefaultSqlInjector extends AbstractSqlInjector {
    public DefaultSqlInjector() {
    }
 
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        return (List)Stream.of(new Insert(), new Delete(), new DeleteByMap(), new DeleteById(), new DeleteBatchByIds(), new Update(), new UpdateById(), new SelectById(), new SelectBatchByIds(), new SelectByMap(), new SelectOne(), new SelectCount(), new SelectMaps(), new SelectMapsPage(), new SelectObjs(), new SelectList(), new SelectPage()).collect(Collectors.toList());
    }
}

這個類繼承AbstractSqlInjector,重寫了getMethodList方法,返回一個集合。集合里是實例化后的CRUD執行的方法類對象。我們打開Insert類看下,這個類繼承自AbstractMethod類,重寫了injectMappedStatement方法。

public class Insert extends AbstractMethod {
    public Insert() {
    }
 
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        KeyGenerator keyGenerator = new NoKeyGenerator();
        SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
        String columnScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlColumnMaybeIf(), "(", ")", (String)null, ",");
        String valuesScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlPropertyMaybeIf((String)null), "(", ")", (String)null, ",");
        String keyProperty = null;
        String keyColumn = null;
        if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                keyGenerator = new Jdbc3KeyGenerator();
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            } else if (null != tableInfo.getKeySequence()) {
                keyGenerator = TableInfoHelper.genKeyGenerator(tableInfo, this.builderAssistant, sqlMethod.getMethod(), this.languageDriver);
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            }
        }
        //格式SQL語句
        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript);
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource, (KeyGenerator)keyGenerator, keyProperty, keyColumn);
    }
}

injectMappedStatement方法里,可以看傳了三個參數mapperClass、 modelClass、 tableInfo,分別為要操作的mapper接口對象、實體類對象、以及實體映射的表信息對象。在方法里將這里信息按insert操作格式化出sql字符串,最后一行調用繼承的addInsertMappedStatement方法將以上這對象信息進行封裝,最終返回MappedStatement對象。

以上就是我們對MyBatis-Plus自動注入SQL原理進行簡單的分析,有興趣的同學可以再深入研究,歡迎留言與我們一起探討。

二、 條件構造器

在前面介紹BaseMapper接口中定義的方法中,我們發現有方法參數中傳了Wrapper對象。這就是我們接下來要講解的條件構造器。在開始講解如何使用條件構造器前,先了解下什么是條件構造器,磨刀不誤砍柴工!

Spring Boot + Mybatis-Plus的集成與使用方法

從上面圖解中可以清楚看到各接口、抽象類與實現類間的實現與繼承關系。之所以給出上面圖解,是因為接下來將要重點講解使用QueryWrapperLambdaQueryWrapperUpdateWrapperLambdaUpdateWrapper四個查詢與更新包裝器,主要用于處理 sql 拼接,排序,實體參數進行分頁查詢與更新,簡單便捷,沒有額外的負擔,能夠有效的提高開發效率。

可以看到對象查詢,這里字義了兩個類,QueryWrapperLambdaQueryWrapper。兩個類的區別是QueryWrapper中條件參數使用的是數據庫字段,不是Java屬性。LambdaQueryWrapper看類名就知道是支持使用JDK8新特性,使用方法引用來進行查詢

通用的條件參數有以下這些:

查詢方式說明
setSqlSelect設置 SELECT 查詢字段
whereWHERE 語句,拼接 + WHERE 條件
andAND 語句,拼接 + AND 字段=值
andNewAND 語句,拼接 + AND (字段=值)
orOR 語句,拼接 + OR 字段=值
orNewOR 語句,拼接 + OR (字段=值)
eq等于=
allEq基于 map 內容等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查詢 LIKE
notLike模糊查詢 NOT LIKE
inIN 查詢
notInNOT IN 查詢
isNullNULL 值查詢
isNotNullIS NOT NULL
groupBy分組 GROUP BY
havingHAVING 關鍵詞
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 條件語句
notExistsNOT EXISTS 條件語句
betweenBETWEEN 條件語句
notBetweenNOT BETWEEN 條件語句
addFilter自由拼接 SQL
last拼接在最后,例如:last("LIMIT 1")

三 、小結

MyBatis-Plus自動注入SQL原理以及簡單了解什么是條件構造器。一起學習的同伴們應該對MyBatis-Plus的條件構造器使用已經躍躍欲試了。

上述就是小編為大家分享的Spring Boot + Mybatis-Plus的集成與使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

常熟市| 筠连县| 济南市| 聂拉木县| 竹北市| 双柏县| 华蓥市| 莒南县| 中牟县| 秦皇岛市| 镇安县| 双桥区| 辽宁省| 金坛市| 三穗县| 龙口市| 日照市| 小金县| 鄂尔多斯市| 墨玉县| 九江市| 南乐县| 疏勒县| 绥化市| 光泽县| 高安市| 宜春市| 瑞昌市| 滦南县| 南宫市| 哈巴河县| 环江| 宜君县| 自治县| 梅州市| 恩平市| 神池县| 九龙城区| 镇雄县| 柳州市| 东乌珠穆沁旗|