SpringBoot学习八:SpringBoot多数据源整合

在实际开发中,大型项目不止一个数据库,基本上会做到配置与业务分离。配置在一个数据库,业务在另一个数据库。

因此就需要多数据源配置。

多数据源有两种方式实现:1、分包结构  2、注解方式

1、分包结构
com.sm.test001
dao,service
com.sm.test002
dao,service

分布式事务解决方案: jta+automatic传统项目中

2、注解方式:
public class UserService{
@datasouetest001
public void test001() {}
@datasouetest002
public void test002() {}

}

常用的则以分包方式为主


下面为分包结构的小Demo

pom.xml文件配置与上节整合mybatis配置一样

1、配置application.properties文件

spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/hi?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = sa

spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = sa
2、配置DataSource1Config和DataSource2Config,两者配置基本相同1的部分改为2,
package com.sm.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.autoconfigure.jdbc.DataSourceBuilder;
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.jdbc.datasource.DataSourceTransactionManager;

@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.sm.user1", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {
	
	@Bean(name = "test1DataSource")
	@Primary
	@ConfigurationProperties(prefix = "spring.datasource.test1")
	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"));
		return bean.getObject();
	}

	
	@Bean(name = "test1TransactionManager")
	@Primary
	public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "test1SqlSessionTemplate")
	public SqlSessionTemplate testSqlSessionTemplate(
			@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}


}
3、User.java实体类和Class实体类,User实体类见上节,Class实体类如下
package com.sm.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity(name="t_class")
public class Classes {
	
	@Id
	@GeneratedValue
	private Integer id;
	@Column
	private String className;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}

	
}

4.下面则分包操作,新建user1和user2,User1Mapper和User2Mapper

package com.sm.user1;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.springframework.context.annotation.Configuration;

@Configuration
public interface User1Mapper {
	@Insert("insert into t_user values(null,#{name});")
	public int insert(@Param("name") String name);

}
package com.sm.user2;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.context.annotation.Configuration;

import com.sm.entity.Classes;

@Configuration
public interface User2Mapper {
	@Select("select * from t_class where className=#{name};")
	public Classes getClass(@Param("name") String name);

}

5、新建UserService,分别访问user1的插入方法和user2的查询方法

package com.sm.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.sm.entity.Classes;
import com.sm.entity.User;
import com.sm.user1.User1Mapper;
import com.sm.user2.User2Mapper;

@Service
public class UserService {

	
	@Autowired
	private User1Mapper userMapper;
	
	@Autowired
	private User2Mapper user2Mapper;
	
	public void createUser(String name) {
		System.out.println("ssss");
		userMapper.insert(name);
		System.out.println("创建数据成功");
	}

	
	public Classes getUser(String name) {
		System.out.println("dddd");
		Classes classes = user2Mapper.getClass(name);
		System.out.println("查询成功");
		return classes;
	}
	
	
}

6、新建UserController,插入user1的数据和user2的查询

package com.sm.controller;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sm.entity.Classes;
import com.sm.entity.User;
import com.sm.service.UserService;

@RestController
public class UserController {

	@Resource
	private UserService userService;

	
	@RequestMapping("/createUser")
	public String createUser(String userName) {
		userService.createUser(userName);
		return "success";
		
	}
	
	@RequestMapping("/getUser")
	public String getUser(String name) {
		Classes classes = userService.getUser(name);
		System.out.println(classes.getClassName());
		return "success";
		
	}
	
}

这样,项目就搭建完成了。

启动。

先执行查询方法:


再执行查询方法

http://localhost:8080/getUser?name=08计算机



关于多数据源的事务管理,还正在研究中。。。

猜你喜欢

转载自blog.csdn.net/cuipeng1019/article/details/80302812