SpringBoot和Mybatis配置多數據源鏈接多個數據庫
目前業界操做數據庫的框架通常是 Mybatis
,但在不少業務場景下,咱們須要在一個工程裏配置多個數據源來實現業務邏輯。在SpringBoot
中也能夠實現多數據源並配合Mybatis
框架編寫xml文件來執行SQL。在SpringBoot
中,配置多數據源的方式十分便捷,java
下面開始上代碼:mysql
- 在
pom.xml
文件中須要添加一些依賴
<!-- Spring Boot Mybatis 依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <!-- MySQL 鏈接驅動依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- Druid 數據鏈接池依賴 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.18</version> </dependency>
- application.properties 配置兩個數據源配置
# master 數據源配置 master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8 master.datasource.username=root master.datasource.password=321 master.datasource.driverClassName=com.mysql.jdbc.Driver # second 數據源配置 second.datasource.url=jdbc:mysql://localhost:3306/springbootdb_second?useUnicode=true&characterEncoding=utf8 second.datasource.username=root second.datasource.password=321 second.datasource.driverClassName=com.mysql.jdbc.Driver
- 數據源配置
多數據源配置的時候注意,必需要有一個主數據源,即
MasterDataSourceConfig
配置
MasterDataSourceConfig
的代碼:git
@Configuration // 掃描 Mapper 接口並容器管理 @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory") public class MasterDataSourceConfig { // 精確到 master 目錄,以便跟其餘數據源隔離 static final String PACKAGE = "org.spring.springboot.dao.master"; static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml"; @Value("${master.datasource.url}") private String url; @Value("${master.datasource.username}") private String user; @Value("${master.datasource.password}") private String password; @Value("${master.datasource.driverClassName}") private String driverClass; @Bean(name = "masterDataSource") @Primary public DataSource masterDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "masterTransactionManager") @Primary public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(masterDataSource()); } @Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(MasterDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
第二個數據源SecondDataSourceConfig
的配置以下:github
@Configuration // 掃描 Mapper 接口並容器管理 @MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory") public class SecondDataSourceConfig { // 精確到 cluster 目錄,以便跟其餘數據源隔離 static final String PACKAGE = "com.springboot.dao.second"; static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml"; @Value("${second.datasource.url}") private String url; @Value("${second.datasource.username}") private String user; @Value("${second.datasource.password}") private String password; @Value("${second.datasource.driverClassName}") private String driverClass; @Bean(name = "secondDataSource") public DataSource clusterDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "secondTransactionManager") public DataSourceTransactionManager clusterTransactionManager() { return new DataSourceTransactionManager(clusterDataSource()); } @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(clusterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(SecondDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
到此,不一樣的數據源配置就已經完成,剩下的只須要將將Mybatis
的xml文件和DAO
層的接口寫好,並在Service
層注入,直接使用就行。spring
Service
層的代碼:sql
@Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Autowired private SchoolDao schoolDao; public UserVo getUser(Long id) { UserVo userVo = userDao.findById(id); SchoolVo schoolVo = schoolDao.findByName("清華"); userVo.setSchoolVo(schoolVo); return userVo; } }
Mybatis的xml文件UserDao.xml
和SchoolDao.xml
的內容:數據庫
UserDao.xml
api
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.springboot.dao.master.UserDao"> <resultMap id="BaseResultMap" type="com.springboot.vo.UserVo"> <result column="id" property="id" /> <result column="user_name" property="userName" /> </resultMap> <sql id="Base_Column_List"> id, user_name </sql> <select id="findById" resultMap="BaseResultMap" parameterType="java.lang.Long"> select <include refid="Base_Column_List" /> from user where id = #{id} </select> </mapper>
SchoolDao.xml
瀏覽器
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.springboot.dao.second.SchoolDao"> <resultMap id="BaseResultMap" type="com.springboot.vo.SchoolVo"> <result column="id" property="id" /> <result column="school_name" property="schoolName" /> <result column="school_describe" property="schoolDescribe" /> </resultMap> <sql id="Base_Column_List"> id, school_name, school_describe </sql> <select id="findByName" resultMap="BaseResultMap" parameterType="java.lang.String"> select <include refid="Base_Column_List" /> from school where school_name = #{schoolName} </select> </mapper>
TestController
springboot
@Controller @RequestMapping(value = "/api/v1/test") public class TestController { @Autowired private UserService userService; @RequestMapping(value = "/getUser") @ResponseBody public UserVo getUser(@RequestParam(value = "id") Long id) { return userService.getUser(id); } }
建立數據庫和表SQL:
CREATE DATABASE springbootdb; CREATE DATABASE springbootdb_second; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶編號', `user_name` varchar(25) DEFAULT NULL COMMENT '用戶名稱', `description` varchar(25) DEFAULT NULL COMMENT '描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 CREATE TABLE `school` ( `id` bigint(20) NOT NULL, `school_name` varchar(64) DEFAULT NULL COMMENT '學校名', `school_describe` varchar(128) DEFAULT NULL COMMENT '學校描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 insert into `springbootdb`.`user` ( `user_name`, `description`) values ( 'shuai', 'so handsome'); insert into `springbootdb_second`.`school` ( `id`, `school_name`, `school_describe`) values ( '1', '清華', '自強不息,厚德載物');
建立好數據後,整個工程的機構以下:
啓動程序,在瀏覽器輸入:http://localhost:8080/api/v1/test/getUser?id=1便可返回結果。
github地址:Spring Boot 教程、技術棧、示例代碼