mybatis 一次执行多条SQL MySql+Mybatis+Druid之SqlException:sql injection violation, multi-statement not allow
如果用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注入:多声明不被允许
以下是栈异常输出:
- Caused by: java.sql.SQLException: sql injection violation, multi-statement not allow : UPDATE
- t_single_project_score
- SET update_time=now() ,
- is_delete = 1 ,
- operator =?
- WHERE
- student_id IN (?)
- AND school_year IN(
- ?
- )
- AND is_delete = 0
- ;
- UPDATE
- t_single_project_score
- SET update_time=now() ,
- is_delete = 1 ,
- operator =?
- WHERE
- student_id IN (?)
- AND school_year IN(
- ?
- )
- AND is_delete = 0
- at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:800)
- at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:251)
- at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
- at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:929)
- at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
- at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:929)
- at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122)
- at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
- at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342)
- at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:349)
- at com.p6spy.engine.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:119)
- at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87)
- at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
- at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
- at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85)
- at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
- at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
- at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:483)
- at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
- at com.sun.proxy.$Proxy44.update(Unknown Source)
- at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
- at org.apache.ibatis.session.defaults.DefaultSqlSession.delete(DefaultSqlSession.java:213)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:483)
- at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
- ... 52 more
通过异常栈输出出现异常如何分析解决?
在输出的日志里,找到关键信息:
- 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即可
- <!--在spring-db.xml的wall-filter中添加config,修改后如下-->
- <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
- <property name="dbType" value="mysql"/>
- <!--<property name="config" ref="wall-config"/>-->
- </bean>
- <!--解决mybatis与druid集成后,wallFilter sql注入异常-->
- <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig">
- <property name="multiStatementAllow" value="true"/>
- </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
- 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
- 'UPDATE
- t_single_project_score
- 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的更多相关文章
- MyBatis一次执行多条SQL语句
MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...
- mybatis 一次执行多条SQL
在默认情况下,一次性发过去的多条sql是不合法的. 想要让mysql一次执行多条sql语句,必须进行手动设置. 让mysql驱动开启批量执行sql的开关. 怎么开启呢?在拼装mysql链接的url时, ...
- MySQL命令行导入导出sql文件
linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构(常用):mysqldump -u用户名 -p密码 数据库名 > 数据库名. ...
- mybatis执行多条sql语句
1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...
- springBoot + mybatis实现执行多条sql语句出错解决方法
在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...
- mysql基础-- 一条请求执行多条SQL语句
最近做一个数据库初始化工具的时候发现了这个问题,就是在一个Statement中执行一条SQL语句的时候可以正确执行,如果同时执行多条,就会报SQL语法错误,伤透了脑筋. 经过网上查找,发现有两种解决办 ...
- mysql -- 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
- Jmeter连接MySQL配置(能执行多条sql语句)
Database URL为MySQL的连接串,如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”
- [mybatis] sql语句无错误,但是执行多条sql语句时,抛出java.sql.SQLSyntaxErrorException
错误内容 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.S ...
随机推荐
- 【自动部署】服务器自动化操作 RunDeck
RunDeck 是用 Java/Grails 写的开源工具,帮助用户在数据中心或者云环境中自动化各种操作和流程.通过命令行或者web界面,用户可以对任意数量的服务器进行操作,大大降低了对服务器自动化的 ...
- 最短路径——Floyd,Dijkstra(王道)
题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...
- 菜鸟调错(五)——jetty执行时无法保存文件
背景交代: 上一篇博客写的是用jetty和Maven做开发.測试.在使用的过程中遇到一个小问题.就是在jetty启动以后,改动了jsp.xml等文件无法保存. 错误信息: 解决方式: 到Maven库( ...
- docker集群——初识Swarm
为Docker构建原生的集群管理工具的计划早在2014年初就开始了,当时作为一个通信协议项目,称为Beam.之后,它被实现为一种后台程序,使用Docker API来控制异构化的分布式系统.项目重新命名 ...
- 修改注册表实现Windows自动登陆
昨天再修一条case时无意间发现这个case竟然要重启机器,并且要用指定的账户自动登陆Windows.然后就发现了,简单的修改下注册表就可以完成自动登陆了. 首先,在“run”里输入“regedit” ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...
- iOS开发-关闭/收起键盘方法总结
前言:作为IOS开发人员,需要经常和表单打交道.因此我对收起键盘的方法作了下总结,IOS收起键盘有三种方法(如果有其它收起键盘的方法请在留言区指错). 收起键盘的方法: 1.点击Return按扭时收起 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(一)—— 手把手教你创建第一个三层架构+mvc的asp.net项目
下面开启项目 1. 打开vs2010-文件-新建项目 2. 先创建一个空的解决方案: 选择其他项目类型-visual studio 解决方案-空白解决方案(默认.NET Framework 4),项目 ...
- SPOJ QTREE3 lct
题目链接 题意: 给定n个点 q个询问 以下n-1行给出树边,点有黑或白色.初始化为白色 以下q行: 询问有2种: 1. 0 x 把x点黑变白,白变黑 2.1 x 询问Path(1,x)路径上第一个黑 ...
- 美团HD(8)-利用NSPredicate匹配搜索结果
监听文本框改变: DJSelectCityViewController.m /** 当searchBar内的文字发生改变时调用此方法 */ - (void)searchBar:(UISearchBar ...