@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.xxx.xxx.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
public class DruidDatesourceConfig {
@Value("${druid.driverClass:com.mysql.jdbc.Driver}")
private String driverClass;
@Value("${druid.jdbcUrl}")
private String jdbcUrl;
@Value("${druid.user}")
private String user;
@Value("${druid.password}")
private String password;
@Value("${druid.initialSize:3}")
private int initialSize;
@Value("${druid.minIdle:3}")
private int minIdle;
@Value("${druid.maxActive:10}")
private int maxActive;
@Value("${druid.maxWait:60000}")
private long maxWait;
@Value("${druid.timeBetweenEvictionRunsMillis:60000}")
private long timeBetweenEvictionRunsMillis;
@Value("${druid.minEvictableIdleTimeMillis:300000}")
private long minEvictableIdleTimeMillis;
@Value("${druid.validationQuery:select 1 from dual}")
private String validationQuery;
@Value("${druid.testWhileIdle:true}")
private boolean testWhileIdle;
@Value("${druid.testOnBorrow:false}")
private boolean testOnBorrow;
@Value("${druid.testOnReturn:false}")
private boolean testOnReturn;
@Value("${druid.poolPreparedStatements:false}")
//打开PSCache,并且指定每个连接上PSCache的大小
private boolean poolPreparedStatements;
@Value("${druid.maxPoolPreparedStatementPerConnectionSize:20}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${druid.filters:stat,wall,slf4j}")
//配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
//@Value("${druid.filters:stat,slf4j}") 关闭防火墙
private String filters;
@Value("${druid.connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000}")
//通过connectProperties属性来打开mergeSql功能;慢SQL记录
private String connectionProperties;
@Value("${druid.useGlobalDataSourceStat:true}")
//合并多个DruidDataSource的监控数据
private boolean useGlobalDataSourceStat;
@Bean(initMethod = "init",destroyMethod = "close")
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(jdbcUrl);
datasource.setUsername(user);
datasource.setPassword(password);
datasource.setDriverClassName(driverClass);
//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);
datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
System.err.println("druid configuration initialization filter: " + e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
// DruidDataSource druidDataSource = new DruidDataSource();
// druidDataSource.setUrl(jdbcUrl);
// druidDataSource.setUsername(user);
// druidDataSource.setPassword(password);
//
// druidDataSource.setInitialSize(initialSize);
// druidDataSource.setMinIdle(minIdle);
// druidDataSource.setMaxActive(maxActive);
//
// //配置获取连接等待超时的时间
// druidDataSource.setMaxWait(maxWait);
//
// //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
// druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//
// //配置一个连接在池中最小生存的时间,单位是毫秒
// druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//
// druidDataSource.setValidationQuery(validationQuery);
//
// druidDataSource.setTestWhileIdle(testWhileIdle);
// druidDataSource.setTestOnBorrow(testOnBorrow);
// druidDataSource.setTestOnReturn(testOnReturn);
//
// druidDataSource.setPoolPreparedStatements(poolPreparedStatements);
// druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
//
// return druidDataSource;
}
@Bean(value = "sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
@Autowired
@Qualifier("masterPageInterceptor")
PageInterceptor pageInterceptor;
@Bean(value = "sqlSessionFactory")
public MybatisSqlSessionFactoryBean sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.xxx.xxx.dao.mapper,com.xxx.xxx.dao.repository");
String[] mapperLocations = new String[2];
mapperLocations[0] = "classpath*:com/xxx/xxx/dao/mapper/**/*Mapper.xml";
mapperLocations[1] = "classpath*:com/xxx/xxx/dao/repository/**/*.xml";
sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations(mapperLocations));
sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageInterceptor});
return sqlSessionFactoryBean;
}
public Resource[] resolveMapperLocations(String[] mapperLocations) {
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<Resource> resources = new ArrayList<Resource>();
if (mapperLocations != null) {
for (String mapperLocation : mapperLocations) {
try {
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
} catch (IOException e) {
// ignore
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
@Bean(value = "transactionTemplate")
public TransactionTemplate transactionTemplate(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) {
TransactionTemplate transactionTemplate = new TransactionTemplate();
transactionTemplate.setTransactionManager(transactionManager);
return transactionTemplate;
}
@Bean(value = "transactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
注意点:如果需要一次执行多条sql语句(&allowMultiQueries=true)需要关闭防火墙安全配置否则会有异常
@Bean(name = "wallConfig")
WallConfig wallFilterConfig() {
WallConfig wc = new WallConfig();
//允许一次执行多条s'q'l语句
wc.setMultiStatementAllow(true);
wc.setNoneBaseStatementAllow(true);
return wc;
}
@Bean(name = "wallFilter")
@DependsOn("wallConfig")
WallFilter wallFilter(WallConfig wallConfig) {
WallFilter wfilter = new WallFilter();
wfilter.setConfig(wallConfig);
return wfilter;
}