解决 druid批量执行sql语句报错问题

项目场景:

项目中启用Druid的统计管理,在执行批量sql时出现此问题


问题描述

java.sql.SQLException: sql injection violation, multi-statement not allow

sql注入冲突,不允许多语句
在mybatis 中使用foreach标签拼接多条sql语句(以)结尾),执行时报错

<update id="update"  parameterType="">
    <foreach collection="list" item="item" index="index">
        update tb_user set isDelete=0  where userId = #{item.userId};
    </foreach>  
  </update>

原因分析:

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


解决方案:

追加 allowMultiQueries=true 参数

spring.datasource.qhgyl.url=jdbc:mysql://localhost:13306/ggh?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8&allowMultiQueries=true

关闭 druid 的wall-filter

直接注释掉或者删除掉

#spring.datasource.qhh.filters=wall
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,Druid不能直接将Oracle SQL语句转换为MySQL语句,因为Oracle和MySQL的语法有很大的区别。但是,你可以手动将Oracle SQL语句转换为MySQL语句,或者使用一些第三方工具进行转换。 以下是一些常见的Oracle SQL语句与MySQL语句的对比: 1. 创建表: Oracle SQL语句: ``` CREATE TABLE employees ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), hire_date DATE, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); ``` MySQL语句: ``` CREATE TABLE employees ( employee_id INT(6), first_name VARCHAR(20), last_name VARCHAR(25), email VARCHAR(25), hire_date DATE, job_id VARCHAR(10), salary DECIMAL(8,2), commission_pct DECIMAL(2,2), manager_id INT(6), department_id INT(4) ); ``` 2. 插入数据: Oracle SQL语句: ``` INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Steven', 'King', '[email protected]', '17-JUN-87', 'AD_PRES', 24000, NULL, NULL, 90); ``` MySQL语句: ``` INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Steven', 'King', '[email protected]', '1987-06-17', 'AD_PRES', 24000, NULL, NULL, 90); ``` 3. 查询数据: Oracle SQL语句: ``` SELECT employee_id, first_name, last_name, email, hire_date, job_id, salary, commission_pct, manager_id, department_id FROM employees WHERE department_id = 90 ORDER BY hire_date DESC; ``` MySQL语句: ``` SELECT employee_id, first_name, last_name, email, hire_date, job_id, salary, commission_pct, manager_id, department_id FROM employees WHERE department_id = 90 ORDER BY hire_date DESC; ``` 需要注意的是,Oracle和MySQL的数据类型有很大的区别,因此在进行数据类型转换时需要注意精度和类型的匹配问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值