Closed qinfy closed 7 months ago
重写为 后正常
你这两张图里的代码,哪里不一样?
- getSqlStatement(SqlMethod.UPDATE_BY_ID)
+ sqlStatement(SqlMethod.UPDATE_BY_ID)
提供你的工程样例过来看下.
同样的问题,我不明白为何要将'sqlStatement'更改为'getSqlStatement'的逻辑。改回'sqlStatement'则业务恢复正常。
@Override
protected String getSqlStatement(SqlMethod sqlMethod) {
return super.sqlStatement(sqlMethod);
}
当前使用版本(必填,否则不予处理)
3.5.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
由3.1.0版本升级到3.5.1版本 3.3.3版本对com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#sqlStatement方法做了过时处理导致的
重现步骤(如果有就写完整)
1、创建自己的IBaseMapper、IBaseService、 IBaseServiceImpl 继承 Mybatis-Plus 提供的基类 base mapper:
public interface IBaseMapper<T> extends BaseMapper<T> {}
base service:public interface IBaseService<T> extends IService<T> {}
base serviceImpl:public class IBaseServiceImpl<M extends IBaseMapper<T>, T> extends ServiceImpl<IBaseMapper<T>, T> implements IBaseService<T> {}
业务类mapper、service、serviceImpl都继承自己的base mapper、base service、 base serviceImpl2、业务类serviceImpl里调用批量更新方法updateBatchById 3.3.3之前都正常,升级3.3.3之后抛异常
报错信息
`org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
Error updating database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for cn.com.dhcc.platform.core.common.mapper.IBaseMapper.updateById
Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for cn.com.dhcc.platform.core.common.mapper.IBaseMapper.updateById
报错信息中的cn.com.dhcc.platform.core.common.mapper.IBaseMapper.updateById为自己的基类,继承了 Mybatis-Plus 提供的基类(第1条中的base mapper)
经排查是MybatisPlus对批量方法重新实现, com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#updateBatchById 中的String sqlStatement = sqlStatement(SqlMethod.UPDATE_BY_ID);改为了String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID); sqlStatement方法在3.3.3版本做了过时处理。 旧版本的sqlStatement和新版本的getSqlStatement方法类反射处理时有区别,不清楚这么做的原因。
在自己的IBaseServiceImpl 中按3.3.3之前的逻辑重写为遍历更新后错误解决,但无法使用新的批量处理逻辑