对ShardingJDBC基础了解:https://blog.csdn.net/m0_63297646/article/details/131894472
对批量操作案例:https://blog.csdn.net/m0_63297646/article/details/131843517
分为db0和db1两个库,每个库都有三张订单表,分表键根据年份【year】,分库键根据店铺id【store_id】
在db0中存在两张学生信息表,分表键根据年份【year】
一、插入
插入时,对象要带有分库/分表键的值,shardingJdbc会进行改写。一次性插入。
1、分表未分库
2、分库分表
二、更新
代码简单,但是会增加逻辑。
db0和db1都会执行,且因为店铺id集合包含两个库的数据,所有的订单都会在两个库重复执行。
建议:在stream所有店铺id时,可以加一个distinct,避免大量重复数据。
@Test void test15() { //分库分表键全作为参数,则全部都要执行一遍。 List<OrderDO> orderDOList = orderMapper.selectList(null); System.out.println(Objects.isNull(orderDOList)); List<Long> collect = orderDOList.stream().map(obj -> obj.getStoreId()).distinct().collect(Collectors.toList()); List<Long> collect1 = orderDOList.stream().map(obj -> obj.getId()).distinct().collect(Collectors.toList()); orderMapper.updateBatchOrderDoList(collect, collect1, CommonUtil.getYearList() ); } void updateBatchOrderDoList(@Param("store_id_list")List<Long> storeIdList, @Param("order_id_list")List<Long> orderIdList, @Param("year_list")List<Integer> yearList); <update id="updateBatchOrderDoList"> UPDATE t_order bo SET no='2222222' <where> <foreach collection="year_list" separator="," item="item" open=" AND bo.year IN (" close=")"> #{item} </foreach> <foreach collection="order_id_list" item="item" separator="," open=" AND bo.id IN (" close=")"> #{item} </foreach> <foreach collection="store_id_list" item="item" separator="," open=" AND bo.store_id IN (" close=")"> #{item} </foreach> </where> </update>
1、分库分表
根据分库键【store_id】分为两个list,分别更新。
public static <T> void splitAndProcess(List<T> sourceList, Predicate<T> condition, Consumer<List<T>> action) { List<T> matchingItems = new ArrayList<>(); List<T> nonMatchingItems = new ArrayList<>(); for (T obj : sourceList) { if (condition.test(obj)) { matchingItems.add(obj); } else { nonMatchingItems.add(obj); } } action.accept(matchingItems); action.accept(nonMatchingItems); }splitAndProcess(orderDOList, obj -> obj.getStoreId() % 2 == 0, splitList -> { orderMapper.batchUpdate(splitList); });
注意:如果使用下面这种sql方式,需要更新0库1库两个库的数据,路由只会进入一个更新,导致没有所有的数据更新。
<update id="batchUpdate"> <foreach collection="list" item="vo" index="idx" separator=";"> update <if test="idx > 0"> t_order_${vo.year} </if> <if test="idx == 0"> t_order </if> set no=3 where id = #{vo.id} and year = #{vo.year} and store_id=#{vo.storeId} </foreach> </update>
2、分表未分库
如果是统一的数据更新,比如student表,更新所有学生的name为‘张三’,可以直接用updateById。文章来源:https://www.toymoban.com/news/detail-691764.html
使用sql语句话文章来源地址https://www.toymoban.com/news/detail-691764.html
<update id="updateStduent"> update s_stduent set age = age + 1 <where> id=#{id} <foreach collection="year_list" item="item" separator="," open=" AND year IN (" close=")"> #{item} </foreach> </where> </update>
到了这里,关于对分库分表进行批量操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!