解决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();
        }

    }
}

总结

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

相关文章

  • Spring Boot2.6.0新特性之默认禁止循环引用

    Spring Boot2.6.0新特性之默认禁止循环引用

    Spring Boot2.6.0为我们带来很多好用的新特性/改进,这篇文章主要给大家介绍了关于Spring Boot2.6.0新特性之默认禁止循环引用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java通过百度地图API获取定位(普通IP定位)的方法教程

    Java通过百度地图API获取定位(普通IP定位)的方法教程

    这篇文章主要介绍了Java通过百度地图API获取定位的方法教程,首先说明了实现这个功能的需求和初衷,然后详细描述了利用百度地图API实现这个功能的步骤,包括在百度地图开放平台的准备工作、学习官网API文档、修改API的AK配置、Java代码获取定位等,需要的朋友可以参考下
    2024-11-11
  • SpringBoot的reload加载器的方法

    SpringBoot的reload加载器的方法

    本篇文章主要介绍了SpringBoot的reload加载器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java中的ThreadLocal源码及弱引用解析

    Java中的ThreadLocal源码及弱引用解析

    这篇文章主要介绍了Java中的ThreadLocal源码及弱引用解析,ThreadLocal类通过ThreadLocal可以实现全局变量在多线程环境下的线程隔离,每个线程都可以独立地访问和修改自己的全局变量副本,不会影响其他线程的副本,需要的朋友可以参考下
    2024-01-01
  • SpringBoot应用自定义logback日志详解

    SpringBoot应用自定义logback日志详解

    默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。本篇文章主要讲解下如何自定义logabck.xml以及对logback文件中配置做一个详解,需要的可以参考一下
    2022-10-10
  • java打印表格 将ResultSet中的数据打印成表格问题

    java打印表格 将ResultSet中的数据打印成表格问题

    这篇文章主要介绍了java打印表格 将ResultSet中的数据打印成表格问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 基于Quartz定时调度任务(详解)

    基于Quartz定时调度任务(详解)

    下面小编就为大家带来一篇基于Quartz定时调度任务(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • JAVA(MAVEN项目)添加JUnit依赖配置全过程

    JAVA(MAVEN项目)添加JUnit依赖配置全过程

    在Maven项目中进行单元测试是确保代码质量的重要步骤,本教程提供SpringBoot和微服务平台适用的单元测试方法,包括环境准备、创建测试类、JUnit简介及注解使用,环境准备涉及引入依赖和安装JUnit插件,测试类创建可通过快捷键或手动添加@Test注解来实现
    2024-10-10
  • 详解Java如何实现与JS相同的Des加解密算法

    详解Java如何实现与JS相同的Des加解密算法

    这篇文章主要介绍了如何在Java中实现与JavaScript相同的DES(Data Encryption Standard)加解密算法,确保在两个平台之间可以无缝地传递加密信息,希望对大家有一定的帮助
    2025-04-04
  • Java静态static关键字原理详解

    Java静态static关键字原理详解

    这篇文章主要介绍了Java静态static关键字原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论