Spring Boot整合MyBatis多数据源

匿名 (未验证) 提交于 2019-12-02 23:49:02

在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。

添加MyBatis、Druid依赖(这里的Druid必须是专为Spring boot打造的Druid,不能使用传统的Druid)、MySQL以及Web依赖,完整的依赖如下:

<dependencies>         <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.0</version>         </dependency>         <dependency>             <groupId>mysql</groupId>             <artifactId>mysql-connector-java</artifactId>             <!--注意配置版本号-->             <version>5.1.28</version>      https://i.cnblogs.com/EditCategories.aspx?catid=1       <scope>runtime</scope>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>         <!--druid连接池-->         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>druid-spring-boot-starter</artifactId>             <version>1.1.10</version>         </dependency>     </dependencies>

接下来配置多数据源,在application.properties中配置数据库基本信息,然后提供两个DataSource即可,下面是简单的application.properties中的配置:

spring.datasource.one.url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8 spring.datasource.one.username=root spring.datasource.one.password=123456 spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource  spring.datasource.two.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8 spring.datasource.two.username=root spring.datasource.two.password=123456 spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

然后创建DataSourceConfig 配置类,里面配置对应的两个数据源:

@Configuration public class DataSourceConfig {     @Bean     @ConfigurationProperties(prefix = "spring.datasource.one")     DruidDataSource dsOne() {         return DruidDataSourceBuilder.create().build();     }      @Bean     @ConfigurationProperties(prefix = "spring.datasource.two")     DruidDataSource dsTwo() {         return DruidDataSourceBuilder.create().build();     } }

这里需要配置两个Bean,所以两个数据源分两个类配置:

@Configuration//声明该类是一个配置类 @MapperScan(basePackages = "com.lwh.mybatistest.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1") //扫描的包是com.lwh.mybatistest.mapper //SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。 public class MyBatisConfigOne {     @Resource(name = "dsOne")     DataSource dsOne;      @Bean     SqlSessionFactory sqlSessionFactory1() {         SqlSessionFactory sessionFactory = null;         try {             SqlSessionFactoryBean bean = new SqlSessionFactoryBean();             bean.setDataSource(dsOne);             sessionFactory = bean.getObject();         } catch (Exception e) {             e.printStackTrace();         }         return sessionFactory;     }      @Bean     SqlSessionTemplate sqlSessionTemplate1() {         return new SqlSessionTemplate(sqlSessionFactory1());     } }

依照第一个配置,配置第二个数据源即可,这里需要注意因为操作的是不同的数据源,所以扫描的包是不一样的,不同的Mapper将操作不同的数据源。如下:

@Configuration//声明该类是一个配置类 @MapperScan(basePackages = "com.lwh.mybatistest.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2") public class MyBatisConfigTwo {     @Resource(name = "dsTwo")     DataSource dsTwo;      @Bean     SqlSessionFactory sqlSessionFactory2() {         SqlSessionFactory sessionFactory = null;         try {             SqlSessionFactoryBean bean = new SqlSessionFactoryBean();             bean.setDataSource(dsTwo);             sessionFactory = bean.getObject();         } catch (Exception e) {             e.printStackTrace();         }         return sessionFactory;     }      @Bean     SqlSessionTemplate sqlSessionTemplate2() {         return new SqlSessionTemplate(sqlSessionFactory2());     } }

项目结构如下:

上面的mapper.xml文件是用MyBatis逆向工程生成的,这里不再赘述。
在Maven项目中,官方建议我们把XML文件放在resources文件下,如果放在java下面,项目打包的时候回自动的过滤掉,所以我们在Maven的配置文件中,让他不要过滤我们的XML,因此在配置文件中的 bulid 节点里面添加配置信息,如下:

<build>         <resources>             <resource>                 <directory>src/main/java</directory>                 <includes>                     <include>**/*.xml</include>                 </includes>             </resource>             <resource>                 <directory>src/main/resources</directory>             </resource>         </resources> </build>

数据库one的数据为:

数据库two的数据为:

现在去测试类测试我们的配置是否成功:

@RunWith(SpringRunner.class) @SpringBootTest public class MybatistestApplicationTests {      @Autowired     BookMapper bookMapper;     @Autowired     BookMapper2 bookMapper2;     @Test     public void contextLoads() {         List<Book> list = bookMapper.getAllBook();         System.out.println("第一个:" + list);         System.out.println("第二个:" + bookMapper2.getAllBook());      }  }

输出结果为:

第一个:[Book{id=1, bookname='三国演义', author='罗贯中'}]
第二个:[Book{id=2, bookname='红楼梦', author='曹雪芹'}]

因此我们的项目多数据源的操作就配置成功了!

以上配置教程参考江南一点雨的博客。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!