MyBatis如何配置多sql脚本执行

 更新时间:2023年03月31日 09:26:30   作者:今夜无风亦无雨  
这篇文章主要介绍了MyBatis如何配置多sql脚本执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MyBatis配置多sql脚本执行

在实际开发场景中,有时候为了减少代码的冗余,在编写数据执行方法时,希望一个方法同时执行两个sql脚本,顺序执行,不影响业务逻辑。

1、在数据源配置中增加如下配置:allowMultiQueries=true

spring:
  profiles: dev
  datasource:
    #主数据源
    master:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowMultiQueries=true
      username: root
      password: 123456

2、多sql语句以分号;相隔

<update id="updateId" parameterType="java.lang.Integer">
        update t_menu set name = #{name} where id = #{id};
        update t_stu set order_no = order_no+1 where id = #{id};
</update>

注意:多条sql语句同时执行,不存在事务,即其中一条sql语句报错不会影响另外一条语句执行。

解决办法:

在service层方法里添加@Transactional注解,添加@Transactional注解后,spring默认抛出未检查unchecked异常(继承自RuntimeException的异常)或者Error才会回滚,换句话说,若只是添加@Transactional注解,对于RuntimeException异常或者Error错误默认会触发事务回滚,对于其他的异常是不会触发异常的,若此时想要其他异常也能触发回滚,需要添加@Transactional的rollbackFor属性值,比如在代码中手动抛出Exception异常

如下:

if (res > 0) {
      // 抛出异常,事物捕抓异常,事物进行回滚
      throw new Exception("无权限审批!");
}

此时加上rollbackFor属性值如下,当出现Exception异常时,可以触发事务回滚。 

@Transactional(rollbackFor = Exception.class)

建议:自定义一个异常处理类,该异常类继承RuntimeException类,在需要抛出异常时,调用该自定义异常类,此时方法执行出现异常,会抛出RuntimeException,在方法头加上@Transactional即可,而不需要添加rollbackFor属性值。

MyBatis一次执行多条sql,一个标签多个Insert、update、delete

再平时的工作、学习中,我们会遇见插入,修改,删除多个表的操作,我们不可能写多条insert标签等,这就需要在一个标签中写多个SQL语句

  <insert id="addPurchase" parameterType="com.zhao.vo.PurchaseVoOne">
        insert into enters_sells_saves.purchase ( amount, price, purchase_time)
        values (#{amount},#{price},#{purchaseTime});
        insert into enters_sells_saves.goods (goods_name)
        values (#{goodsName});
        insert into enters_sells_saves.supplier (supplier_name)
        values (#{supplierName});
    </insert>

需要我们在数据库连接配置中加入:

allowMultiQueries=true

如:

jdbc:mysql://localhost:3306/enters_sells_saves?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT&allowMultiQueries=true

这样就可以在一个标签中使用多个sql语句了

总结

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

相关文章

  • spring中@ControllerAdvice 注解的使用

    spring中@ControllerAdvice 注解的使用

    @ControllerAdvice注解是Spring3.2中新增的注解,主要用于Controller的全局配置,本文就来介绍一下spring中@ControllerAdvice 注解的使用,感兴趣的可以了解一下
    2024-09-09
  • Java NIO 通道概念选择器使用示例详解

    Java NIO 通道概念选择器使用示例详解

    这篇文章主要为大家介绍了Java NIO 通道概念选择器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Spring无法接收List<event>的解决方案

    Spring无法接收List<event>的解决方案

    在日常开发中,我们常使用 Spring 的 @EventListener 注解来监听事件,但在处理 批量事件 时,却可能遇到一些“看似合理但无法生效”的监听方式,本文以实际具体案例为出发点,结合源码分析事件派发逻辑,并给出两种可行解决方案,需要的朋友可以参考下
    2025-04-04
  • Java实现求解一元n次多项式的方法示例

    Java实现求解一元n次多项式的方法示例

    这篇文章主要介绍了Java实现求解一元n次多项式的方法,涉及java高斯消元法处理矩阵运算解多项式的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • SpringBoot使用Flyway进行数据库迁移的实现示例

    SpringBoot使用Flyway进行数据库迁移的实现示例

    Flyway是一个数据库迁移工具,它提供迁移历史和回滚的功能,本文主要介绍了如何使用Flyway来管理Spring Boot应用程序中的SQL数据库架构,感兴趣的可以了解一下
    2023-08-08
  • Java-IO流实验

    Java-IO流实验

    流是一种抽象概念,它代表了数据的无结构化传递。。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出,希望能给您带来帮助
    2021-06-06
  • Spring的CorsFilter会失效的原因及解决方法

    Spring的CorsFilter会失效的原因及解决方法

    众所周知CorsFilter是Spring提供的跨域过滤器,我们可能会做以下的配置,基本上就是允许任何跨域请求,我利用Spring的CorsFilter做跨域操作但是出现报错,接下来小编就给大家介绍一Spring的CorsFilter会失效的原因及解决方法,需要的朋友可以参考下
    2023-09-09
  • Java+MySQL实现设计优惠券系统

    Java+MySQL实现设计优惠券系统

    这篇文章主要介绍了Java+MySQL实现设计优惠券系统,文章基于Java与MySQL的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • java8学习教程之lambda表达式的使用方法

    java8学习教程之lambda表达式的使用方法

    Java8最值得学习的特性就是Lambda表达式,下面这篇文章主要给大家介绍了关于java8学习教程之lambda表达式使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • java读取解析xml文件实例

    java读取解析xml文件实例

    这篇文章主要介绍了java读取解析xml文件实例,本文创建了一个XML解析类同时讲解了循环节点输出方式,需要的朋友可以参考下
    2015-03-03

最新评论