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