办理bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorEx ...

打印 上一主题 下一主题

主题 547|帖子 547|积分 1641

办理Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题


  
在使用Spring Boot连接MySQL数据库时,偶然候会遇到“Bad SQL Grammar”错误,这种错误通常在实行SQL语句时发生。本文针对的是对于实行多条SQL语句的情况。
问题描述

出现错误的SQL语句如下:
  1. <delete id="truncateUserInfo">
  2.     truncate table  sys_user;
  3.     truncate table  sys_user_info;
  4.     truncate table  sys_role_info;
  5. </delete>
复制代码
实行这个SQL语句时,可能会抛出BadSqlGrammarException,错误信息如下:
  1. org.springframework.jdbc.BadSqlGrammarException:
  2. ### 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 'truncate table  sys_user_info;
  3.         truncate table  sys_role_info' at line 2
  4. ### The error may exist in file [...\CUserInfoMapper.xml]
  5. ### The error may involve defaultParameterMap
  6. ### The error occurred while setting parameters
  7. ### SQL: truncate table  sys_user;         truncate table  sys_user_info;         truncate table  sys_role_info;
  8. ### 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 'truncate table  sys_user_info;
  9.         truncate table  sys_role_info' at line 2
  10. ; 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 'truncate table  sys_user_info;
  11.         truncate table  sys_role_info' at line 2
复制代码
同时,上层代码中调用该SQL语句的方法如下:
  1. this.baseMapper.truncateUserInfo();
复制代码
办理步调

起首确认SQL语句本身没有问题,并且该代码在其他项目中可以正常运行。确保底层SQL与上层调用的代码都没有逻辑问题,所以“bad SQL grammar []”应该是由设置文件导致的,查抄项目的application.yml文件中的MySQL连接设置参数
办理方案

这种错误通常是由于MySQL默认情况下不允许一次实行多个SQL语句,而这里的SQL语句包含了多个truncate语句。办理方案是在MySQL连接设置中添加allowMultiQueries=true参数,允许一次实行多个SQL语句。
找到项目的application.yml或application.properties文件,添加如下设置:
  1. datasource:
  2.     master:
  3.         url: jdbc:mysql://your-mysql-url:3306/your-database?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&allowMultiQueries=true
  4.         # 其他配置项...
复制代码
这里的关键是在url参数中添加了&allowMultiQueries=true。这个设置项允许MyBatis实行多个SQL查询语句(以’;'分隔)。
结论

通过在MySQL连接设置中添加allowMultiQueries=true参数,我们乐成办理了实行多条SQL语句时出现的“Bad SQL Grammar”错误。这种设置的使用对于一些特殊的SQL语句实行场景非常有资助,但必要审慎使用,确保SQL语句的合法性和安全性。
附:MySql常用设置参数及使用场景

MySQL连接设置中有一些常用的参数,这些参数可以在数据库连接字符串(URL)中举行设置。以下是一些常见的MySQL连接参数及其使用场景和作用:

  • url

    • 作用: 指定数据库的连接地址。
    • 使用场景: 必须设置,用于指定MySQL数据库的连接地址。

  • driver-class-name

    • 作用: 指定数据库驱动类的全限定名。
    • 使用场景: 必须设置,用于加载MySQL数据库的JDBC驱动。

  • username

    • 作用: 指定连接数据库的用户名。
    • 使用场景: 必须设置,用于指定数据库连接的用户名。

  • password

    • 作用: 指定连接数据库的密码。
    • 使用场景: 必须设置,用于指定数据库连接的密码。

  • useSSL

    • 作用: 是否使用SSL加密连接。
    • 使用场景: 在必要安全传输数据的情况下设置为false,大概在不必要SSL加密的本地开发情况中设置为false。

  • serverTimezone

    • 作用: 指定服务器时区。
    • 使用场景: 在使用JDBC连接MySQL时,如果发生时区错误,可以通过此参数指定服务器时区,以办理时区不匹配的问题。

  • allowPublicKeyRetrieval

    • 作用: 是否允许使用非加密连接时获取服务器RSA公钥。
    • 使用场景: 设置为true表示允许,设置为false表示不允许。

  • nullCatalogMeansCurrent

    • 作用: NULL数据库/表名剖析方式。
    • 使用场景: 在一些特殊情况下,当NULL被解释为使用当前catalog(数据库)时,设置为true;设置为false时,可能会抛出非常。此设置重要应对一些脚本或代码中使用NULL作为表名或列名的情况。

  • allowMultiQueries

    • 作用: 是否允许实行多个SQL查询语句(以’;'分隔)。
    • 使用场景: 当必要在一个SQL语句中实行多个以分号分隔的查询时,设置为true。默认为false,只允许单个查询语句。此设置重要用于支持在 Mapper XML 文件中编写包含多个语句的 SQL 映射,大概在一个 Java 方法中实行多个语句。

  • autoReconnect

    • 作用: 是否自动重新连接。
    • 使用场景: 在网络不稳定的情况下,设置为true可以使连接断开时自动尝试重新连接。

  • maxReconnects

    • 作用: 在自动重新连接模式下,尝试重新连接的最大次数。
    • 使用场景: 设置自动重新连接时,可以指定最大尝试次数。

  • useUnicode

    • 作用: 是否使用Unicode字符集。
    • 使用场景: 在必要支持Unicode字符集的情况下,设置为true。

这些连接参数可以根据具体的需求举行设置,确保数据库连接的安全性和性能。在不同的场景中,可以机动选择和调整这些参数以满足应用程序的要求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表