springboot學習入門簡易版九---springboot2.0整合多數據源mybatis mysql8+(22)
阿新 • • 發佈:2019-05-12
tar att 分享 -m st2 unicode ons myba 大小
一個項目中配置多個數據源(鏈接不同庫jdbc),無限大,具體多少根據內存大小
項目中多數據源如何劃分:分包名(業務)或註解方式。分包名方式類似多個不同的jar,同業務需求放一個包中。
分包方式配置多數據源
項目目錄結構
2.14.1 pom文件
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.9.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <!-- mysql 驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!-- 提示建議引入 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies>
2.14.2 創建test1包名下類
public class Employee implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String lastName;
public interface EmployeeDao { // @Insert("insert into myemployeee(last_name) values (#{lastName})")int insert(Employee emp); }
EmployeeMapping.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.springboot2.test1.dao.EmployeeDao"> <insert id="insert" parameterType="com.springboot2.test1.bean.Employee"> insert into myemployeee(last_name) values (#{lastName,jdbcType=VARCHAR}) </insert> </mapper>
service類
@Service public class EmployeeService { @Autowired EmployeeDao employeeDao; public Integer insert(Employee emp) { return employeeDao.insert(emp); } }
2.14.3 創建test2包名下類
public class User implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; private Integer age;
public interface UserDao { // @Insert("insert into myuser(name,age) values (#{name},#{age})") int insert(User user); }
UserMapping.xml文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.springboot2.test2.dao.UserDao"> <insert id="insert" parameterType="com.springboot2.test2.bean.User"> insert into myuser(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER}) </insert> </mapper>
@Service public class UserService { @Autowired UserDao userDao; public Integer insert(User user2) { return userDao.insert(user2); } }
2.14.4 重點:多數據源配置
2.14.4.1首先application.yml文件
#多數據源配置 spring: datasource: test1: #數據源1(自定義) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true username: root password: (***) test2: #數據源2(自定義) driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/mytest2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true username: root password: (***)
註意:雖然為高版本,但多數據源配置時,必須為spring.datasource.test.jdbc-url而不是spring.datasource.test.url
2.14.4.2多數據源配置類
/** * 數據源配置 * @author admin * */ @Configuration @MapperScan(basePackages= "com.springboot2.test1.dao",sqlSessionFactoryRef="test1SqlSessionFactory") //註意:com.springboot2.test1.dao是dao類的包名!! public class DatasourceConfig1 { /** * 配置test1數據庫 * @return */ @Bean(name="test1DataSource") @ConfigurationProperties(prefix="spring.datasource.test1") @Primary public DataSource test1DataSource() { return DataSourceBuilder.create().build(); } /** * 創建sqlsessinfactory會話工廠 * @param dataSource * @return * @throws Exception */ @Bean(name="test1SqlSessionFactory") @Primary public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); //加載mapping文件 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:com/springboot2/test1/mapping/*.xml")); return sqlSessionFactoryBean.getObject(); } /** * 事務管理 */ @Bean(name="test1TransactionManager") @Primary public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 創建SqlSessionTemplate * @param sqlSessionFactory * @return */ @Bean(name="test1SqlSessionTemplate") @Primary public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
/** * 數據源配置 * @author admin * */ @Configuration @MapperScan(basePackages= {"com.springboot2.test2.dao"},sqlSessionFactoryRef="test2SqlSessionFactory") public class DatasourceConfig2 { /** * 配置test2數據庫 * @return */ @Bean(name="test2DataSource") @ConfigurationProperties(prefix="spring.datasource.test2") public DataSource test2DataSource() { return DataSourceBuilder.create().build(); } /** * 創建sqlsessinfactory會話工廠 * @param dataSource * @return * @throws Exception */ @Bean(name="test2SqlSessionFactory") public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); //加載mapping文件 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:com/springboot2/test2/mapping/*.xml")); return sqlSessionFactoryBean.getObject(); } /** * 事務管理 */ @Bean(name="test2TransactionManager") public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 創建SqlSessionTemplate * @param sqlSessionFactory * @return */ @Bean(name="test2SqlSessionTemplate") public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
註意:
1)分包方式下@Primary可以不寫!
2)mapperscan掃描為dao類對應的包名而不是dao類,否則會導致無法註入,報錯缺少component註解。
2.14.5 controller類
@RestController public class MultiDataSourceController { @Autowired EmployeeService employeeService1; @Autowired UserService userService; @RequestMapping("/insertEmployee") public String insert(String lastName){ Employee emp=new Employee(); emp.setLastName(lastName); int i=employeeService1.insert(emp); return i+""; } //接收json格式請求 @RequestMapping("/insertUser") public String insert(@RequestBody User user){ User user2=new User(); user2.setAge(user.getAge()); user2.setName(user.getName()); int i=userService.insert(user2); return i+""; } //接收普通格式多參數請求 @RequestMapping("/insertUser2") public String insertUser2(@RequestParam("name") String name,@RequestParam("name") Integer age){ User user2=new User(); user2.setAge(age); user2.setName(name); int i=userService.insert(user2); return i+""; }
2.14.7 啟動類
@SpringBootApplication //@MapperScan("com.springboot2.dao")//多數據源下在數據源配置中配置DatasourceConfig1和DatasourceConfig2 public class StartApplication { public static void main(String[] args) { SpringApplication.run(StartApplication.class, args); } }
2.14.8 測試
1 Get請求:http://localhost:8080/insertEmployee?lastName=test2222
執行成功返回1
2 Post請求(且content-type為application/json類型)
http://localhost:8080/insertUser
請求參數:
{
"name":"test3",
"age":11
}
返回成功1
3 get請求(content-type類型隨意)
http://localhost:8080/insertUser2?name=ttdd&age=22
返回成功1
springboot學習入門簡易版九---springboot2.0整合多數據源mybatis mysql8+(22)