问题:一个springboot+mybatis的项目,由tomcat连接池换成了Druid连接池,发现在执行一个批量更新的sql时报错:Caused by: java.sql.SQLException: sql injection violation, multi-statement not allow
解决:通过WallConfig配置multiStatementAllow=true可以解决此问题。
具体代码如下(项目中用了一个类专门配置数据源):
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
@Configuration
public class DatasourceConfig {
@Value("${spring.datasource.1.url}")
private String url;
@Value("${spring.datasource.1.username}")
private String username;
@Value("${spring.datasource.1.password}")
private String password;
@Value("${spring.datasource.1.driver-class-name}")
private String driverClassName;
@Bean(name = "dataSource")
public DataSource dataSource() {
Map<String, Object> properties = new HashMap<>();
properties.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, driverClassName);
properties.put(DruidDataSourceFactory.PROP_URL, url);
properties.put(DruidDataSourceFactory.PROP_USERNAME, username);
properties.put(DruidDataSourceFactory.PROP_PASSWORD, password);
// 添加统计、SQL注入、日志过滤器
properties.put(DruidDataSourceFactory.PROP_FILTERS, "stat,wallFilter");
// sql合并,慢查询定义为5s
properties.put(DruidDataSourceFactory.PROP_CONNECTIONPROPERTIES,
"druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");
try {
return DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Autowired
WallFilter wallFilter;
@Bean(name = "wallConfig")
WallConfig wallFilterConfig() {
WallConfig wc = new WallConfig();
wc.setMultiStatementAllow(true);
return wc;
}
@Bean(name = "wallFilter")
@DependsOn("wallConfig")
WallFilter wallFilter(WallConfig wallConfig) {
WallFilter wfilter = new WallFilter();
wfilter.setConfig(wallConfig);
return wfilter;
}
}