yml配置数据源
这个直接把多个数据库连接信息写上即可,用spring.datasource属性进行配置,如下:
spring:
profiles: dev
datasource:
test1:
jdbc-url: jdbc:mysql://10.204.58.202:3306/uniorder_sit1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
username: uniorder
password: uniorder123.com
type: com.alibaba.druid.pool.DruidDataSource
test2:
jdbc-url: jdbc:mysql://10.204.53.175:3306/ishare?allowMultiQueries=true
username: pay
password: pay123.com
type: com.alibaba.druid.pool.DruidDataSource
注意spring boot 2.x之后要用 jdbc-url,不能用jdbc或者url。因为在2.x之后 spring boot把默认的JDBC连接池由 tomcat 换成了 HikariCP,后者只有jdbcUrl属性。
有兴趣的可以看看官方的说明,
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-a-datasource
type 是指定Resource所属的Java类名。
config配置类
比如说有两个数据源,我们最好是组织两个配置类,这样结构清晰一些。
test1的配置类,
@Configuration
@MapperScan(basePackages = "com.example.dao.test1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Test1DBConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource db1DataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/test1/**/*.xml"));
return bean.getObject();
}
@Bean
public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
解释一下,
@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法启动时被扫描来构建 bean 定义,初始化 spring 容器。相当于以前的 xml 配置 bean 的方式。
@MapperScan时 mybatis 的注解,用于告诉spring去扫描相关的package去发现相应的接口并利用mybatis对其做实现。这个注解可以加到配置类上,也可以加到spring boot 启动类上。这个package路径下放的就是mybatis生成的mapper接口类。
test2的配置类类似,这里不贴出来了。
mybatis接口和实现
mybatis的接口,实体定义,以及xml的sql实现,都可以用插件直接生成,这里就不详述了。
测试
我们可以写一个测试的controller来验证一下。
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
Test1DAO test1DAO;
@Autowired
Test2DAO test2DAO;
@GetMapping("/test1")
public String test1(){
User user = new User();
test1DAO.insert(user);
}
@GetMapping("/test2")
public String test2(){
User user = new User();
test2DAO.insert(user);
}
}
多数据源下的事务问题
多数据源下使用事务时,需要在注解上明确是哪个数据源,类似下面这样,否则会报找不到事务管理实例的错误。
@Transactional(value = "db1TransactionManager",rollbackFor = Exception.class)
@Override
public void run(Long startID, Long endID, boolean isCheck) {
...