nutz mysql druid_SpringBoot+Druid+Nutz+Jasypt整合配置多数据源

胡鸿羲
2023-12-01

一 .    引入依赖

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-jdbc

com.alibaba

druid-spring-boot-starter

1.1.21

org.nutz

nutz

1.r.62

org.projectlombok

lombok

1.18.0

org.jasypt

jasypt

1.9.3

compile

二.    application.yml配置文件

spring:

datasource:

type: com.alibaba.druid.pool.DruidDataSource

druid:

main:

url: jdbc:mysql://127.0.0.1:3306/data_hn?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8

username: root

password: +7kwXYHUt9V4btttYVr3MOr/71O/ZIL7

salt: gxmh

subo:

url: jdbc:mysql://127.0.0.1:3306/data_gs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8

username: root

password: +7kwXYHUt9V4btttYVr3MOr/71O/ZIL7

salt: gxmh

initial-size: 5 # 初始化连接大小 默认0

max-active: 20 # 最大连接数 默认8

min-idle: 5 # 最小空闲连接数 默认0

# 监控页面的用户名密码及页面地址

stat-view-servlet:

login-username: admin

login-password: 123456

enabled: true

url-pattern: /druid/*

max-wait: 60000 # 获取连接等待超时的时间(毫秒) 默认:-1

query-timeout: 90 # 查询超时时间

validation-query: SELECT 1 FROM DUAL

test-on-borrow: false # 申请连接时检测连接可用性 默认:false

test-on-return: false # 归还连接检测 默认false

test-while-idle: true # 超时是否检测连接可用性

time-between-eviction-runs-millis: 60000 # 配置空闲多久检测需要配置的空闲连接(毫秒)

min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存时间 默认30分钟

filters: config,stat,wall,slf4j # 通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat;日志用的filter:log4j;防御sql注入的filter:wall

filter:

stat:

log-slow-sql: true # 慢SQL记录

slow-sql-millis: 2000

db-type: mysql

merge-sql: false # SQL合并 默认false

wall:

config: #是否允许delete和drop表语句

delete-allow: true

drop-table-allow: false

enabled: true

db-type: mysql

pool-prepared-statements: false # 是否缓存PreparedStatement. PSCache对支持游标的数据库性能提升巨大,比如说oracle.在mysql下建议关闭.

max-pool-prepared-statement-per-connection-size: 20 # 每个连接上的PSCache的大小

use-global-data-source-stat: true # 合并多个DataSource的监控数据

server:

port: 8181

三.    数据源配置类DataSourceConfig

import com.alibaba.druid.pool.DruidDataSource;

import com.example.demo.utils.JasyptUtils;

import org.nutz.dao.Dao;

import org.nutz.dao.impl.NutDao;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.context.properties.bind.Binder;

import org.springframework.context.EnvironmentAware;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import org.springframework.core.env.Environment;

import javax.sql.DataSource;

/**

* @program: demo

* @description: 数据源配置类

* @author: guoxu

* @create: 2019-12-19 14:56

*/

/**

* 1.当存在多个数据源时,最好加上@Primary注解,这样默认使用这个连接。

* 2.使用Qualifier注解说明使用某个连接。

*/

@Configuration

public class DataSourceConfig implements EnvironmentAware {

@Value("${spring.datasource.druid.main.salt}")

private String salt;

private Environment environment;

private DataSource defaultDataSource;

@Override

public void setEnvironment(Environment environment) {

this.environment = environment;

}

//配置主数据源

@Primary

@Bean

public DataSource initDataSource(){

Binder binder = Binder.get(environment);

defaultDataSource = binder.bind("spring.datasource.druid.main", DruidDataSource.class).get();

String password = ((DruidDataSource) defaultDataSource).getPassword();

((DruidDataSource) defaultDataSource).setPassword(JasyptUtils.strEnDecrypt(password, salt, 1));

return defaultDataSource;

}

//配置从数据源

@Bean(name = "sds")

public DataSource initSDataSource(){

Binder binder = Binder.get(environment);

defaultDataSource = binder.bind("spring.datasource.druid.subo", DruidDataSource.class).get();

String password = ((DruidDataSource) defaultDataSource).getPassword();

((DruidDataSource) defaultDataSource).setPassword(JasyptUtils.strEnDecrypt(password, salt, 1));

return defaultDataSource;

}

//主数据源绑定Nutz

@Primary

@Bean

public Dao initNutzDao(DataSource dataSource){

return new NutDao(dataSource);

}

//从数据源绑定Nutz

@Bean(name = "sdao")

public Dao initSNutzDao(@Qualifier("sds") DataSource dataSource){

return new NutDao(dataSource);

}

}

四.    Nutz使用

@Autowired

Dao dao;

@Autowired

@Qualifier("sdao")

Dao sdao;

五. Jasypt加密工具类

package com.example.demo.utils;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

/**

* @program: gxww-frame-cloud

* @description: Jasypt加密解密工具类

* @author: guoxu

* @create: 2019-12-16 14:57

*/

public class JasyptUtils {

public static void main(String[] args) {

String encrypt = strEnDecrypt("7j41Gq3M!@#", "gxmh", 0);

System.out.println("encrypt:"+encrypt);

String decrypt = strEnDecrypt(encrypt, "gxmh", 1);

System.out.println("decrypt:"+decrypt);

}

/**

* @Description: 字符串加密解密

* @Param: [plainText, salt, type]

* salt 加密盐

* type 0 加密 1或其他为 解密

* @return: java.lang.String

* @Author: guoxu

* @Date: 2019/12/16

*/

public static String strEnDecrypt(String plainText, String salt,int type){

String resultStr = "";

//加密工具

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

//加密配置

EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();

//加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES

config.setAlgorithm("PBEWithMD5AndDES");

//加密所需的salt(盐)

config.setPassword(salt);

//应用配置

encryptor.setConfig(config);

if (type == 0){

resultStr = encryptor.encrypt(plainText);

} else {

resultStr = encryptor.decrypt(plainText);

}

return resultStr;

}

}

六. 不加密数据库密码时的另一种数据源配置类

package com.example.demo.config;

import com.alibaba.druid.pool.DruidDataSource;

import org.nutz.dao.Dao;

import org.nutz.dao.impl.NutDao;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.jdbc.DataSourceBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

import java.sql.SQLException;

/**

* @program: demo

* @description: 多数据源配置类

* @author: guoxu

* @create: 2019-12-19 14:56

*/

@Configuration

public class DataSourceConfig {

/**

* 当存在多个数据源时,最好加上@Primary注解,这样默认使用这个连接。

* 不需要使用Qualifier注解说明使用某个连接。

* @return

* @throws SQLException

*/

@Primary

@Bean

@ConfigurationProperties(prefix = "spring.datasource.druid.main")

public DataSource initMainDataSource() throws SQLException {

DruidDataSource mainDataSource = DataSourceBuilder.create().type(DruidDataSource.class).build();

return mainDataSource;

}

@Bean(name = "sds")

@ConfigurationProperties(prefix = "spring.datasource.druid.subo")

public DataSource initSuboDataSource() throws SQLException {

DruidDataSource suboDataSource = DataSourceBuilder.create().type(DruidDataSource.class).build();

return suboDataSource;

}

@Primary

@Bean

public Dao initNutzDao(DataSource dataSource){

return new NutDao(dataSource);

}

@Bean(name = "sdao")

public Dao initsNutzDao(@Qualifier("sds") DataSource dataSource){

return new NutDao(dataSource);

}

}

来源:oschina

链接:https://my.oschina.net/u/4148675/blog/3145442

 类似资料: