mybatis执行多条带分号的sql语句报错

一 . 原因及报错(模拟场景)


 <update id="test">
    UPDATE t_student SET name='33',age=22 WHERE stu_id = '1';
    UPDATE t_student SET name='33',age=22 WHERE stu_id = '2';
</update>
// 报错信息
### Error updating database. Cause: java.sql.SQLSyntaxErrorException: 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE t_student set name='33',age=22 WHERE stu_id = '2' at line 5 
### SQL: UPDATE t_student set name=?,age=? WHERE stu_id = ? ; UPDATE t_student set name=?,age=? WHERE stu_id = ? 
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE t_student set name='33',age=22 WHERE stu_id = '2' at line 5 ; 
    bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE t_student set name='33',age=22 WHERE stu_id = '2' at line 5

二 . 解决方法 : 在数据库连接配置的url上加上allowMultiQueries=true

spring:
  datasource:
    dynamic:
      # 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗
      p6spy: false
      hikari:
        connection-timeout: 30000
        max-lifetime: 1800000
        max-pool-size: 15
        min-idle: 5
        connection-test-query: select 1
      # 配置默认数据源
      primary: mysql
      datasource:
        # 数据源-1,名称为 primary
        mysql:
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/xx?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&autoReconnect=true&failOverReadOnly=false
          initialSize: 5
          minIdle: 5
          maxActive: 20
          maxWait: 60000
          timeBetweenEvictionRunsMillis: 60000
          minEvictableIdleTimeMillis: 30000
          validationQuery: SELECT 1 FROM DUAL
          testWhileIdle: true
          testOnBorrow: true
          testOnReturn: true

三 . 延伸学习--boot在配置数据库url上各个属性的意义及作用

     MySQL 8.0后版本驱动类名称为:"com.mysql.cj.jdbc.Driver"
     如果用于配置JDBC URL的机制是基于XML来配置的,请使用XML字符文字&amp;分隔配置参数,因为符号(&)是XML的保    留字符。

       更多具体的属性,请到MySQL官网查看

 属性描述默认值(缺省值)版本备注
高可用和集群属性配置(High Availability and Clustering. autoReconnect驱动程序是否应尝试重新建立过时和/或死掉的连接?如果启用,驱动程序将对在旧连接或死连接上发出的属于当前事务的查询引发异常,但将在新事务中对该连接发出的下一个查询之前尝试重新连接。不建议使用此功能,因为当应用程序不能正确处理SQLExceptions时,它会产生与会话状态和数据一致性相关的副作用,并且仅当您无法将应用程序配置为正确处理因死掉和过时的连接而导致的SQLExceptions时才使用此功能。或者,作为最后一个选项,研究将mysql服务器变量“wait_timeout”设置为高值,而不是默认的8小时。false1.1版本起 
autoReconnectForPools使用适用于连接池的重新连接策略(默认为“false”)false3.1.3版本起 
failOverReadOnly在autoReconnect模式下进行故障转移时,连接是否应设置为“只读”true3.0.12版本起在使用数据库连接池的情况下,且autoReconnect=true时最好设置该参数:failOverReadOnly=false
maxReconnects如果autoReconnect为true,则尝试重新连接的最大次数,默认为“3”。31.1版本起 
initialTimeout如果启用了autoReconnect,则在重新连接尝试之间等待的初始时间(以秒为单位,默认为“2”)。21.1版本起 
安全相关(Security)allowMultiQueries是否允许使用';'在一个语句中分隔多个查询(true/false),默认为'false',不影响addBatch()和executeBatch()方法,它们依赖于rewriteBatchStatements。falseSince version: 3.1.1 
useSSL与服务器通信时使用ssl(true/false),连接到MySQL5.5.45+、5.6.26+或5.7.6+时默认为“false”,其他版本默认为“truetrue|false(5.5.45+、5.6.26+或5.7.6+)  
其他useUnicode驱动程序在处理字符串时是否应使用Unicode字符编码?只应在驱动程序无法确定字符集映射时使用,或者您试图“强制”驱动程序使用MySQL本身不支持的字符集(例如UTF-8、gb2312或gbk),true / false ,默认为'true'true1.1g版本起必须设置为true,可能会导致中文数据乱码问题
characterEncoding如果'useUnicode'设置为true,那么驱动程序在处理字符串时应该使用什么字符编码?(默认为'自动检测')自动检测1.1g版本起当useUnicode设置为true时,指定字符编码。比如可设置为UTF-8、gb2312或gbk 
serverTimezone覆盖时区的检测/映射。当服务器的时区未映射到Java时区时使用 3.0.2版本起当数据库时区未映射到Java时区时可能导致Java代码中Date类型插入到mysql中datetime类型出现时间不一致的问题。例如:
上海:serverTimezone=Asia/Shanghai
简写:serverTimezone=CTT
北京:serverTimezone=UTC+8
或者:serverTimezone=GMT+8

 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 中,可以使用 `Mapper` 接口或者 `SqlSession` 直接执行多条 SQL 语句。 1. Mapper 接口方式 如果你使用的是 `Mapper` 接口方式,那么可以在 Mapper 接口中定义多个方法,每个方法对应一个 SQL 语句。然后在 Java 代码中调用这些方法即可执行多条 SQL 语句。 例如: ``` public interface UserMapper { void insertUser(User user); void updateUser(User user); void deleteUser(int userId); } ``` 在 Java 代码中,可以依次调用这三个方法来执行多条 SQL 语句: ``` UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.insertUser(user); mapper.updateUser(user); mapper.deleteUser(userId); ``` 2. SqlSession 方式 如果你使用的是 `SqlSession` 方式,那么可以调用 `SqlSession` 的 `selectList` 方法来执行多条 SQL 语句。在这个方法中,可以传入一个包含多条 SQL 语句的 XML 文件,并且在每条 SQL 语句之间使用分号分隔。 例如,假设你的 XML 文件名为 `multiSql.xml`,内容如下: ``` <sql> INSERT INTO user (name, age) VALUES ('John', 25); </sql> <sql> UPDATE user SET name = 'Peter' WHERE age = 25; </sql> ``` 那么在 Java 代码中,可以这样调用 `selectList` 方法来执行这两条 SQL 语句: ``` String statement = "multiSql"; sqlSession.selectList(statement); ``` 注意,在使用 `SqlSession` 执行多条 SQL 语句时,需要将 `ExecutorType` 设置为 `BATCH`,这样可以让 MyBatis多个 SQL 语句一起提交到数据库中,从而提高执行效率。例如: ``` SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值