springboot+mybatis sql injection violation, multi-statement not allow : update … 错误解决

Java 新民 140℃ 已收录 1评论

对于这种问题, 是因为在sql 中执行了批量操作。 例如: 批量update ;下面把我的Mapper.xml 中的sql 展示出来:

这条sql 编译后会成为批量更新代码:

UPDATE t_device SET pc_name = ? ,pc_mac = ? ,update_time = ?   WHERE id = ?; 
UPDATE t_device SET pc_name = ? ,pc_mac = ? ,update_time = ?   WHERE id = ?; 
UPDATE t_device SET pc_name = ? ,pc_mac = ? ,update_time = ?   WHERE id = ?; 
UPDATE t_device SET pc_name = ? ,pc_mac = ? ,update_time = ?   WHERE id = ?; 
UPDATE t_device SET pc_name = ? ,pc_mac = ? ,update_time = ?   WHERE id = ?; 

这是执行批量执行的sql; 因为在默认情况下, 是不支持这种批量操作的。 所以需要额外的配置。

我在网上查找了好多帖子, 都是在数据库url 上添加allowMultiQueries=true 参数 和  在 Druid配置上添加multiStatementAllow=true 配置。

我都添加了,但都无效。 还是报同样的错。最后查看了下Druid的源码。

最后我添加如下代码:

/**
 * @description: 配置允许批量执行sql
 * @author: zxm
 * @version: 1.0.0
 * @date: 2019-08-24 10:37:23
 * @url https://www.snowruin.com
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dateSource(){
        DruidDataSource dataSource = new DruidDataSource();
        List filterList= Lists.newArrayList();
        filterList.add(wallFilter());
        dataSource.setProxyFilters(filterList);
        return dataSource;
    }

    @Bean
    public WallFilter wallFilter(){
        return new WallFilter(){{setConfig(wallConfig());}};
    }

    @Bean
    public WallConfig wallConfig(){
        WallConfig w = new WallConfig();
        w.setMultiStatementAllow(true);  // 允许批量执行sql
        return w;
    }

}

         

添加这些代码, 然后在数据库url 上添加allowMultiQueries=true 参数。 重新运行了下,问题解决!!!

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.snowruin.com/?p=1785
喜欢 (2)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)条精彩评论。
  1. 非技术的路过。
    repostone2019-08-30 16:26 回复| Google Chrome 63.0.3239.132| Windows 8.1 x64