springboot整合mybatis切换数据源教程(可指定不同的mapper文件)

今天在项目上碰到需要去读不同库的需求,自己看了一些博客,感觉网上的很繁琐,我们可以通过配置类的形式来切换数据源,指定不同的mapper文件读不同的库,指定不同的Dao层。

涉密部分已打码

1.准备两个数据库配置文件在这里插入图片描述
2.两个配置文件的内容



# JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
# 或spring.datasource.aj.url=
spring.datasource.aj.druid.url=${SPRING_DATASOURCE_AJ_DRUID_URL:jdbc:mysql://XX.XXX.XXX.XXX:端口/库名?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull}
spring.datasource.aj.druid.username=${SPRING_DATASOURCE_AJ_DRUID_USERNAME:账号}
spring.datasource.aj.druid.password=${SPRING_DATASOURCE_AJ_DRUID_PASSWORD:密码}
spring.datasource.aj.druid.driver-class-name=${SPRING_DATASOURCE_DRUID_DRIVER_CLASS_NAME:com.mysql.jdbc.Driver}

#连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
# 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。removeabandoned不建议在生产环境中打开如果用SQL Server,建议追加配置)
spring.datasource.aj.druid.initial-size=${SPRING_DATASOURCE_DRUID_INITIAL_SIZE:1}
spring.datasource.aj.druid.max-active=${SPRING_DATASOURCE_DRUID_MAX_ACTIVE:20}
spring.datasource.aj.druid.min-idle=${SPRING_DATASOURCE_DRUID_MIN_IDLE:1}
# 配置获取连接等待超时的时间
spring.datasource.aj.druid.max-wait=${SPRING_DATASOURCE_DRUID_MAX_WAIT:60000} 
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.aj.druid.pool-prepared-statements=${SPRING_DATASOURCE_DRUID_POOL_PREPARED_STATEMENTS:true}
spring.datasource.aj.druid.max-pool-prepared-statement-per-connection-size=${SPRING_DATASOURCE_DRUID_MAX_POOL_PREPARED_STATEMENT_PER_CONNECTION_SIZE:20}
#spring.datasource.aj.druid.max-aj-prepared-statements=和上面的等价
spring.datasource.aj.druid.validation-query=${SPRING_DATASOURCE_DRUID_VALIDATION_QUERY:SELECT 'x'}
#spring.datasource.aj.druid.validation-query-timeout=
spring.datasource.aj.druid.test-on-borrow=${SPRING_DATASOURCE_DRUID_TEST_ON_BORROW:false}
spring.datasource.aj.druid.test-on-return=${SPRING_DATASOURCE_DRUID_TEST_ON_RETURN:false}
spring.datasource.aj.druid.test-while-idle=${SPRING_DATASOURCE_DRUID_TEST_WHILE_IDLE:true}
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.aj.druid.time-between-eviction-runs-millis=${SPRING_DATASOURCE_DRUID_TIME_BETWEEN_EVICTION_RUNS_MILLIS:60000}
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.aj.druid.min-evictable-idle-time-millis=${SPRING_DATASOURCE_DRUID_MIN_EVICTABLE_IDLE_TIME_MILLIS:300000}
#spring.datasource.aj.druid.max-evictable-idle-time-millis=
#配置多个英文逗号分隔
spring.datasource.aj.druid.filters=${SPRING_DATASOURCE_DRUID_FILTERS:stat}

# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
#是否启用StatFilter默认值true
spring.datasource.aj.druid.web-stat-filter.enabled=${SPRING_DATASOURCE_DRUID_FILTER_ENABLE:true}
spring.datasource.aj.druid.web-stat-filter.url-pattern=${SPRING_DATASOURCE_DRUID_FILTER_URL_PATTERN:/*}
spring.datasource.aj.druid.web-stat-filter.exclusions=${SPRING_DATASOURCE_DRUID_FILTER_EXCLUSIONS:*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*}
spring.datasource.aj.druid.web-stat-filter.session-stat-enable=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_ENABLE:false}
spring.datasource.aj.druid.web-stat-filter.session-stat-max-count=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_MAX_COUNT:1000}
spring.datasource.aj.druid.web-stat-filter.principal-session-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_SESSION_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.principal-cookie-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_COOKIE_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.profile-enable=${SPRING_DATASOURCE_DRUID_FILTER_PROFILE_ENABLE:TRUE}

# StatViewServlet配置
#展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
#是否启用StatViewServlet默认值true
spring.datasource.aj.druid.stat-view-servlet.enabled=${SPRING_DATASOURCE_DRUID_VIEW_ENABLE:TRUE}
#根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
#http://110.76.43.235:9000/druid/index.html
#http://110.76.43.235:8080/mini-web/druid/index.html
spring.datasource.aj.druid.stat-view-servlet.url-pattern=${SPRING_DATASOURCE_DRUID_VIEW_URL_PATTERN:/druid/*}
#允许清空统计数据
spring.datasource.aj.druid.stat-view-servlet.reset-enable=${SPRING_DATASOURCE_DRUID_VIEW_RESET_ENABLE:TRUE}
spring.datasource.aj.druid.stat-view-servlet.login-username=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_USERNAME:admin}
spring.datasource.aj.druid.stat-view-servlet.login-password=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_PASSWORD:admin}


配置文件中,命名一定要不同 spring.datasource.XX.druid
eg:第一个为spring.datasource.aaa.druid
第二个位spring.datasource.bbb.druid

3.编写配置类(细节看代码注释)

@Data
@Configuration
// 前缀为spring.datasource.druid的配置信息,此注解里的内容为你要读取那个配置文件!!!,一定要和配置文件中的命名一样 
@ConfigurationProperties(prefix = "spring.datasource.aj.druid")
//扫描dao层目录
@MapperScan(basePackages = "com.linewell.aj.demo.dao", sqlSessionFactoryRef = "ajSqlSessionFactory")
public class AjDataBaseConfig {

    /**
     * dao层的包路径
     */
    static final String PACKAGE = "com.linewell.aj.demo.dao";

    /**
     * mapper文件的相对路径
     * 路径这里写你想扫描的路径
     */
    private static final String MAPPER_LOCATION = "classpath:mybatis/mapper/**/*.xml";

    /**
     * 数据连接池的属性(读取你@ConfigurationProperties注解标识的properties文件里的属性)
     * 直接复制
     */
    private String filters;
    private String url;
    private String username;
    private String password;
    private String driverClassName;
    private int initialSize;
    private int minIdle;
    private int maxActive;
    private long maxWait;
    private long timeBetweenEvictionRunsMillis;
    private long minEvictableIdleTimeMillis;
    private String validationQuery;
    private boolean testWhileIdle;
    private boolean testOnBorrow;
    private boolean testOnReturn;
    private boolean poolPreparedStatements;
    private int maxPoolPreparedStatementPerConnectionSize;

    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajDataSource")
    public DataSource ajDataSource() throws SQLException {
        DruidDataSource druid = new DruidDataSource();


        // 配置基本属性
        druid.setDriverClassName(driverClassName);
        druid.setUsername(username);
        druid.setPassword(password);
        druid.setUrl(url);
        //初始化时建立物理连接的个数
        druid.setInitialSize(initialSize);
        //最大连接池数量
        druid.setMaxActive(maxActive);
        //最小连接池数量
        druid.setMinIdle(minIdle);
        //获取连接时最大等待时间,单位毫秒。
        druid.setMaxWait(maxWait);
        //间隔多久进行一次检测,检测需要关闭的空闲连接
        druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        //一个连接在池中最小生存的时间
        druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        //用来检测连接是否有效的sql
        druid.setValidationQuery(validationQuery);
        //建议配置为true,不影响性能,并且保证安全性。
        druid.setTestWhileIdle(testWhileIdle);
        //申请连接时执行validationQuery检测连接是否有效
        druid.setTestOnBorrow(testOnBorrow);
        druid.setTestOnReturn(testOnReturn);
        //是否缓存preparedStatement,也就是PSCache,oracle设为true,mysql设为false。分库分表较多推荐设置为false
        druid.setPoolPreparedStatements(poolPreparedStatements);
        // 打开PSCache时,指定每个连接上PSCache的大小
        druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

        return druid;
    }

    // 创建该数据源的事务管理
    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajTransactionManager")
    public DataSourceTransactionManager ajTransactionManager(@Qualifier("ajDataSource") DataSource ajDataSource) throws SQLException {
        return new DataSourceTransactionManager(ajDataSource);
    }

    // 创建Mybatis的连接会话工厂实例
    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajSqlSessionFactory")
    public SqlSessionFactory ajSqlSessionFactory(@Qualifier("ajDataSource") DataSource ajDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(ajDataSource);  // 设置数据源bean
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(AjDataBaseConfig.MAPPER_LOCATION));  // 设置mapper文件路径

        return sessionFactory.getObject();
    }
}

这样springboot会去加载这个配置类,扫描指定的Dao层和mapper文件,添加指定的数据库配置。有多个数据源就写多个配置类,内容都和上面一样,路径修改一下就行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot是一个高效的Java开发框架,它能够方便开发者集成MyBatis-Plus实现多数据源的动态切换以及支持分页查询。MyBatis-Plus是一种优秀的ORM框架,它增强了MyBatis的基础功能,并支持通过注解方式进行映射。 首先,我们需要在pom.xml文件中添加MyBatis-Plus和数据库连接池的依赖。在application.yml文件中,我们需要配置多个数据源和对应的连接信息。我们可以定义一个DataSourceConfig用于获取多个数据源,然后在Mapper配置类中使用@MapperScan(basePackages = {"com.test.mapper"})来扫描Mapper接口。 要实现动态切换数据源,我们可以自定义一个注解@DataSource来标注Mapper接口或方法,然后使用AOP拦截数据源切换,实现动态切换。在实现分页查询时,我们可以使用MyBatis-Plus提供的分页插件来支持分页查询。 代码示例: 1. 在pom.xml文件中添加MyBatis-Plus和数据库连接池的依赖。 ``` <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version> </dependency> </dependencies> ``` 2. 在application.yml文件中配置多个数据源和对应的连接信息。以两个数据源为例: ``` spring: datasource: druid: db1: url: jdbc:mysql://localhost:3306/db1 username: root password: root driver-class-name: com.mysql.jdbc.Driver db2: url: jdbc:mysql://localhost:3306/db2 username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 指定默认数据源 primary: db1 ``` 3. 定义一个DataSourceConfig用于获取多个数据源。 ``` @Configuration public class DataSourceConfig { @Bean("db1") @ConfigurationProperties("spring.datasource.druid.db1") public DataSource dataSource1() { return DruidDataSourceBuilder.create().build(); } @Bean("db2") @ConfigurationProperties("spring.datasource.druid.db2") public DataSource dataSource2() { return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); // 设置数据源映射关系 Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("db1", dataSource1()); dataSourceMap.put("db2", dataSource2()); dynamicDataSource.setTargetDataSources(dataSourceMap); // 设置默认数据源 dynamicDataSource.setDefaultTargetDataSource(dataSource1()); return dynamicDataSource; } } ``` 4. 在Mapper配置类中使用@MapperScan(basePackages = {"com.test.mapper"})来扫描Mapper接口,并使用@DataSource注解来标注Mapper接口或方法。 ``` @Configuration @MapperScan(basePackages = {"com.test.mapper"}) public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } @DataSource("db1") public interface UserMapper { @Select("select * from user where id = #{id}") User selectById(@Param("id") Long id); } ``` 5. 实现AOP拦截数据源切换。 ``` @Aspect @Component public class DataSourceAspect { @Before("@annotation(ds)") public void beforeSwitchDataSource(JoinPoint point, DataSource ds) { String dataSource = ds.value(); if (!DynamicDataSourceContextHolder.containDataSourceKey(dataSource)) { System.err.println("数据源 " + dataSource + " 不存在,使用默认数据源"); } else { System.out.println("使用数据源:" + dataSource); DynamicDataSourceContextHolder.setDataSourceKey(dataSource); } } } ``` 6. 分页查询的使用示例: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override @DataSource("db1") public IPage<User> getUserList(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, null); } } ``` 以上就是SpringBoot整合MyBatis-Plus实现多数据源的动态切换和分页查询的具体实现过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值