解決sharding JDBC 不支持批量導(dǎo)入問題
sharding JDBC 不支持批量導(dǎo)入
package com.ydmes.service.impl.log; import com.ydmes.domain.entity.log.BarTraceBackLog; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import java.util.List; @Component public class BarTraceBackLogBatchServiceImpl implements ApplicationContextAware { private static ApplicationContext applicationContext; public void batchInsertBarTraceBackLogs(List<BarTraceBackLog> barTraceBackLogs) { DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) applicationContext.getBean("shardingTransactitonManager"); TransactionStatus transactionStatus = transactionManager.getTransaction(definition); for (BarTraceBackLog barTraceBackLog : barTraceBackLogs) { //UserDao有create方法,單條插入 applicationContext.getBean(BarTraceBackLogServiceImpl.class).insertSelective(barTraceBackLog); } transactionManager.commit(transactionStatus); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
sharding-jdbc不支持多條sql語句批量更新
今天項(xiàng)目有個(gè)刷數(shù)據(jù)的需求,單條數(shù)據(jù)修改太慢,想著寫個(gè)批量update,三兩下把sql寫好了,發(fā)現(xiàn)分表不支持,sharding-jdbc只會(huì)把我第一個(gè)表名填充成正確表名,后面的表名都沒有修改。
mybastis如下:
<update id="batchUpdate" > <foreach collection="userList" item="item" index="index" separator=";"> update t_user_data set `province_id`=#{item.provinceId} where member_id = #{item.memberId} </foreach> </update>
sql如下:
update t_user_data_1 set `province_id`=?,`region_id`=? where member_id = ? ; update t_user_data set `province_id`=?,`region_id`=? where member_id = ? ;
由此可見,這多條sql語句更新是不支持的。
修改思路
既然表名不支持自動(dòng)多個(gè),那我就自己替換表名,
先在代碼中根據(jù)表的分表規(guī)則得到表名,在賦值在每個(gè)sql語句上
代碼如下:
userData1.setTableName("t_user_data_" + userData.getMemberId() % 8);
比如我這張表分了八個(gè)表,則按8取余這樣每個(gè)條數(shù)據(jù)都對(duì)應(yīng)好了表名,
mybastis如下:
<update id="batchUpdate" > <foreach collection="userList" item="item" index="index" separator=";"> update ${item.tableName} set `province_id`=#{item.provinceId} where member_id = #{item.memberId} </foreach> </update>
這里需要注意一下:表名和列名需要用${}來傳入,參數(shù)才用#{}。
最終sql如下:
update t_user_data_1 set `province_id`=?,`region_id`=? where member_id = ? ; update t_user_data_2 set `province_id`=?,`region_id`=? where member_id = ? ;
這樣便解決了批量更新問題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何用120行Java代碼寫一個(gè)自己的區(qū)塊鏈
這篇文章就是幫助你使用 Java 語言來實(shí)現(xiàn)一個(gè)簡單的區(qū)塊鏈,用不到 120 行代碼來揭示區(qū)塊鏈的原理,感興趣的就一起來了解一下2019-06-06論java如何通過反射獲得方法真實(shí)參數(shù)名及擴(kuò)展研究
這篇文章主要為大家介紹了java如何通過反射獲得方法的真實(shí)參數(shù)名以及擴(kuò)展研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪2022-01-01SpringBoot整合SQLite數(shù)據(jù)庫全過程
sqlite是一個(gè)很輕量級(jí)的數(shù)據(jù)庫,可以滿足日常sql的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合SQLite數(shù)據(jù)庫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03