项目中配置多数据源的情况我没有碰到过,今天尝试配置一下看看 springboot整合mybatis不赘述了,默认搭建好 项目结构一览:
application.yml中配置多个数据源
server:
port: 81
spring:
application:
name: project-dao
datasource:
db1:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.233.136:3306/mydata?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: root
password: 123456
db2:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.233.141:33306/today_top_news?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: root
password: 123456
db1/db2名字随意取,理论上也可以配置多个,不知道有没有上限
Dao接口
这个也没什么特别的,和单数据源的一样,不同的就是要有多个dao,放到不同的包下,mapper.xml也是一样,不多说了
@Repository
public interface BaiDuResultDao {
int insertSelective(BaiDuResult record);
int deleteByPrimaryKey(Long id);
int insert(BaiDuResult record);
List<BaiDuResult> findAll();
List<BaiDuResult> findAllPage(@Param("start") int start , @Param("pageSize")int pageSize);
BaiDuResult selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(BaiDuResult record);
int updateByPrimaryKey(BaiDuResult record);
}
配置多个数据源configuration
一个configuration对应一个数据源 数据源一:
@Configuration
@MapperScan(basePackages = "com.meng.dao.db1", sqlSessionFactoryRef = "factoryOne")
public class DataSourceOne {
@Bean(name = "db1")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource getDateSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "factoryOne")
@Primary
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("db1") DataSource datasource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:db1/*.xml"));
return bean.getObject();
}
}
数据源二:
@Configuration
@MapperScan(basePackages = "com.meng.dao.db2", sqlSessionFactoryRef = "factoryTwo")
public class DataSourceTwo {
@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource getDateSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "factoryTwo")
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("db2") DataSource datasource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:db2/*.xml"));
return bean.getObject();
}
}
测试类
配好了就很简单了,下面就是测试了
@SpringBootTest(classes = MultiDbApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo01 {
@Autowired
private BaiDuResultDao daoTo;
@Autowired
private BaiDuResultDao2 daoFrom;
@Test
public void test01(){
BaiDuResult baiDuResult = new BaiDuResult();
baiDuResult.setTitle("title");
baiDuResult.setContent("内容");
baiDuResult.setImgUrl("url");
daoTo.insert(baiDuResult);
}
@Test
public void test02(){
BaiDuResult baiDuResult = daoFrom.selectByPrimaryKey(2l);
System.out.println("baiDuResult = " + baiDuResult);
}
参考文章:SpringBoot+MyBatis配置多数据源
总结:这种方式配置的多数据源,实际上就是在数据源的配置类类中指定扫描的dao,然后不同的dao在执行CRUD操作时就直接操作对应的数据库,这样的缺点就是整个dao类下的所有方法(甚至是整个包下)都指向同一个数据源,那么如果同一个dao类中的不同方法,能不能分别操作不同的数据源呢?这个还有待研究
研究出来了: springboot+mybatis配置动态数据源
|