解决mybatis plus报错com.microsoft.sqlserver.jdbc.SQLServerException:必须执行该语句才能获得结果

 更新时间:2024年05月17日 09:45:37   作者:解咚咚  
这篇文章主要介绍了解决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();
        }

    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何使用Code128字体将文本转换为code128条形码

    如何使用Code128字体将文本转换为code128条形码

    这篇文章主要介绍了如何使用Code128字体将文本转换为code128条形码 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Java创建内部类对象实例详解

    Java创建内部类对象实例详解

    这篇文章主要介绍了Java创建内部类对象实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java 如何从spring容器中获取注入的bean对象

    Java 如何从spring容器中获取注入的bean对象

    这篇文章主要介绍了Java 如何从spring容器中获取注入的bean对象,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • SpringMVC中RequestContextHolder获取请求信息的方法

    SpringMVC中RequestContextHolder获取请求信息的方法

    这篇文章主要介绍了SpringMVC中RequestContextHolder获取请求信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java 继承原理与用法实例分析

    Java 继承原理与用法实例分析

    这篇文章主要介绍了Java 继承原理与用法,结合实例形式分析了java面向对象程序设计中继承的概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2019-06-06
  • Java利用POI读写Excel文件工具类

    Java利用POI读写Excel文件工具类

    这篇文章主要为大家详细介绍了Java利用POI读写Excel文件的工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • ssh框架实现文件上传下载实例代码

    ssh框架实现文件上传下载实例代码

    本篇文章主要介绍了ssh框架文件上传下载实例代码,实例分析了Spring+struts+Hibernate的使用技巧,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • Feign如何解决服务之间调用传递token

    Feign如何解决服务之间调用传递token

    这篇文章主要介绍了Feign如何解决服务之间调用传递token,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java实现批量向mysql写入数据的方法

    Java实现批量向mysql写入数据的方法

    这篇文章主要介绍了Java实现批量向mysql写入数据的方法,涉及java基于JDBC连接mysql数据库及写入数据的相关操作技巧,非常简单实用,需要的朋友可以参考下
    2017-12-12
  • springboot2.x整合redis知识点讲解

    springboot2.x整合redis知识点讲解

    在本篇文章中小编给大家分享的是一篇关于springboot2.x整合redis知识点内容,有兴趣的朋友们可以学习下。
    2020-01-01

最新评论