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 + + + + +