Spring Boot + mybatic + 多数据源 自动切换

写在开篇

Spring boot 最大的特点就是简化开发(去xml配置)。故这篇所实现的也是配置些注解,并无大量的xml配置。

外甥打灯笼--照旧上代码

依赖其他依赖省去。    

<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
</dependency>

数据源配置:多数据源配置要求必须有一个主配置,多个辅配置

/**
 * Created by echo on 2017/3/21.
 */
@Configuration
@ComponentScan(basePackageClasses = DalModule.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.one", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class DalModule {

    @Value("${demo-one.db-driver}")
    private String driver;

    @Value("${demo-one.db-url}")
    private String jdbcUrl;

    @Value("${demo-one.db-username}")
    private String dbUser;

    @Value("${demo-one.db-password}")
    private String dbPassword;

    @Bean(name = "oneDataSource")
    @Primary
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driver);
        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setUsername(dbUser);
        hikariConfig.setPassword(dbPassword);
        hikariConfig.setPoolName("springHikariCP");
        hikariConfig.setAutoCommit(false);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");

        hikariConfig.setMinimumIdle(1);
        hikariConfig.setMaximumPoolSize(20);
        hikariConfig.setConnectionInitSql("SELECT 1");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

    @Bean
    @Primary
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean("demo-one")
    @Primary
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }

    @Bean(name = "oneSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(oneDataSource);
        sessionFactory.setFailFast(true);
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/one/*Mapper.xml"));
        return sessionFactory.getObject();
    }

说明:

    @Configuration:自动配置。等同于spring的xml配置文件。

    @Value:注入 springBoot的application.properties配置的属性值

    @MapperScan:指定要扫描的Mapper类的包路径。

    @Primary:注解的实例 优先其他实例被注入。

副配置

@Configuration
@ComponentScan(basePackageClasses = DalModuleTwo.class)
@MapperScan(basePackages = "com.livecho.dal.mapper.two", sqlSessionFactoryRef = "twoSqlSessionFactory")
public class DalModuleTwo {

    @Value("${demo-two.db-driver}")
    private String driver;

    @Value("${demo-two.db-url}")
    private String jdbcUrl;

    @Value("${demo-two.db-username}")
    private String dbUser;

    @Value("${demo-two.db-password}")
    private String dbPassword;

    @Bean(name = "twoDataSource")
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driver);
        hikariConfig.setJdbcUrl(jdbcUrl);
        hikariConfig.setUsername(dbUser);
        hikariConfig.setPassword(dbPassword);
        hikariConfig.setPoolName("springHikariCP");
        hikariConfig.setAutoCommit(false);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("useServerPrepStmts", "true");

        hikariConfig.setMinimumIdle(1);
        hikariConfig.setMaximumPoolSize(20);
        hikariConfig.setConnectionInitSql("SELECT 1");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean("demo-two")
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }

    @Bean(name = "twoSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("twoDataSource") DataSource twoDataSource) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(twoDataSource);
        sessionFactory.setFailFast(true);
        sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/two/*Mapper.xml"));
        return sessionFactory.getObject();
    }

和主配置的区别:

    1、少了@Primary这个注解

    2、sqlSessionFactory的名称区别开

    3、mapper.xml的路径 区别开

    4、mapperScan 扫描包地址 区别开

数据源配置

demo-one:
  db-driver: com.mysql.jdbc.Driver
  db-url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8
  db-username: root
  db-password: root

demo-two:
  db-driver: com.mysql.jdbc.Driver
  db-url: jdbc:mysql://127.0.0.1:3306/demoTwo?useUnicode=true&characterEncoding=utf8
  db-username: root
  db-password: root

 

 

 

 

项目结构图:

 

总结说明:

    1、配置简单:

        a、application.properties配置多个数据源

        b、配置多个数据库连接池(必须有一主@Primary)

        c、注意不同数据库的表mapper、dao、xml对象存放不同路径

    2、不影响开发流程:

        a、不用在调用mapper处指定数据源。

        b、业务开发流程不变。controller->service->serviceImpl->repository->repositoryImpl->mapper->xml

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spring Boot + MyBatis可以通过注解和自动配置来简化SSM框架的配置,具体步骤如下: 1. 引入依赖:在pom.xml文件中添加Spring BootMyBatis的依赖,例如: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> ``` 2. 配置数据源:在application.properties或application.yml文件中配置数据源,例如: ``` spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root ``` 3. 配置MyBatis:在启动类中添加@MapperScan注解,指定Mapper接口所在的包路径,例如: ``` @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 4. 编写Mapper接口和Mapper XML文件:在Mapper接口中添加@Mapper注解,编写SQL语句,在Mapper XML文件中配置SQL语句和结果映射,例如: ``` @Mapper public interface UserMapper { @Select("select * from user") List<User> findAll(); } ``` ``` <select id="findAll" resultType="com.example.demo.pojo.User"> select * from user </select> ``` 通过以上配置,就可以实现Spring Boot + MyBatis的简化SSM框架。在以上配置中,Spring Boot提供了自动配置和默认配置,可以省去很多繁琐的配置工作,同时还可以提高开发效率和代码可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值