暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Boot+MyBatis配置多数据库

码上记录 2021-09-03
394

Spring Boot+MyBatis是现在项目中很常见的配置。使用MyBatis连接单个数据库也很简单,连接多个数据库会稍微复杂一些。下面以连接MySQL数据库为例,介绍一下具体的配置。这里Spring Boot的版本是2.5.4。


1 配置pom文件,增加MyBatis starter和连接MySQL需要的jar包。

       <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
    </dependency>


    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>


    2 配置单个数据库连接

      @Configuration
      @MapperScan(basePackages="com.example.mapper",sqlSessionTemplateRef="sqlSessionTemplate")
      public class DatabaseConfig {
      @Bean
      @ConfigurationProperties(prefix = "test.datasource")
      public DataSource dataSource() {
      return DataSourceBuilder.create().build();
      }


      @Bean
      public SqlSessionFactory sqlSessionFactory(DataSource dataSource)
      throws Exception {
      SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
      sessionFactory.setDataSource(dataSource);
      return sessionFactory.getObject();
      }


      @Bean
      public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
      return new SqlSessionTemplate(sqlSessionFactory);
      }
      }


      使用@ConfigurationProperties(prefix = "test.datasource")可以直接从application.xml中读取数据库的配置信息。


      application.xml文件中的数据库配置信息如下:

        test1.datasource.jdbc-url=jdbc:mysql://192.168.0.100:3306/test?characterEncoding=utf-8
        test1.datasource.username=test
        test1.datasource.password=test
        test1.datasource.driverClassName=com.mysql.cj.jdbc.Driver
        test1.datasource.test-on-borrow=true
        test1.datasource.validation-query=SELECT 1


        需要注意的是,如果是Spring Boot 1.X的版本,如下所示有两处配置是和2.X版本是不同的。

          // 1.X 版本配置的url名称是 datasource.url  2.X是 datasource.jdbc-url
          test.datasource.url=jdbc:mysql://10.10.10.10:3306/testdb?characterEncoding=utf-8
          test.datasource.username=test
          test.datasource.password=test
          // 1.X 版本推荐的mysql驱动时 com.mysql.jdbc.Driver
          test.datasource.driverClassName=com.mysql.jdbc.Driver
          test.datasource.test-on-borrow=true
          test.datasource.validation-query=SELECT 1


          3  配置多个数据库的连接。首先配置第一个数据库。

            @Configuration
            @MapperScan(basePackages="com.example.mapper",sqlSessionTemplateRef="sqlSessionTemplate")
            public class FirstDatabaseConfig {


            @Bean
            @Primary
            @ConfigurationProperties(prefix = "test1.datasource")
            public DataSource dataSource() {
            return DataSourceBuilder.create().build();
            }


            @Bean
            @Primary
            public SqlSessionFactory sqlSessionFactory(DataSource dataSource)
            throws Exception {
            SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(dataSource);
            return sessionFactory.getObject();
            }


            @Bean
            @Primary
            public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
            }
            }

               

            需要注意的是,如果多个数据库,需要指定一个数据库为首选数据库,用@Primary注解标注出来。在创建DataSource,SqlSessionFactory,SqlSessionTemplate时都需要标注出来。


            另外如果不特别用 @Bean的name属性写明bean的变量名的话,bean的默认变量名为创建bean的方法名,例如上文DataSource的实例的变量名为dataSource。


            然后配置第二个数据库

              @Configuration
              @MapperScan(basePackages="com.example.mapper2",sqlSessionTemplateRef="secondSqlSessionTemplate")
              public class SecondDatabaseConfig {


              @Bean
              @ConfigurationProperties(prefix = "test2.datasource")
              public DataSource secondDataSource() {
              return DataSourceBuilder.create().build();
              }


              @Bean
              public SqlSessionFactory secondSqlSessionFactory(
              @Qualifier("secondDataSource") DataSource dataSource)
              throws Exception {
              SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
              sessionFactory.setDataSource(dataSource);
              return sessionFactory.getObject();
              }


              @Bean
              public SqlSessionTemplate secondSqlSessionTemplate(
              @Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
              return new SqlSessionTemplate(sqlSessionFactory);
              }
              }



              在创建第二个数据库时,需要注意的是要使用@Qualifier注解来说明要注入的实例的变量名是什么。如果不用@Qualifier注解,会注入首选实例,即用@Primary注解标明的实例。


              另外如果项目需要配置两个数据库,@MapperScan也需要分别配置,要配置两个不同的扫描路径。

              文章转载自码上记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论