package com.bj58.zpsender.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.bj58.zpsender.init.ScfInit;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
import java.io.IOException;
@Configuration
@MapperScan(basePackages = “com.demo.mapper”)
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class MybatisConfig {
@Bean
public DataSource dataSource() throws PropertyVetoException, IOException {
//MySqlPropertyConfig.init(ScfInit.basePath);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(MySqlPropertyConfig.getInstance().getJdbcUrl());
dataSource.setDriverClassName(MySqlPropertyConfig.getInstance().getDriver());
dataSource.setUsername(MySqlPropertyConfig.getInstance().getUsername());
dataSource.setPassword(MySqlPropertyConfig.getInstance().getPassword());
// 配合preferredTestQuery或 automaticTestTable使用,必须要保证有合理配置才能把testConnectionOnCheckout设置成true
// 每次把链接取出时都会检查链接是否有效,无效则取新的链接
// dataSource.setAutomaticTestTable(“t_test”);//c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。默认值: null
dataSource.setValidationQuery(MySqlPropertyConfig.getInstance().getJdbcValidationQuery());
//连接池中保留的最小连接数,默认为:3
dataSource.setMinIdle(40);
//连接池中保留的最大连接数。默认值: 15
dataSource.setMaxActive(100);
//初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3
dataSource.setInitialSize(3);
// 60s后未被使用,则丢弃
dataSource.setMinEvictableIdleTimeMillis(60*1000);
//当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0
dataSource.setMaxWait(4000);
//关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务
dataSource.setDefaultAutoCommit(false);
//如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源
// 仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。
//如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false
dataSource.setBreakAfterAcquireFailure(false);
//每60秒检查所有连接池中的空闲连接。默认值: 0,不检查
dataSource.setTimeBetweenEvictionRunsMillis(60*1000);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(0);
dataSource.setPoolPreparedStatements(false);
return dataSource;
}
@Bean(name = "sqlSessionFactory")
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(MySqlPropertyConfig.getInstance().getMapperLocations());
sqlSessionFactoryBean.setDataSource(dataSource);
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setLogImpl(StdOutImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
//映射文件的路径
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setPlugins(mybatisPlusInterceptor);
return sqlSessionFactoryBean;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* mybatis-plus 分页插件
* 配置上找个后,selectPage方法才能实现物理上的分页,否则不是物理分页
* @return
*/
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setOptimizeJoin(false);
paginationInnerInterceptor.setMaxLimit(100000L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}