对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() { //分库分表键全作为参数,则全部都要执行一遍。 ListorderDOList = orderMapper.selectList(null); System.out.println(Objects.isNull(orderDOList)); List collect = orderDOList.stream().map(obj -> obj.getStoreId()).distinct().collect(Collectors.toList()); List collect1 = orderDOList.stream().map(obj -> obj.getId()).distinct().collect(Collectors.toList()); orderMapper.updateBatchOrderDoList(collect, collect1, CommonUtil.getYearList() ); } void updateBatchOrderDoList(@Param("store_id_list")List storeIdList, @Param("order_id_list")List orderIdList, @Param("year_list")List yearList); UPDATE t_order bo SET no='2222222' #{item} #{item} #{item}
1、分库分表
根据分库键【store_id】分为两个list,分别更新。
public staticvoid splitAndProcess(List sourceList, Predicate condition, Consumer > action) { List
matchingItems = new ArrayList<>(); List 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 t_order_${vo.year} t_order set no=3 where id = #{vo.id} and year = #{vo.year} and store_id=#{vo.storeId}
2、分表未分库
如果是统一的数据更新,比如student表,更新所有学生的name为‘张三’,可以直接用updateById。
使用sql语句话
update s_stduent set age = age + 1 id=#{id} #{item}