项目不规范引起的Mybatis Plus多数据源批量操作提示表不存在的问题

前段时间同事在项目当中使用到多数据源,项目集成的是mybatis plus ,遇到一个非常神仙的BUG,有数据源A ,数据源B,针对数据源A的所有操作都没有问题,针对数据源B的所有操作,除了批量的操作也都没有问题!!!

当进行批量操作的时候,发现会提示,xxx表不存在!!!,但是如果是查询数据,不批量进行操作,就可以查询出来,所以当遇到这个神仙BUG的时候,直接蒙圈了!!!

最后进行到处尝试,分析源码,等待各种方式,搞了一两天,终于知道原因了,mybatis plus里面的批量操作都没有走DAO层,是通过SqlSession进行的,然后数据源的切换是在DAO进行的。

分析到上面,本以为找到了问题,发现数据源的切换是手写的一个注解,这个注解在其他项目当中是完全没有出现这个问题的!!!最后一步一步跟踪代码分析发现主要原因是在项目配置多数据源的时候,会指定每个数据源的DAO层接口位置。然后将DAO接口位置和数据源的关系存储起来,然后调用DAO层的时候就调用对应的数据源。但是在这个项目当中,DAO层没有分包,两个数据源指定的DAO层位置都一样,就导致出现这个问题。

最终解决方式:DAO层按照数据源分包就可以了。

总结:按照规范来说项目多数据源的时候都是需要进行分包的,这样比较容易区分管理。也会避免很多不必要的问题!!!

### MyBatis Plus 中更新数据的方法与示例 MyBatis-Plus 提供了多种方法用于执行更新操作,这些方法可以满足同的业务需求。以下是几种常见的更新数据的方式及其对应的代码示例。 #### 使用 `updateById` 方法 `updateById` 是一种简单且常用的更新方法,适用于根据主键 ID 进行记录更新的情况。该方法会自动填充实体对象中的字段值并将其映射到数据库中对应列进行更新[^1]。 ```java // 假设有一个 User 实体类 User user = new User(); user.setId(1L); // 设置要更新的记录ID user.setName("张三"); // 修改名称 user.setAge(28); // 修改年龄 boolean result = userMapper.updateById(user); if (result) { System.out.println("更新成功"); } else { System.out.println("更新失败"); } ``` #### 使用 `update` 方法配合 Wrapper 条件构建器 当需要更复杂的条件更新时,可以通过 `update` 方法结合 Wrapper 构建动态 SQL 条件。 ```java LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(User::getId, 1L) // 设置更新条件:id=1 .set(User::getName, "李四") // 设置修改后的name值 .set(User::getAge, 30); // 设置修改后的age值 int rowsAffected = userMapper.update(null, updateWrapper); System.out.println("受影响的行数:" + rowsAffected); ``` #### 批量更新 对于批量更新的需求,MyBatis-Plus 并未提供内置的单次调用完成全部更新功能,但可通过循环多次调用上述方法者自定义 SQL 实现。 ```java List<User> userList = Arrays.asList( new User().setId(1L).setName("王五").setAge(25), new User().setId(2L).setName("赵六").setAge(35) ); for (User user : userList) { userMapper.updateById(user); } System.out.println("批量更新完成!"); ``` --- #### 数据权限注意事项 如果项目中有涉及数据权限控制,则需注意在更新过程中可能触发的数据权限校验逻辑。通常情况下,这会在拦截器层面实现,并通过注解等方式绑定特定规则至具体方法上[^2]。 例如: ```java @DS("slave") // 切换到从库(假设存在读写分离) @DataPermission(roleId = "admin", departmentId = "#department.id") public boolean updateUserProfile(Long userId, String name, Integer age) { User user = new User(); user.setId(userId); user.setName(name); user.setAge(age); return userMapper.updateById(user); } ``` 此处展示了如何利用自定义注解来限定某些敏感字段仅允许指定角色部门下的成员编辑。 --- #### 多数据源场景下更新操作多数据源环境下,确保每次更新请求都能正确指向目标数据源至关重要。借助 MyBatis-Plus 的 AOP 功能可轻松达成此目的[^3]。 配置完成后即可像平常一样编写 Mapper 层接口而无需额外关注底层切换细节: ```java @Mapper public interface SlaveUserMapper extends BaseMapper<User> {} @Service public class UserService { @Autowired private SlaveUserMapper slaveUserMapper; public void modifyOnSlaveDataSource() { User user = new User(); user.setId(1L); user.setName("测试用户"); slaveUserMapper.updateById(user); } } ``` 以上即为针对同情况设计的一些典型更新方案说明。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值