1,有两个数据库都用个user表
2.配置文件有两个数据源
###datasource1
spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = root
###datasource2
spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = root
后面是固定的,前面可以自己定义的后面改的话会报错
通过不同的包来使用不同的数据源
创建两个数据源配置
package com.yanye.yanye.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.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
//DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.yanye.yanye.test1", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {
/**
*
* @methodDesc: 功能描述:(配置test1数据库)
*
*/
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
/**
*
* @methodDesc: 功能描述:(test1 sql会话工厂)
*
*/
@Bean(name = "test1SqlSessionFactory")
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();
}
/**
*
* @methodDesc: 功能描述:(test1 事物管理)
*
*/
@Bean(name = "test1TransactionManager")
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);
}
}
和test2
调用不同的方法插入到不同的数据库中
package com.yanye.yanye.controller;
import com.yanye.yanye.test1.service.UserService1;
import com.yanye.yanye.test1.service.impl.UserService1Impl;
import com.yanye.yanye.test2.service.impl.UserService2Impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MybatiesMultiDataSourceController {
@Autowired
private UserService2Impl userService2;
@Autowired
private UserService1 userService1;
@RequestMapping("/save1")
public int save1(@RequestParam("name") String name,@RequestParam("age") Integer age){
return userService1.save(name, age);
}
@RequestMapping("/save2")
public int save2(@RequestParam("name") String name,@RequestParam("age") Integer age){
return userService2.save(name, age);
}
}
当时做的时候两个service接口都有一个save方法,但是我扫包范围是到test的地方,导致执行方法报错
后来发现mapper的方法越是save导致报错service1报错,service2不报错
或者吧scan的扫包范围指定到mapper就不会报错了
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
不同的数据源在一个其中一个事务,。这个事务是没办法管理其他数据源的,故,在方法里报异常,userservice2是不会回滚的,userservice1会回滚的