日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想

發(fā)布時(shí)間:2025/7/14 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

之所以寫這篇文章,主要是給新手提供一些mybatis使用的技巧和思路

現(xiàn)在國(guó)內(nèi)很多項(xiàng)目都使用了mybatis作為ORM框架

我們?cè)趯?shí)際的使用過程中基本上都會(huì)遇到批量insert update等操作

在網(wǎng)上搜索一些文章,大多數(shù)都是在說(shuō)使用mybatis forEach標(biāo)簽迭代等。。。

實(shí)際上這種做法是存在很多問題的,比如SQL過長(zhǎng)..等限制

于是乎我們自己使用原生的JDBC batch批量執(zhí)行insert或update等操作

但是很多人并不知道m(xù)ybatis實(shí)際上是提供了這種批量操作實(shí)現(xiàn)的

同時(shí)還有關(guān)于mybatis分頁(yè)的問題...我們?cè)O(shè)想,select語(yǔ)句我們只寫原生的,是否能自動(dòng)完成分頁(yè)等功能?

抽象Service實(shí)現(xiàn)單表操作問題,這里我的設(shè)計(jì)其實(shí)也很簡(jiǎn)單,具體參看項(xiàng)目源碼,相信大家都看得懂。

并沒有做到完全的自動(dòng)化,底層的SQL還是需要自己寫XML文件的,只是代碼層通過統(tǒng)一的命名規(guī)范做了命名標(biāo)準(zhǔn),簡(jiǎn)化了代碼的編寫

-------------------------------------------分割線-------------------------------------------

廢話說(shuō)多了,下面進(jìn)入正題

如何整合?

具體參看:http://git.oschina.net/lis1314/mybatis-spring-demo

這里只說(shuō)重點(diǎn)

1、關(guān)于批量insert或update問題

applicationContext.xml 中配置的

<!--單獨(dú)配置一個(gè)執(zhí)行JDBC批量操作的session,底層等于sqlSessionFactory.openSession(ExecutorType.BATCH); 底層使用org.apache.ibatis.executor.BatchExecutor作為執(zhí)行引擎 --> <bean id="batchSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory"/><constructor-arg index="1" value="BATCH"/> </bean>

這個(gè)是配置一個(gè)mybatis對(duì)JdbcBatch操作的執(zhí)行模板,mybatis在執(zhí)行SQL的時(shí)候,底層會(huì)創(chuàng)建一個(gè)執(zhí)行引擎,org.apache.ibatis.executor.Executor它是一個(gè)接口,默認(rèn)使用的實(shí)現(xiàn)類有如下

實(shí)際上我們關(guān)心的只有SimpleExecutor,BatchExecutor這兩個(gè),默認(rèn)的使用是SimpleExecutor

我們?cè)谏厦媾渲玫哪0寰褪歉淖兯膱?zhí)行引擎,讓它使用BatchExecutor作為執(zhí)行引擎,如果想了解更詳細(xì)可以閱讀源碼,具體的Executor創(chuàng)建在org.apache.ibatis.session.Configuration

2、關(guān)于mybatis分頁(yè)問題

思路是自己寫一個(gè)mybatis的插件,攔截mybatis的執(zhí)行引擎,重置原生的SQL語(yǔ)句

具體的實(shí)現(xiàn)參看上面的工程,這里使用的是https://github.com/pagehelper/Mybatis-PageHelper

3、關(guān)于例子運(yùn)行工程中com.mybatis.demo.test.StudentServiceTest

按照順序執(zhí)行,并查看控制臺(tái)的SQL語(yǔ)句,可以得出結(jié)論

?

4、補(bǔ)充簡(jiǎn)述Mybatis batch原理--選讀

首先我們看一張圖簡(jiǎn)單了解下Mybatis數(shù)據(jù)處理架構(gòu)

?

這里我們重點(diǎn)關(guān)注Executor,Executor對(duì)象是在Mybatis執(zhí)行的具體過程創(chuàng)建的,默認(rèn)使用的是SimpleExecutor對(duì)象

而SimpleExecuor,每次執(zhí)行SQL都會(huì)直接把SQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)

這也是我們Mybatis默認(rèn)的執(zhí)行引擎,但是實(shí)際在開發(fā)過程中,很多情況我們需要批量執(zhí)行insert或update等SQL,這時(shí)我們通常想到的是通過Mysql的foreach標(biāo)簽或原生的JdbcBatch方式進(jìn)行實(shí)現(xiàn)。

假設(shè)是foreach拼接SQL局限性很大,SQL過長(zhǎng)會(huì)產(chǎn)生多問題,如果是自己實(shí)現(xiàn)JdbcBatch當(dāng)然可以實(shí)現(xiàn),只是需要寫很多的代碼,且代碼的重用性也不好。

而BatchExecutor就是Mybatis對(duì)原生的JdbcBatch的封裝,在具體與Spring整合的過程中,我們只需要獨(dú)立的配置一個(gè)mybatis的jdbctemplate,把它的executor配置為batch即可通過for循環(huán)的方式實(shí)現(xiàn)批量insert或update。

當(dāng)?shù)谝粭lfor循環(huán)的語(yǔ)句mybatis只會(huì)執(zhí)行預(yù)編譯操作,而不會(huì)直接發(fā)送給數(shù)據(jù)庫(kù)執(zhí)行,只會(huì)會(huì)判斷,statement對(duì)象是否是同一個(gè),并且SQL語(yǔ)句是否一樣(這也是需要放在一個(gè)事物中的原因),如果都相同,則執(zhí)行jdbc的addBatch。下面是一個(gè)測(cè)試的代碼片段,用來(lái)說(shuō)明這段結(jié)論:

結(jié)合運(yùn)行日志查看結(jié)果,這里我insert了含有2條數(shù)據(jù)的list,下圖呈現(xiàn)Mybatis源碼片段

發(fā)現(xiàn)了我們熟悉的代碼Jdbc batch。

?

轉(zhuǎn)載于:https://my.oschina.net/lis1314/blog/912787

總結(jié)

以上是生活随笔為你收集整理的Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。