🥝FANMR.CN热爱,追求
MaBatis多数据源配置

学习文章出处:https://zhuanlan.zhihu.com/p/436075500

引入MyBatis

<!-- 连接mysql的必要依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 整合MyBatis的核心依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

配置数据库信息

spring.datasource.hostel.jdbc-url=xxx
spring.datasource.hostel.username=root
spring.datasource.hostel.password=xxx
spring.datasource.hostel.driver-class-name=com.mysql.cj.jdbc.Driver

hostel为自定义名称,可配置多个。

根据包路径进行使用源配置

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.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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * 自定义数据源
 */
@Configuration
@MapperScan(basePackages = "com.springmvc.mapper.hostel", sqlSessionTemplateRef = "hostelSqlSessionTemplate")
public class DataSourceHostelConfig {

    @Primary
    @Bean(name = "hostelDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hostel")
    public DataSource hostelDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "hostelSqlSessionFactory")
    public SqlSessionFactory hostelSqlSessionFactory(@Qualifier("hostelDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        // 指定数据源
        bean.setDataSource(dataSource);
        // 注意:自定义的sqlSessionFactory不会加载mybatis配置
        // 指定mapper.xml位置
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/hostel/*.xml"));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        // 开启驼峰命名
        configuration.setMapUnderscoreToCamelCase(true);
        // 连接超时时间
        configuration.setDefaultStatementTimeout(15);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    @Bean(name = "hostelSqlSessionTemplate")
    public SqlSessionTemplate hostelSqlSessionTemplate(@Qualifier("hostelSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

这里的@ConfigurationProperties(prefix = "spring.datasource.hostel")指定了数据库的连接数据。

@Primary指定了该配置为主库,没有主从可以不加。

@MapperScan(basePackages = "com.springmvc.mapper.hostel", sqlSessionTemplateRef = "hostelSqlSessionTemplate")根据mapper的所在位置进行不同的数据源使用。

加入druid连接池

<!--连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

在创建Datasource时更换:

import com.alibaba.druid.pool.DruidDataSource;
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.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * 旅馆数据库
 */
@Configuration
@MapperScan(basePackages = "com.springmvc.mapper.hostel", sqlSessionTemplateRef = "hostelSqlSessionTemplate")
public class DataSourceHostelConfig {

    @Value("${spring.datasource.hostel.jdbc-url}")
    private String jdbcUrl;

    @Value("${spring.datasource.hostel.username}")
    private String username;

    @Value("${spring.datasource.hostel.password}")
    private String password;

    @Bean(name = "hostelDataSource")
    public DataSource hostelDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(jdbcUrl);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setKeepAlive(true);
        druidDataSource.setMaxActive(5);
        return druidDataSource;
    }

    @Bean(name = "hostelSqlSessionFactory")
    public SqlSessionFactory hostelSqlSessionFactory(@Qualifier("hostelDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        // 指定数据源
        bean.setDataSource(dataSource);
        // 注意:自定义的sqlSessionFactory不会加载mybatis配置
        // 指定mapper.xml位置
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/hostel/*.xml"));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        // 开启驼峰命名
        configuration.setMapUnderscoreToCamelCase(true);
        // 连接超时时间
        configuration.setDefaultStatementTimeout(15);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    @Bean(name = "hostelSqlSessionTemplate")
    public SqlSessionTemplate hostelSqlSessionTemplate(@Qualifier("hostelSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}