javascript
Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想
2019獨角獸企業重金招聘Python工程師標準>>>
之所以寫這篇文章,主要是給新手提供一些mybatis使用的技巧和思路
現在國內很多項目都使用了mybatis作為ORM框架
我們在實際的使用過程中基本上都會遇到批量insert update等操作
在網上搜索一些文章,大多數都是在說使用mybatis forEach標簽迭代等。。。
實際上這種做法是存在很多問題的,比如SQL過長..等限制
于是乎我們自己使用原生的JDBC batch批量執行insert或update等操作
但是很多人并不知道mybatis實際上是提供了這種批量操作實現的
同時還有關于mybatis分頁的問題...我們設想,select語句我們只寫原生的,是否能自動完成分頁等功能?
抽象Service實現單表操作問題,這里我的設計其實也很簡單,具體參看項目源碼,相信大家都看得懂。
并沒有做到完全的自動化,底層的SQL還是需要自己寫XML文件的,只是代碼層通過統一的命名規范做了命名標準,簡化了代碼的編寫
-------------------------------------------分割線-------------------------------------------
廢話說多了,下面進入正題
如何整合?
具體參看:http://git.oschina.net/lis1314/mybatis-spring-demo
這里只說重點
1、關于批量insert或update問題
applicationContext.xml 中配置的
<!--單獨配置一個執行JDBC批量操作的session,底層等于sqlSessionFactory.openSession(ExecutorType.BATCH); 底層使用org.apache.ibatis.executor.BatchExecutor作為執行引擎 --> <bean id="batchSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory"/><constructor-arg index="1" value="BATCH"/> </bean>這個是配置一個mybatis對JdbcBatch操作的執行模板,mybatis在執行SQL的時候,底層會創建一個執行引擎,org.apache.ibatis.executor.Executor它是一個接口,默認使用的實現類有如下
實際上我們關心的只有SimpleExecutor,BatchExecutor這兩個,默認的使用是SimpleExecutor
我們在上面配置的模板就是改變它的執行引擎,讓它使用BatchExecutor作為執行引擎,如果想了解更詳細可以閱讀源碼,具體的Executor創建在org.apache.ibatis.session.Configuration
2、關于mybatis分頁問題
思路是自己寫一個mybatis的插件,攔截mybatis的執行引擎,重置原生的SQL語句
具體的實現參看上面的工程,這里使用的是https://github.com/pagehelper/Mybatis-PageHelper
3、關于例子運行工程中com.mybatis.demo.test.StudentServiceTest
按照順序執行,并查看控制臺的SQL語句,可以得出結論
?
4、補充簡述Mybatis batch原理--選讀
首先我們看一張圖簡單了解下Mybatis數據處理架構
?
這里我們重點關注Executor,Executor對象是在Mybatis執行的具體過程創建的,默認使用的是SimpleExecutor對象
而SimpleExecuor,每次執行SQL都會直接把SQL語句發送給數據庫
這也是我們Mybatis默認的執行引擎,但是實際在開發過程中,很多情況我們需要批量執行insert或update等SQL,這時我們通常想到的是通過Mysql的foreach標簽或原生的JdbcBatch方式進行實現。
假設是foreach拼接SQL局限性很大,SQL過長會產生多問題,如果是自己實現JdbcBatch當然可以實現,只是需要寫很多的代碼,且代碼的重用性也不好。
而BatchExecutor就是Mybatis對原生的JdbcBatch的封裝,在具體與Spring整合的過程中,我們只需要獨立的配置一個mybatis的jdbctemplate,把它的executor配置為batch即可通過for循環的方式實現批量insert或update。
當第一條for循環的語句mybatis只會執行預編譯操作,而不會直接發送給數據庫執行,只會會判斷,statement對象是否是同一個,并且SQL語句是否一樣(這也是需要放在一個事物中的原因),如果都相同,則執行jdbc的addBatch。下面是一個測試的代碼片段,用來說明這段結論:
結合運行日志查看結果,這里我insert了含有2條數據的list,下圖呈現Mybatis源碼片段
發現了我們熟悉的代碼Jdbc batch。
?
轉載于:https://my.oschina.net/lis1314/blog/912787
總結
以上是生活随笔為你收集整理的Spring和Mybatis集成,如何批量insert update?以及一些通用Dao的设想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网高并发架构技术实践
- 下一篇: 微软回应 CIA 漏洞攻击 Win10