如果用JDBC

jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

如果用阿里巴巴的数据源

Druid是阿里巴巴,开发的一个数据库连接池工具,经历过多次双十一的洗礼,它的性能已经能够满足国内大多数项目的需求。

异常一:

项目中启用Druid的统计管理,在执行批量修改时:提示Error updating database.  Cause: java.sql.SQLException: sql injection violation, multi-statement not allow 。

提示:违反sql注入:多声明不被允许

以下是栈异常输出:

  1. Caused by: java.sql.SQLException: sql injection violation, multi-statement not allow : UPDATE
  2. t_single_project_score
  3. SET update_time=now() ,
  4. is_delete = 1 ,
  5. operator =?
  6. WHERE
  7. student_id IN (?)
  8. AND school_year IN(
  9. ?
  10. )
  11. AND is_delete = 0
  12. ;
  13. UPDATE
  14. t_single_project_score
  15. SET update_time=now() ,
  16. is_delete = 1 ,
  17. operator =?
  18. WHERE
  19. student_id IN (?)
  20. AND school_year IN(
  21. ?
  22. )
  23. AND is_delete = 0
  24. at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:800)
  25. at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:251)
  26. at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
  27. at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:929)
  28. at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
  29. at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:929)
  30. at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122)
  31. at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
  32. at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342)
  33. at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:349)
  34. at com.p6spy.engine.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:119)
  35. at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87)
  36. at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
  37. at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
  38. at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85)
  39. at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
  40. at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
  41. at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
  42. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  43. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  44. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  45. at java.lang.reflect.Method.invoke(Method.java:483)
  46. at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
  47. at com.sun.proxy.$Proxy44.update(Unknown Source)
  48. at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
  49. at org.apache.ibatis.session.defaults.DefaultSqlSession.delete(DefaultSqlSession.java:213)
  50. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  51. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  52. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  53. at java.lang.reflect.Method.invoke(Method.java:483)
  54. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
  55. ... 52 more

通过异常栈输出出现异常如何分析解决?

在输出的日志里,找到关键信息:

  1. at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:800)

这是在spring-db.xml的wall-filter这个 bean中报出的异常:

在这个WallFilter找到checkInternal方法,就会看到提示的错误信息前半部分:sql injection violation

查看check()方法-->checkInternal()方法

找到异常后半段:multi-statement not allow。造成打印这个异常消息的原因是config.ismultiStatementAllow()为false

解决方法:把multiStatementAllow修改成true即可

  1. <!--在spring-db.xml的wall-filter中添加config,修改后如下-->
  2. <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
  3. <property name="dbType" value="mysql"/>
  4. <!--<property name="config" ref="wall-config"/>-->
  5. </bean>
  6. <!--解决mybatis与druid集成后,wallFilter sql注入异常-->
  7. <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig">
  8. <property name="multiStatementAllow" value="true"/>
  9. </bean>

了解wall-filter:通过官方文档配置

异常二: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

  1. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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
  2. 'UPDATE
  3. t_single_project_score
  4. SET update_time=now() , '

参考:

【sql关键字冲突】https://www.cnblogs.com/zzxbest/archive/2011/09/22/2185029.html

【sql关键字冲突】http://blog.csdn.net/qq_34698126/article/details/53128746

解决方法:这个问题一直报sql语法问题,删除wall-filter的bean和wall-config的bean,同时在jdbc上加上allowMultiQueries=true&,问题得到了解决。

分析:wall-filter会拦截多次声明请求的循环sql语句,即使设置为true,还会检测到sql语句间的';'分号会视为sql已经结束,所以有sql循环,第二个sql语句就会报出异常。

mybatis 一次执行多条SQL MySql+Mybatis+Druid之SqlException:sql injection violation, multi-statement not allow的更多相关文章

  1. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  2. mybatis 一次执行多条SQL

    在默认情况下,一次性发过去的多条sql是不合法的. 想要让mysql一次执行多条sql语句,必须进行手动设置. 让mysql驱动开启批量执行sql的开关. 怎么开启呢?在拼装mysql链接的url时, ...

  3. MySQL命令行导入导出sql文件

    linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构(常用):mysqldump -u用户名 -p密码 数据库名 > 数据库名. ...

  4. mybatis执行多条sql语句

    1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...

  5. springBoot + mybatis实现执行多条sql语句出错解决方法

    在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...

  6. mysql基础-- 一条请求执行多条SQL语句

    最近做一个数据库初始化工具的时候发现了这个问题,就是在一个Statement中执行一条SQL语句的时候可以正确执行,如果同时执行多条,就会报SQL语法错误,伤透了脑筋. 经过网上查找,发现有两种解决办 ...

  7. mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

  8. Jmeter连接MySQL配置(能执行多条sql语句)

    Database URL为MySQL的连接串,如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”

  9. [mybatis] sql语句无错误,但是执行多条sql语句时,抛出java.sql.SQLSyntaxErrorException

    错误内容 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.S ...

随机推荐

  1. HBase设计与开发

    HBase设计与开发 @(HBase) 适合HBase应用的场景 成熟的数据分析主题,查询模式已经确定且不会轻易改变. 传统数据库无法承受负载. 简单的查询模式. 基本概念 行健:是hbase表自带的 ...

  2. Android平台Camera实时滤镜实现方法探讨(十)--代码地址以及简单介绍(20160118更新)

    简单做了个相机和图片编辑模块,时间原因非常多功能还没有做.尚有BUG,见谅,将在以后抽时间改动 代码地址 PS:请点个Star^-^ --------------------------------- ...

  3. SEO优化100条

    1.准备个好域名.①.尽量在5位数内,当然也不一定,反正要让用户好记.(看个人):②.尽量用顶级的域名,搜索排名感觉好一点.③.做中文站最好用拼音注册,不要问为什么.看百度(baidu.com)就是很 ...

  4. 炫酷的sublimeText开发工具 快捷键总结

     sublimeText3绝对是写前端程序的利器.占内存小.启动快.代码提示功能齐全,界面酷炫并且再也不怕断电.了 网上搜罗一些快捷键总结一下.先来张图: (事实上sublimeText3也能够写 ...

  5. KBengine Learning Note 1 => Run Demo

    感觉周末没事就喜欢折腾点东西,看到KBengine这一款开源服务器引擎,之前也研究过一阵子Photon,但是要收费,弃之.觉得不错,研究下,顺便记录之. 启动环境 首先需要装好MySql与Python ...

  6. Asp.Net WebApi服务端解决跨域方案

    1.特性方式 主要是继承ActionFilterAttribute,重写OnActionExecuted方法,在action执行后,给响应头加上一个键值对. using System.Web.Http ...

  7. unity, use particleSystem with UGUI

    要想在UGUI上添加particleSystem,需要将Canvas的Render Mode设置为Screen Space - Camera,并为其Render Camera指定一个Orthograp ...

  8. dubbo_实现Hessian的远程调用协议

    1.优点 连接个数:多连接 连接方式:短连接 传输协议:HTTP 传输方式:同步传输 序列化:Hessian二进制序列化 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文 ...

  9. 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)

    插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...

  10. >/dev/null 2>&1的作用

    1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"  2 表示stderr标准错误  &am ...