springboot自定義配置雙數據源,mybatis-plus分頁插件


 

1、配置文件中添加配置實時庫和歷史庫的配置 

 

###############################數據庫配置###################################
####################實時庫配置 start#########################
## 數據庫配置
emp.database.realtime.ip=192.169.1.21
emp.database.realtime.port=3306
emp.database.realtime.name=msg_new2

#數據庫連接基本配置
spring.datasource.druid.realtime.url=jdbc:mysql://${emp.database.realtime.ip}:${emp.database.realtime.port}/${emp.database.realtime.name}?useUnicode=true&useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL
spring.datasource.druid.realtime.username=root
spring.datasource.druid.realtime.driver-class-name=com.mysql.jdbc.Driver
#數據庫密碼加密並注入publicKey
spring.datasource.druid.realtime.password=Cj7XmYjdXYN224PhUHYRcQBD5FhzgK7J3ONNO8MwEQ5U4j0u5PetAKd3HBjaSSIPsJ8yBlePsfPow4vpzUcNgg==
realtime.public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIwNJmigq/vliDQEc82ggGKhSXL3XvWH8MG1Kfk4bsYID5hSWaitxPGY6FagZE2GeRM7vEo2D8tcEWz/jqUDkfUCAwEAAQ==
spring.datasource.druid.realtime.connection-properties=config.decrypt=true;config.decrypt.key=${realtime.public-key};password=${spring.datasource.druid.realtime.password}
spring.datasource.druid.realtime.filter.config.enabled=true

#連接池配置
#初始化連接大小
spring.datasource.druid.realtime.initial-size=5
#最大連接數
spring.datasource.druid.realtime.max-active=100
#最小空閑連接數
spring.datasource.druid.realtime.min-idle=5
#獲取連接最大等待時間(毫秒)
spring.datasource.druid.realtime.max-wait=60000
#是否開啟PSCache,mysql5.5及以上版本支持
spring.datasource.druid.realtime.pool-prepared-statements=true
#指定每個連接上PSCache的大小,開啟PSCache時,此配置必須大於0
spring.datasource.druid.realtime.max-pool-prepared-statement-per-connection-size=20
#檢測連接是否有效的sql
spring.datasource.druid.realtime.validation-query=SELECT 1 FROM DUAL
#檢測連接是否有效超時時間(毫秒)
spring.datasource.druid.realtime.validation-query-timeout=60000
#申請連接時執行validationQuery檢測連接是否有效
spring.datasource.druid.realtime.test-on-borrow=false
#歸還連接時執行validationQuery檢測連接是否有效
spring.datasource.druid.realtime.test-on-return=false
#申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效
spring.datasource.druid.realtime.test-while-idle=true
#Destroy線程會檢測連接的間隔時間,testWhileIdle的判斷依據
spring.datasource.druid.realtime.time-between-eviction-runs-millis=60000
#Destory線程中如果檢測到當前連接的最后活躍時間和當前時間的差值大於,minEvictableIdleTimeMillis,則關閉當前連接
spring.datasource.druid.realtime.min-evictable-idle-time-millis=100000

###監控配置
# WebStatFilter配置
spring.datasource.druid.realtime.web-stat-filter.enabled=true
spring.datasource.druid.realtime.web-stat-filter.url-pattern=/*
spring.datasource.druid.realtime.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
# StatViewServlet配置
spring.datasource.druid.realtime.stat-view-servlet.enabled=true
spring.datasource.druid.realtime.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.realtime.stat-view-servlet.reset-enable=false
#監控賬號信息
spring.datasource.druid.realtime.stat-view-servlet.login-username=admin
spring.datasource.druid.realtime.stat-view-servlet.login-password=admin
#允許登錄監控頁面ip白名單,不配置即所有ip均是白名單
spring.datasource.druid.realtime.stat-view-servlet.allow=

# 配置StatFilter
spring.datasource.druid.realtime.filter.stat.db-type=mysql
spring.datasource.druid.realtime.filter.stat.log-slow-sql=true
spring.datasource.druid.realtime.filter.stat.slow-sql-millis=5000

# 配置WallFilter
spring.datasource.druid.realtime.filter.wall.enabled=true
spring.datasource.druid.realtime.filter.wall.db-type=mysql
spring.datasource.druid.realtime.filter.wall.config.delete-allow=true
spring.datasource.druid.realtime.filter.wall.config.drop-table-allow=false
####################實時庫配置 end#########################

####################歷史庫配置 start#########################
## 數據庫配置
emp.database.history.ip=192.169.1.21
emp.database.history.port=3306
emp.database.history.name=msg_new2

#數據庫連接基本配置
spring.datasource.druid.history.url=jdbc:mysql://${emp.database.history.ip}:${emp.database.history.port}/${emp.database.history.name}?useUnicode=true&useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL
spring.datasource.druid.history.username=root
spring.datasource.druid.history.driver-class-name=com.mysql.jdbc.Driver
#數據庫密碼加密並注入publicKey
spring.datasource.druid.history.password=Cj7XmYjdXYN224PhUHYRcQBD5FhzgK7J3ONNO8MwEQ5U4j0u5PetAKd3HBjaSSIPsJ8yBlePsfPow4vpzUcNgg==
history.public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIwNJmigq/vliDQEc82ggGKhSXL3XvWH8MG1Kfk4bsYID5hSWaitxPGY6FagZE2GeRM7vEo2D8tcEWz/jqUDkfUCAwEAAQ==
spring.datasource.druid.history.connection-properties=config.decrypt=true;config.decrypt.key=${history.public-key};password=${spring.datasource.druid.history.password}
spring.datasource.druid.history.filter.config.enabled=true

#連接池配置
#初始化連接大小
spring.datasource.druid.history.initial-size=5
#最大連接數
spring.datasource.druid.history.max-active=100
#最小空閑連接數
spring.datasource.druid.history.min-idle=5
#獲取連接最大等待時間(毫秒)
spring.datasource.druid.history.max-wait=60000
#是否開啟PSCache,mysql5.5及以上版本支持
spring.datasource.druid.history.pool-prepared-statements=true
#指定每個連接上PSCache的大小,開啟PSCache時,此配置必須大於0
spring.datasource.druid.history.max-pool-prepared-statement-per-connection-size=20
#檢測連接是否有效的sql
spring.datasource.druid.history.validation-query=SELECT 1 FROM DUAL
#檢測連接是否有效超時時間(毫秒)
spring.datasource.druid.history.validation-query-timeout=60000
#申請連接時執行validationQuery檢測連接是否有效
spring.datasource.druid.history.test-on-borrow=false
#歸還連接時執行validationQuery檢測連接是否有效
spring.datasource.druid.history.test-on-return=false
#申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效
spring.datasource.druid.history.test-while-idle=true
#Destroy線程會檢測連接的間隔時間,testWhileIdle的判斷依據
spring.datasource.druid.history.time-between-eviction-runs-millis=60000
#Destory線程中如果檢測到當前連接的最后活躍時間和當前時間的差值大於,minEvictableIdleTimeMillis,則關閉當前連接
spring.datasource.druid.history.min-evictable-idle-time-millis=100000

###監控配置
# WebStatFilter配置
spring.datasource.druid.history.web-stat-filter.enabled=true
spring.datasource.druid.history.web-stat-filter.url-pattern=/*
spring.datasource.druid.history.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
# StatViewServlet配置
spring.datasource.druid.history.stat-view-servlet.enabled=true
spring.datasource.druid.history.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.history.stat-view-servlet.reset-enable=false
#監控賬號信息
spring.datasource.druid.history.stat-view-servlet.login-username=admin
spring.datasource.druid.history.stat-view-servlet.login-password=admin
#允許登錄監控頁面ip白名單,不配置即所有ip均是白名單
spring.datasource.druid.history.stat-view-servlet.allow=

# 配置StatFilter
spring.datasource.druid.history.filter.stat.db-type=mysql
spring.datasource.druid.history.filter.stat.log-slow-sql=true
spring.datasource.druid.history.filter.stat.slow-sql-millis=5000

# 配置WallFilter
spring.datasource.druid.history.filter.wall.enabled=true
spring.datasource.druid.history.filter.wall.db-type=mysql
spring.datasource.druid.history.filter.wall.config.delete-allow=true
spring.datasource.druid.history.filter.wall.config.drop-table-allow=false


####################歷史庫配置 end#########################
mybatis-plus.mapper-locations=classpath:com/montnets/emp/*/mapper/xml/*.xml,classpath:com/montnets/emp/*/*/mapper/xml/*.xml
#日志輸出,true輸出,false不輸出
mybatis-plus.sql.show=true
View Code

 

這里實時庫連接配置以spring.datasource.druid.realtime開頭,歷史庫連接配置以spring.datasource.druid.history開頭

 

 

2、mybatis-plus分頁插件

 

package com.harara.config; import com.baomidou.mybatisplus.core.parser.ISqlParser; import com.baomidou.mybatisplus.extension.parsers.BlockAttackSqlParser; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import java.util.ArrayList; import java.util.List; /** * @name: MybatisPlusConfig * @description: MyBatisPlus插件 * @type: JAVA * @since: 2019/12/03 10:14 * @author: harara */ @Configuration public class MybatisPlusConfig {  @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); List<ISqlParser> sqlParserList = new ArrayList<>(); // 攻擊 SQL 阻斷解析器、加入解析鏈,防止全表刪除與更新
        sqlParserList.add(new BlockAttackSqlParser()); paginationInterceptor.setSqlParserList(sqlParserList); return paginationInterceptor; } }

 

3、實時庫數據源配置類

package com.harara.config.database; import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.harara.config.MybatisPlusConfig; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author: chenly * @date: 2019-11-13 20:50 * @description: 實時庫配置類 * @version: 1.0 */ @Slf4j @Configuration @Primary @MapperScan(basePackages = {"com.harara.*.mapper", "com.harara.*.*.mapper"}, sqlSessionTemplateRef  = "realSqlSessionTemplate") public class RealDataSourceConfiguration { @Autowired private MybatisPlusConfig mybatisPlusConfig; @Value(value = "${mybatis-plus.sql.show}") private boolean isshowSql; @Bean(name = "realDataSource") @Primary //配置默認數據源
    @ConfigurationProperties(prefix = "spring.datasource.druid.realtime") public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); try { druidDataSource.setPasswordCallbackClassName(DbPasswordCallback.class.getName()); } catch (Exception e) { log.error("DruidDataSource set PasswordCallbackClassName failed"); } return druidDataSource; }  @Bean(name = "realSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("realDataSource") DataSource dataSource) throws Exception { // SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); //使用MybatisSqlSessionFactoryBean 可以使用mybatis的BaseMapper中的方法
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(dataSource); // bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/real/*.xml"));
        List<Resource> resources = new ArrayList<>(); PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver(); resources.addAll(Arrays.asList(pathMatchingResourcePatternResolver.getResources("classpath:com/harara/*/mapper/xml/*.xml"))); resources.addAll(Arrays.asList(pathMatchingResourcePatternResolver.getResources("classpath:com/harara/*/*/mapper/xml/*.xml"))); bean.setMapperLocations(resources.toArray(new Resource[resources.size()])); //設置分頁插件
        bean.setPlugins(new Interceptor[]{mybatisPlusConfig.paginationInterceptor()}); if(isshowSql){ //設置sql語句打印類
            MybatisConfiguration mybatisConfiguration = new MybatisConfiguration(); mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); bean.setConfiguration(mybatisConfiguration); } return bean.getObject(); } @Bean(name = "realTransactionManager") @Primary public DataSourceTransactionManager transactionManager(@Qualifier("realDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "realSqlSessionTemplate") @Primary public SqlSessionTemplate sqlSessionTemplate(@Qualifier("realSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }

標紅代碼說明:

basePackages :配置實時庫mapper掃描范圍
setPasswordCallbackClassName : 設置加密類的類名
 

4、歷史庫數據源配置類

package com.harara.config.database; import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.harara.config.MybatisPlusConfig; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; import java.util.Properties; /** * @author: chenly * @date: 2019-11-14 11:13 * @description: 歷史庫配置類 * @version: 1.0 */ @Slf4j @Configuration @MapperScan(basePackages = "com.harara.*.his.hismapper", sqlSessionTemplateRef  = "historySqlSessionTemplate") public class HistoryDataSourceConfiguration { @Value(value = "${mybatis-plus.sql.show}") private boolean isshowSql; @Autowired private MybatisPlusConfig mybatisPlusConfig; @Bean(name = "historyDataSource") @ConfigurationProperties(prefix = "spring.datasource.druid.history") public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); try { druidDataSource.setPasswordCallbackClassName(DbPasswordCallback.class.getName()); } catch (Exception e) { log.error("DruidDataSource set PasswordCallbackClassName failed"); } return druidDataSource; } @Bean(name = "historySqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("historyDataSource") DataSource dataSource) throws Exception { // SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); //使用MybatisSqlSessionFactoryBean 可以使用mybatis-BaseMapper中的方法
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/harara/*/his/hismapper/xml/*.xml")); //設置分頁插件
        bean.setPlugins(new Interceptor[]{mybatisPlusConfig.paginationInterceptor()}); if(isshowSql){ //設置sql語句打印日志類
            MybatisConfiguration mybatisConfiguration = new MybatisConfiguration(); mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); bean.setConfiguration(mybatisConfiguration); } return bean.getObject(); } @Bean(name = "historyTransactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("historyDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "historySqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("historySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }

 

 

5、數據庫密碼 加密解密類

package com.harara.config.database; import com.alibaba.druid.filter.config.ConfigTools; import com.alibaba.druid.util.DruidPasswordCallback; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Properties; /** * @author: harara * @date: 2019-11-14 14:36 * @description: 重新數據庫密碼加密解密類 * @version: 1.0 */ @Component @Slf4j public class DbPasswordCallback  extends DruidPasswordCallback { /** * @param properties 屬性值列表 * @return * @description:處理解密 */ @Override public void setProperties(Properties properties) { super.setProperties(properties); String password = (String) properties.get("password"); String publickey = (String) properties.get("config.decrypt.key"); try { String dbpassword = ConfigTools.decrypt(publickey, password); if(dbpassword !=null){ setPassword(dbpassword.toCharArray()); } } catch (Exception e) { log.error("Druid ConfigTools.decrypt", e); } } }

標紅部分說明:

 password : mysql加密后的密碼

 config.decrypt.key : 密鑰

注意在配置文件中配置connection-properties的時候將config.decrypt.key和password添加進來

 

-- 實時庫配置

spring.datasource.druid.realtime.connection-properties=config.decrypt=true;config.decrypt.key=${realtime.public-key};password=${spring.datasource.druid.realtime.password}

-- 歷史庫配置

spring.datasource.druid.history.connection-properties=config.decrypt=true;config.decrypt.key=${history.public-key};password=${spring.datasource.druid.history.password}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM