diff --git a/pom.xml b/pom.xml
index 843a0e9..b47f14e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
springboot-dubbo-client
springboot-redis
springboot-validation-over-json
+ springboot-mybatis-mutil-datasource
diff --git a/springboot-mybatis-mutil-datasource/pom.xml b/springboot-mybatis-mutil-datasource/pom.xml
new file mode 100755
index 0000000..9dc6a35
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/pom.xml
@@ -0,0 +1,67 @@
+
+
+ 4.0.0
+
+ springboot
+ springboot-mybatis-mutil-datasource
+ 0.0.1-SNAPSHOT
+ springboot-mybatis-mutil-datasource :: Spring Boot 实现 Mybatis 多数据源配置
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.1.RELEASE
+
+
+
+ 1.2.0
+ 5.1.39
+ 1.0.18
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ ${mybatis-spring-boot}
+
+
+
+
+ com.alibaba
+ druid
+ ${druid}
+
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql-connector}
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/Application.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/Application.java
new file mode 100644
index 0000000..5070937
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/Application.java
@@ -0,0 +1,20 @@
+package org.spring.springboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * Spring Boot 应用启动类
+ *
+ * Created by bysocket on 16/4/26.
+ */
+// Spring Boot 应用的标识
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ // 程序启动入口
+ // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
+ SpringApplication.run(Application.class,args);
+ }
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/ClusterDataSourceConfig.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/ClusterDataSourceConfig.java
new file mode 100644
index 0000000..acc6584
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/ClusterDataSourceConfig.java
@@ -0,0 +1,61 @@
+package org.spring.springboot.config.ds;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+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.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+// 扫描 Mapper 接口并容器管理
+@MapperScan(basePackages = ClusterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "clusterSqlSessionFactory")
+public class ClusterDataSourceConfig {
+ // 精确到 cluster 目录,以便跟其他数据源隔离
+ static final String PACKAGE = "org.spring.springboot.dao.cluster";
+ static final String MAPPER_LOCATION = "classpath:mapper/cluster/*.xml";
+
+ @Value("${cluster.datasource.url}")
+ private String url;
+
+ @Value("${cluster.datasource.username}")
+ private String user;
+
+ @Value("${cluster.datasource.password}")
+ private String password;
+
+ @Value("${cluster.datasource.driverClassName}")
+ private String driverClass;
+
+ @Bean(name = "clusterDataSource")
+ public DataSource clusterDataSource() {
+ DruidDataSource dataSource = new DruidDataSource();
+ dataSource.setDriverClassName(driverClass);
+ dataSource.setUrl(url);
+ dataSource.setUsername(user);
+ dataSource.setPassword(password);
+ return dataSource;
+ }
+
+ @Bean(name = "clusterTransactionManager")
+ public DataSourceTransactionManager clusterTransactionManager() {
+ return new DataSourceTransactionManager(clusterDataSource());
+ }
+
+ @Bean(name = "clusterSqlSessionFactory")
+ public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource clusterDataSource)
+ throws Exception {
+ final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+ sessionFactory.setDataSource(clusterDataSource);
+ sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
+ .getResources(ClusterDataSourceConfig.MAPPER_LOCATION));
+ return sessionFactory.getObject();
+ }
+}
\ No newline at end of file
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/MasterDataSourceConfig.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/MasterDataSourceConfig.java
new file mode 100644
index 0000000..4623a8a
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/config/ds/MasterDataSourceConfig.java
@@ -0,0 +1,65 @@
+package org.spring.springboot.config.ds;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+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.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@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();
+ }
+}
\ No newline at end of file
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/controller/UserRestController.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/controller/UserRestController.java
new file mode 100644
index 0000000..2bb48a5
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/controller/UserRestController.java
@@ -0,0 +1,34 @@
+package org.spring.springboot.controller;
+
+import org.spring.springboot.domain.City;
+import org.spring.springboot.domain.User;
+import org.spring.springboot.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 用户控制层
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+@RestController
+public class UserRestController {
+
+ @Autowired
+ private UserService userService;
+
+ /**
+ * 根据用户名获取用户信息,包括从库的地址信息
+ *
+ * @param userName
+ * @return
+ */
+ @RequestMapping(value = "/api/user", method = RequestMethod.GET)
+ public User findByName(@RequestParam(value = "userName", required = true) String userName) {
+ return userService.findByName(userName);
+ }
+
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/cluster/CityDao.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/cluster/CityDao.java
new file mode 100644
index 0000000..156aacc
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/cluster/CityDao.java
@@ -0,0 +1,21 @@
+package org.spring.springboot.dao.cluster;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.spring.springboot.domain.City;
+
+/**
+ * 城市 DAO 接口类
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+@Mapper
+public interface CityDao {
+
+ /**
+ * 根据城市名称,查询城市信息
+ *
+ * @param cityName 城市名
+ */
+ City findByName(@Param("cityName") String cityName);
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/master/UserDao.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/master/UserDao.java
new file mode 100644
index 0000000..848ccdc
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/dao/master/UserDao.java
@@ -0,0 +1,22 @@
+package org.spring.springboot.dao.master;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.spring.springboot.domain.User;
+
+/**
+ * 用户 DAO 接口类
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+@Mapper
+public interface UserDao {
+
+ /**
+ * 根据用户名获取用户信息
+ *
+ * @param userName
+ * @return
+ */
+ User findByName(@Param("userName") String userName);
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/City.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/City.java
new file mode 100644
index 0000000..1de876b
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/City.java
@@ -0,0 +1,63 @@
+package org.spring.springboot.domain;
+
+import java.io.Serializable;
+
+/**
+ * 城市实体类
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+public class City {
+
+ /**
+ * 城市编号
+ */
+ private Long id;
+
+ /**
+ * 省份编号
+ */
+ private Long provinceId;
+
+ /**
+ * 城市名称
+ */
+ private String cityName;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getProvinceId() {
+ return provinceId;
+ }
+
+ public void setProvinceId(Long provinceId) {
+ this.provinceId = provinceId;
+ }
+
+ public String getCityName() {
+ return cityName;
+ }
+
+ public void setCityName(String cityName) {
+ this.cityName = cityName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/User.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/User.java
new file mode 100644
index 0000000..161895d
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/domain/User.java
@@ -0,0 +1,58 @@
+package org.spring.springboot.domain;
+
+/**
+ * 用户实体类
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+public class User {
+
+ /**
+ * 城市编号
+ */
+ private Long id;
+
+ /**
+ * 城市名称
+ */
+ private String userName;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ private City city;
+
+ public City getCity() {
+ return city;
+ }
+
+ public void setCity(City city) {
+ this.city = city;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/UserService.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/UserService.java
new file mode 100644
index 0000000..a54d3a5
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/UserService.java
@@ -0,0 +1,20 @@
+package org.spring.springboot.service;
+
+import org.spring.springboot.domain.City;
+import org.spring.springboot.domain.User;
+
+/**
+ * 用户业务接口层
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+public interface UserService {
+
+ /**
+ * 根据用户名获取用户信息,包括从库的地址信息
+ *
+ * @param userName
+ * @return
+ */
+ User findByName(String userName);
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/impl/UserServiceImpl.java b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..cb30255
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/java/org/spring/springboot/service/impl/UserServiceImpl.java
@@ -0,0 +1,32 @@
+package org.spring.springboot.service.impl;
+
+import org.spring.springboot.dao.cluster.CityDao;
+import org.spring.springboot.dao.master.UserDao;
+import org.spring.springboot.domain.City;
+import org.spring.springboot.domain.User;
+import org.spring.springboot.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户业务实现层
+ *
+ * Created by bysocket on 07/02/2017.
+ */
+@Service
+public class UserServiceImpl implements UserService {
+
+ @Autowired
+ private UserDao userDao; // 主数据源
+
+ @Autowired
+ private CityDao cityDao; // 从数据源
+
+ @Override
+ public User findByName(String userName) {
+ User user = userDao.findByName(userName);
+ City city = cityDao.findByName("温岭市");
+ user.setCity(city);
+ return user;
+ }
+}
diff --git a/springboot-mybatis-mutil-datasource/src/main/resources/application.properties b/springboot-mybatis-mutil-datasource/src/main/resources/application.properties
new file mode 100644
index 0000000..24ae4f1
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/resources/application.properties
@@ -0,0 +1,11 @@
+## master 数据源配置
+master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8
+master.datasource.username=root
+master.datasource.password=123456
+master.datasource.driverClassName=com.mysql.jdbc.Driver
+
+## cluster 数据源配置
+cluster.datasource.url=jdbc:mysql://localhost:3306/springbootdb_cluster?useUnicode=true&characterEncoding=utf8
+cluster.datasource.username=root
+cluster.datasource.password=123456
+cluster.datasource.driverClassName=com.mysql.jdbc.Driver
\ No newline at end of file
diff --git a/springboot-mybatis-mutil-datasource/src/main/resources/mapper/CityMapper.xml b/springboot-mybatis-mutil-datasource/src/main/resources/mapper/CityMapper.xml
new file mode 100644
index 0000000..6b35457
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/resources/mapper/CityMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, province_id, city_name, description
+
+
+
+
+
diff --git a/springboot-mybatis-mutil-datasource/src/main/resources/mapper/master/UserMapper.xml b/springboot-mybatis-mutil-datasource/src/main/resources/mapper/master/UserMapper.xml
new file mode 100644
index 0000000..9f21ced
--- /dev/null
+++ b/springboot-mybatis-mutil-datasource/src/main/resources/mapper/master/UserMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ id, user_name, description
+
+
+
+
+