您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘PSpring Boot + Mybatis-Plus的集成與使用方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
通過上一章節(jié),我們可以很方便的使用繼承了BaseMapper接口的SysLogMapper進行CRUD操作。下面我們先來看下傳統(tǒng)MaBatis的特點:
MyBatis-Plus官方介紹MyBatis-Plus是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變。只為簡化開發(fā)、提高效率。學習到這里,更直觀的使用體驗如下:
基于MyBatis
需要編寫XXMapper接口,并手動編寫CRUD方法
XXMapper.xml映射文件,并手動編寫每個方法對應的SQL語句
基于MyBatis-Plus
只需要創(chuàng)建XXMapper接口并繼承BaseMapper接口,即可完成所有通用CRUD操作
可以無需創(chuàng)建SQL映射文件
只要繼承BaseMapper,就可完成所有通用CRUD操作。那么我們就來了解下BaseMapper接口。查看BaseMapper源碼,可以看到接口里定義了各種CRUD操作的17種方法,可以極其方便的實現(xiàn)單一、批量、分頁等操作。
這里看到CRUD方法都在這里定義好了,那么最終執(zhí)行操作數(shù)據(jù)庫的SQL語句是在哪編寫的呢。帶著這個疑惑,我先從使用源頭SysLogMapper接口開始分析。這接口只繼承了BaseMapper接口的定義的所有方法。
那這些方法又是如何實現(xiàn)的呢。
這里我們先要知道動態(tài)代理的這個概念。在Spring中動態(tài)代理實現(xiàn)有兩種:一種基于JDK使用接口代理,另一種是基于cglib的使用類繼承方式動態(tài)代理。有關動態(tài)代理原理這里不作深入講解,有興趣的同伴可以查閱資料了解,后續(xù)我們也會單獨對這塊進行講解學習。
我們選擇debug模式,打個斷點執(zhí)行查詢操作。
可以看到sysLogMpper被動態(tài)代理后,在對象結(jié)構里可以看selSessionFactory對象以及對象里的configuration對象。configuration對象就是MyBatis-Plus全局配置對象,包含所有配置信息。configuration對象中有mappedStatements屬性,這里就是sysLogMpper接口方法的SQL語句映射,mappedStatements是一個HashMap,key為方法名,value對應一個個MappedStatement對象。
我們點開一個鍵值對看下,在MappedStatement對象里有DynamicSqlSource類對象sqlSource,在對象中就編寫了CRUD操作方法的動態(tài)SQL語句。
那么這些動態(tài)的SQL是如何放進MappedStatement對象中的呢。在官網(wǎng)文檔中提到了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執(zhí)行的方法類對象。我們打開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方法里,可以看傳了三個參數(shù)mapperClass、 modelClass、 tableInfo,分別為要操作的mapper接口對象、實體類對象、以及實體映射的表信息對象。在方法里將這里信息按insert操作格式化出sql字符串,最后一行調(diào)用繼承的addInsertMappedStatement方法將以上這對象信息進行封裝,最終返回MappedStatement對象。
以上就是我們對MyBatis-Plus自動注入SQL原理進行簡單的分析,有興趣的同學可以再深入研究,歡迎留言與我們一起探討。
在前面介紹BaseMapper接口中定義的方法中,我們發(fā)現(xiàn)有方法參數(shù)中傳了Wrapper對象。這就是我們接下來要講解的條件構造器。在開始講解如何使用條件構造器前,先了解下什么是條件構造器,磨刀不誤砍柴工!
從上面圖解中可以清楚看到各接口、抽象類與實現(xiàn)類間的實現(xiàn)與繼承關系。之所以給出上面圖解,是因為接下來將要重點講解使用QueryWrapper、LambdaQueryWrapper、UpdateWrapper、LambdaUpdateWrapper四個查詢與更新包裝器,主要用于處理 sql 拼接,排序,實體參數(shù)進行分頁查詢與更新,簡單便捷,沒有額外的負擔,能夠有效的提高開發(fā)效率。
可以看到對象查詢,這里字義了兩個類,QueryWrapper和LambdaQueryWrapper。兩個類的區(qū)別是QueryWrapper中條件參數(shù)使用的是數(shù)據(jù)庫字段,不是Java屬性。LambdaQueryWrapper看類名就知道是支持使用JDK8新特性,使用方法引用來進行查詢。
通用的條件參數(shù)有以下這些:
查詢方式 | 說明 |
---|---|
setSqlSelect | 設置 SELECT 查詢字段 |
where | WHERE 語句,拼接 + WHERE 條件 |
and | AND 語句,拼接 + AND 字段=值 |
andNew | AND 語句,拼接 + AND (字段=值) |
or | OR 語句,拼接 + OR 字段=值 |
orNew | OR 語句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 內(nèi)容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查詢 LIKE |
notLike | 模糊查詢 NOT LIKE |
in | IN 查詢 |
notIn | NOT IN 查詢 |
isNull | NULL 值查詢 |
isNotNull | IS NOT NULL |
groupBy | 分組 GROUP BY |
having | HAVING 關鍵詞 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 條件語句 |
notExists | NOT EXISTS 條件語句 |
between | BETWEEN 條件語句 |
notBetween | NOT BETWEEN 條件語句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last("LIMIT 1") |
MyBatis-Plus自動注入SQL原理以及簡單了解什么是條件構造器。一起學習的同伴們應該對MyBatis-Plus的條件構造器使用已經(jīng)躍躍欲試了。
上述就是小編為大家分享的Spring Boot + Mybatis-Plus的集成與使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。