测试的工作很大一部分时间都会花费在造测试数据上,尤其对于分布式系统。这种系统一般都是很多小组维护各自的模块,作为下游系统,如果要验证一些业务流程,数据必须来自上游系统的真实数据,所以我们维护了一个帮助测试同事造数的平台,这其中就涉及到 “多数据源的配置”
mybatis工作原理
1. 创建SqlSessionFactoryBuilder对象,调用build(inputstream)方法读取并解析配置文件,返回SqlSessionFactory对象
2. 由SqlSessionFactory创建SqlSession 对象
3. 调用SqlSession中的api,传入Statement Id和参数,最后调用jdbc执行SQL语句,封装结果返回
实例
先配置两个库 teacher 、student
student.jdbc.url=jdbc:mysql://127.0.0.1:3306/student?serverTimezone=UTC&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNulljdbc.student.name=rootjdbc.student.password=root teacher.jdbc.url=jdbc:mysql://127.0.0.1:3306/teacher?serverTimezone=UTC&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNulljdbc.teacher.name=rootjdbc.teacher.password=root
这里以student的Mybatis配置为例,
这里需要注意多数据源的配置需要指定的 主数据源的,需要添加
@Primary,如果不配置主数据源,启动会报错
@Configuration@MapperScan(basePackages = {"com.zl.demo.mapper.student"}, sqlSessionFactoryRef = "studentSqlSessionFactory")public class StudentMybatisConfig { @Autowired private AppConfigBean appConfigBean; @Bean(name = "studentDataSource") DataSource mockDataSource() throws SQLException { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(appConfigBean.getStudentJdbcUrl()); dataSource.setDriverClassName(appConfigBean.getJdbcDriverClassName()); dataSource.setUsername(appConfigBean.getJdbcStudentName()); dataSource.setPassword(appConfigBean.getJdbcStudentPassword()); dataSource.setFilters("stat"); List initSqls = new ArrayList<>(); initSqls.add("set names utf8mb4"); dataSource.setConnectionInitSqls(initSqls); dataSource.setMaxActive(appConfigBean.getJdbcMaxActive()); dataSource.setInitialSize(appConfigBean.getJdbcInitialSize()); return dataSource; } @Bean(name = "studentSqlSessionFactory") @Primary public SqlSessionFactory studentSqlSessionFactory() throws SQLException { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(mockDataSource()); factoryBean.setTypeAliasesPackage("com.zl.deml.entity.student"); // 分页插件 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("reasonable", "false"); //properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "pageNum=start;count=countSql"); pageHelper.setProperties(properties); // 添加插件 factoryBean.setPlugins(new Interceptor[]{pageHelper}); // 添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { factoryBean .setMapperLocations(resolver.getResources("classpath*:/mybatis/student/*.xml")); return factoryBean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Bean(name = "studentTransactionManager") public DataSourceTransactionManager studentTransactionManager() { try { return new DataSourceTransactionManager(mockDataSource()); } catch (SQLException e) { throw new RuntimeException(e); } }}
其中有一段是对pageHelper 分页的配置,不需要的话可以删除
测试数据
多数据源整合测试数据
分页的测数据
实例代码已上传github
https://github.com/627886474/mybatis-multidata
如果对你有帮助的话
欢迎微信搜索:可乐的测试之路