Mybatis-SqlSessionFactory/多数据源

下面的代码演示了发送一个HTTP请求到Controller,如果key=“dev”,则查询dev数据库,否则查询默认的数据库

	@Resource
    private SqlSessionFactory sqlSessionFactory;
    
	@Resource
    private DataSource defaultDataSource;

	@Resource
    private XXXMapper xxxMapper;

    @PostMapping("test")
    public Object test(@RequestParam("key") String key) {
        if (key.equals("dev")) {
            HikariDataSource devDataSource= new HikariDataSource();
            devDataSource.setJdbcUrl("jdbc:mysql://123.456.789:3306/数据库名?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true");
            devDataSource.setUsername("帐号");
            devDataSource.setPassword("密码");
            Environment environment = new Environment.Builder("dev").dataSource(devDataSource).transactionFactory(new JdbcTransactionFactory()).build();
            sqlSessionFactory.getConfiguration().setEnvironment(environment);
        } else {
            Environment environment = new Environment.Builder("default").dataSource(defaultDataSource).transactionFactory(new JdbcTransactionFactory()).build();
            sqlSessionFactory.getConfiguration().setEnvironment(environment);
        }
        // 这里执行sql
		return xxxMapper.xxx方法();
    }

好了,文章到此结束,但是实际开发中,你需要对这段代码进行下面的优化
1.本文是全局修改数据源,如果是那种主从的系统(insert主库,select从库),则需要使用多个SqlSessionFactory
2.毕竟我是以硬编码的方式切换的数据源,每次切换,我都new了一个Environment ,实际开发中,一般都是通过ThreadLocal或者注解的方式,切换数据源

下面两个内容也是需要记住的:
1.Mybatis的SqlSessionFactory或者SqlSessionTemplate是一直持有DataSource引用的,所以直接修改这两个对象的DataSource即可
2.没必要写各种注解,各种@Bean的方式

如果想深入了解Spring对多数据源的支持,可查看AbstractRoutingDataSource,或许对你也有所启发

你可能感兴趣的:(Mybatis,mybatis)