SpringBoot 2.0 + Mybatis + Mybatis Generator + 多数据源 + IDEA
吐槽
昨天网上找了个“完整”版的使用 SpringBoot 2.0 + Mybatis 实现多数据源,结果其实是缺少部分代码的,被害得很惨,浪费了太多时间,找了N多教程后最终集成成功,赶紧文章整理出来。
开发环境、技术栈
使用IDEA,集成了下面的功能点:SpringBoot 2.0 + Mybatis + Mybatis Generator + XML
以XML的形式和数据库交互,而不是使用注解的方式,项目之后遇到复杂的SQL语句还是XML形式方便
项目制作步骤
- 使用 IDEA 创建 SpringBoot 2.0 项目的过程略过
-
pom.xml 的全部代码:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE com.xdf multd 0.0.1-SNAPSHOT multd Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-data-jdbc org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 org.springframework.boot spring-boot-devtools runtime true mysql mysql-connector-java runtime org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin org.mybatis.generator mybatis-generator-maven-plugin true true - 解释项目结构
本来想在图片中标注每个包、文件的作用,看看太多了,还是文字表达吧。controller 存放控制器类,com.xdf.multd.dao.test1 和 com.xdf.multd.dao.test2 分别存放两个数据库对应的 dao 类,com.xdf.multd.datasource 存放两个数据库对应的数据库连接,将两个数据库表对应的ORM类的都存放在包com.xdf.multd.model 中,com.xdf.multd.service 自然是服务层了。
下面讲解 resources 目录下的文件:
mapper 是 Mybatis Generator 生成的 mapper 文件存放的位置,生成后要对应的拷贝到 mappers.test1 或者 mappers.test2 中,下面的3个文件 application.yml、application-dev.yml、application-mult.yml 是多环境配置,generatorConfig.xml 是 Mybatis Generator 的相关参数,mybatis-config.xml 是映射ORM时数据类型的对应关系,最后一个 mysql-connector-java-5.1.34.jar 是 Mybatis Generator 链接数据库时要用到的驱动。
-
application.yml 的全部代码:
spring: profiles: active: mult
application-mult.yml 的全部代码:
server: port: 8083 # mybatis generator 的配置 mybatis: config-location: classpath:mybatis-config.xml mapper-locations: classpath:mapper/*.xml type-aliases-package: com.xdf.multd.model spring: datasource: test1: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/femis?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: chanchaw test2: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/femisimg?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: chanchaw
-
mybatis-config.xml 的全部代码:
generatorConfig.xml 的全部代码:
-
为两个数据库创建对应的数据源,两个文件都放在 com.xdf.multd.datasource 下,其中 DataSource1Config 对的全部代码如下:
package com.xdf.multd.datasource; 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 org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.xdf.multd.dao.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate") public class DataSource1Config { @Bean(name = "test1DataSource") @ConfigurationProperties(prefix = "spring.datasource.test1") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test1SqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setMapperLocations(resolver.getResources("classpath*:mappers/test1/*.xml")); return bean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Bean(name = "test1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
DataSource2Config 的全部代码如下:
package com.xdf.multd.datasource; 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.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.xdf.multd.dao.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "test2DataSource") @ConfigurationProperties(prefix = "spring.datasource.test2") public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test2SqlSessionFactory") public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setMapperLocations(resolver.getResources("classpath*:mappers/test2/*.xml")); return bean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Bean(name = "test2TransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test2SqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
- 剩下的工作就是使用 Mybatis Generator 生成 ORM 类并且拷贝到对应的目录下,自己手动制作服务类和控制器用来测试