javascript
Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网高并发架构技术实践
- 下一篇: 微软回应 CIA 漏洞攻击 Win10