1.设置spring.datasource.filters=stat,log4j,去掉wall
2. 在DruidDBConfig中设置可以执行多条语句
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
@Configuration
public class DruidDBConfig {
private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${spring.datasource.filters}")
private String filters;
@Value("{spring.datasource.connectionProperties}")
private String connectionProperties;
@Bean
@Primary // 在同样的DataSource中,会被首先注入
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
// configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
logger.info("druid configuration initialization success! ");
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
@Autowired
WallFilter wallFilter;
@Bean(name = "wallFilter")
@DependsOn("wallConfig")
public WallFilter wallFilter(WallConfig wallConfig) {
WallFilter wallFilter = new WallFilter();
wallFilter.setConfig(wallConfig);
return wallFilter;
}
@Bean(name = "wallConfig")
public WallConfig wallConfig() {
WallConfig wallConfig = new WallConfig();
wallConfig.setMultiStatementAllow(true); // 允许一次执行多条语句
wallConfig.setNoneBaseStatementAllow(true); // 允许一次执行多条语句
return wallConfig;
}
}
1. 批量新增配置
DAO:
void insertBetch(List<TABLE> txtLogs);
Mapping:
<insert id="insertBetch" parameterType="java.util.List">
insert into TABLE (ID, name, sex,ip, age,sss,updatedate)
select SEQ_XX.NEXTVAL,cd.* from(
<foreach collection="list" item="list" close=")" open="(" index="index" separator="UNION ALL">
select
#{list.name,jdbcType=VARCHAR},
#{list.sex,jdbcType=DATE}, #{list.ip,sex=VARCHAR},
#{list.age,jdbcType=VARCHAR}, #{list.sss,jdbcType=VARCHAR},
#{list.updatedate,jdbcType=DATE}
from dual
</foreach>
) cd
</insert>
SQL:
insert into TABLE (ID, name, sex, IP, age, sss, updatedate) select SEQ_XX.NEXTVAL,cd.* from( ( select ?, ?, ?, ?, ?, ? from dual ) ) UNION ALL select SEQ_XX.NEXTVAL,cd.* from( ( select ?, ?, ?, ?, ?, ? from dual ) ) cd
2. 批量更新配置
DAO:
void updateBetch4Return(List<TABLE> list);
Mapping:
update id="updateBetch4Return" parameterType="java.util.List">
<foreach collection="list" item="record" index="index"
open="begin" close=";end;" separator=";">
update TABLE
<set>
ZT = #{record.zt,jdbcType=VARCHAR},
BZ = #{record.bz,jdbcType=VARCHAR}
</set>
where ID like '%'||#{record.ID,jdbcType=VARCHAR}||'%'
</foreach>
</update>
SQL:
begin update TABLE SET ZT = ?, BZ = ? where id like '%'||?||'%' ;update TABLE SET ZT = ?, BZ = ? where id like '%'||?||'%' ;end;