依赖项
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.10</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
<scope>test</scope>
</dependency>
多个数据源的配置信息
### 数据源信息
spring:
datasource:
authen:
### 认证数据源
driver-class-name: org.postgresql.Driver
jdbcUrl: jdbc:postgresql://ip1:port/performdb?currentSchema=*&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: ******
monitor:
### 监控数据源
driver-class-name: org.postgresql.Driver
jdbcUrl: jdbc:postgresql://ip2:port/performdb?currentSchema=*&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: ******
mapper接口与会话工厂(数据源、sql文件)绑定
这里实现了mapper接口与不同的数据源&sql文件的绑定/关联,是实现多数据源的关键部分
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
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.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* mapper接口绑定到指定会话工厂(整合数据源、sql文件)
*/
@Configuration
@MapperScan(basePackages="com.telecom.authen.mapper", sqlSessionFactoryRef="authenSqlSessionFactory")
public class AuthenSqlSessionFactoryConfig {
/**
* 数据源Bean
*/
/// @Primary
@Bean(name = "authenDataSource")
@ConfigurationProperties(prefix = "spring.datasource.authen")
public DataSource monitorDataSource() {
// return DataSourceBuilder.create().type(com.zaxxer.hikari.HikariDataSource.class).build();
return DataSourceBuilder.create().type(com.alibaba.druid.pool.DruidDataSource.class).build();
}
或者
/**
* 数据源Bean
*/
/// @Primary
@Bean(name = "authenDataSource")
public DataSource alarmDataSource(@Value("${spring.datasource.authen.url}") String url,
@Value("${spring.datasource.authen.username}") String username,
@Value("${spring.datasource.authen.password}") String password,
@Value("${spring.datasource.authen.driverClassName}") String driver) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(username);
config.setPassword(password);
config.setDriverClassName(driver);
// 构造时自动初始化连接池,功能类似DruidDataSource.init()
HikariDataSource hikariDataSource = new HikariDataSource(config);
return hikariDataSource;
}
/**
* 会话工厂Bean【整合数据源、sql语句】
*/
/// @Primary
@Bean(name = "authenSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("authenDataSource") DataSource dataSource) throws Exception {
// 设置数据源&sql语句
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/authen/*.xml"));
// 设置分页插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
sqlSessionFactoryBean.setPlugins(new Interceptor[]{interceptor});
return sqlSessionFactoryBean.getObject();
}
}
mapper接口
package com.telecom.authen.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.telecom.authen.model.Role;
import java.util.List;
/**
* 角色信息Mapper接口
*/
public interface CscpRoleMapper extends BaseMapper<Role> {
List<String> getRoleListByUsername(String username);
}
sql语句文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.telecom.authen.mapper.RoleMapper">
<select id="getRoleListByUsername" parameterType="java.lang.String" resultType="java.lang.String">
select C.name
from user A
inner join user_role B on A.id = B.user_id
inner join roles C on B.role_id = C.id
where A.username = #{username}
</select>
</mapper>
启动类中,禁止数据源的自动装载
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/// 禁止数据源的自动装载
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan({"com.telecom.authen.mapper", "com.telecom.monitor.mapper"})
public class Application {
public static void main (String [] args) {
SpringApplication.run(Application.class, args);
}
}