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

例子

/**
 * @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();
        }

    }
}


   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值