一般公司分两个数据库:
一个放共同配置文件, 一个数据库垂直业务数据库
垂直拆分和水平拆分:
垂直是根据业务划分具体数据库
在一个项目中有多个数据源(不同库jdbc) 无限个的哈~ 根据包名 或者 注解方式 划分多个数据源
本博客讲解的是分包情况下的:
首先创建两个包
数据库也是如此:
当前的目录结构这样:
根据不同的包名字,连接不同的数据源
pom文件如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>multipleDatasource</groupId> <artifactId>com.toov5.multiple</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!-- mysql 依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- springboot-web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
数据源的配置文件:application.properties
###datasource1 spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8 spring.datasource.test1.username = root spring.datasource.test1.password = root ###datasource2 spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8 spring.datasource.test2.username = root spring.datasource.test2.password = root
datasource包下面的相关配置的Java代码:
package com.toov5.datasource; import javax.sql.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.jdbc.datasource.DataSourceTransactionManager; //DataSource01数据源的读取 @Configuration // 注册到springboot容器中 @MapperScan(basePackages = "com.toov5.test01", sqlSessionFactoryRef = "test1SqlSessionFactory") //指向了下面的名为 test1SqlSessionFactory 的工厂 public class DataSource1Config { @Bean(name = "test1DataSource") //表示注入到Spring 容器中去 @ConfigurationProperties(prefix = "spring.datasource.test1") //表以此为开头,去properties去读 ( 后面是写死的) @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); // bean.setMapperLocations( // new // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")); // 如果有一些mapper文件的话 可以把上面的注解放开 return bean.getObject(); } @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); } }
和
package com.toov5.datasource; import javax.sql.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.jdbc.datasource.DataSourceTransactionManager; //DataSource2 @Configuration // 注册到springboot容器中 @MapperScan(basePackages = "com.toov5.test02", sqlSessionFactoryRef = "test2SqlSessionFactory") 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); // bean.setMapperLocations( // new // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml")); return bean.getObject(); } @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); } }
然后相应的实体类代码:
package com.toov5.entity; import lombok.Data; @Data public class User { private Integer age; private String name; private Integer id; }
mappertest01和mappertest02
package com.toov5.mappertest01; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; public interface UserMapperTest01 { @Insert("insert into users values(null,#{name},#{age});") public int insert(@Param("name") String name, @Param("age") Integer age); }
和
package com.toov5.mappertest02; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; public interface UserMapperTest02 { @Insert("insert into users values(null,#{name},#{age});") public int insert(@Param("name") String name, @Param("age") Integer age); }
service01和service02
package com.toov5.service01; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.toov5.mappertest01.UserMapperTest01; import lombok.extern.slf4j.Slf4j; @Service @Slf4j public class UserService01 { @Autowired private UserMapperTest01 userMapperTest01; public int insertUser(String name, Integer age){ int result = userMapperTest01.insert(name, age); log.info("####################",result); return result; } }
和
package com.toov5.service02; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.toov5.mappertest02.UserMapperTest02; import lombok.extern.slf4j.Slf4j; @Service @Slf4j public class UserService02 { @Autowired private UserMapperTest02 userMapperTest02; public int insertUser(String name, Integer age){ int result = userMapperTest02.insert(name, age); log.info("####################",result); return result; } }
controller类
package com.toov5.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.toov5.test01.service01.UserService01; @RestController public class MultiplyController { @Autowired private UserService01 userService01; @Autowired private UserService01 userService02; @RequestMapping("/insertUser01") public Integer insertUser1(String name, Integer age){ return userService01.insertUser(name, age); } @RequestMapping("/insertUser02") public Integer insertUser2(String name, Integer age){ return userService02.insertUser(name, age); } }
启动类:
package com.toov5.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages={"com.toov5.*"}) public class app { public static void main(String[] args) { SpringApplication.run(app.class, args); } }
启动后访问:
数据库:
访问:
数据库结果:
注:spring1.5时候 默认只想数据源 会报错~ 2.0之后得到了修复