解决mybatis plus报错com.microsoft.sqlserver.jdbc.SQLServerException:必须执行该语句才能获得结果
作者:解咚咚
这篇文章主要介绍了解决mybatis plus报错com.microsoft.sqlserver.jdbc.SQLServerException:必须执行该语句才能获得结果,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
原因
这是因为是主键ID回填,但是要求该数据库提供的 JDBC 驱动可以支持返回批量插入的主键值(JDBC提供了接口,但并不是所有数据库都完美实现了该接口)因此到目前为止,可以完美支持该功能的仅有MySQL数据库。
由于SQL Server数据库官方提供的 JDBC 只能返回最后一个插入数据的主键值,所以不能支持该功能。
解决方法
针对 SQL Server数据库出现的这个报错信息,我将批量更新的那个方法进行了try catch 处理此异常,让程序继续执行下去,不进行回滚操作,毕竟实际的插入语句已经是执行成功了,数据已经插入到了数据库中,对于返回的ID值我可以不需要。
注意:
可能会漏插数据,需要注意!!!!!!
如果是在其他service中去用对应的service调用saveBatch方法的话会有异常Transaction rolled back because it has been marked as rollback-only 抛出。
这种原因是在对应的service中有事务标记,异常已经被标记未回滚,在进行try catch 是没用的。
需要在对应的service中使用saveBatch时进行try catch
例子
/** * @author xieTao * @date 2021-02-24 */ @Service @Transactional(rollbackFor = Exception.class) public class SysDockingBusinessServiceImpl extends ServiceImpl<SysDockingBusinessMapper, SysDockingBusiness> implements SysDockingBusinessService { @Resource private SysDockingDbFieldService sysDockingDbFieldService; @Override public void addDockingBusiness(SysDockingDb dockingDb, SysDockingBusiness dockingBusiness, List<SysDockingDbField> fieldList) { /**这样写的话会有异常Transaction rolled back because it has been marked as rollback-only 抛出 try{ sysDockingDbFieldService.saveBatch(fieldList); }catch (UncategorizedSQLException e){ e.printStackTrace(); } */ //将try catch 放到对应的server中处理完,将不会被标记为回滚 sysDockingDbFieldService.saveBatchDockingDbField(fieldList); } @Service @Transactional(rollbackFor = Exception.class) public class SysDockingDbFieldServiceImpl extends ServiceImpl<SysDockingDbFieldMapper, SysDockingDbField> implements SysDockingDbFieldService { @Override public void saveBatchDockingDbField(List<SysDockingDbField> fieldList) { try{ saveBatch(fieldList); }catch (UncategorizedSQLException e){ e.printStackTrace(); } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。