在实际开发中,大型项目不止一个数据库,基本上会做到配置与业务分离。配置在一个数据库,业务在另一个数据库。
因此就需要多数据源配置。
多数据源有两种方式实现: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计算机
关于多数据源的事务管理,还正在研究中。。。