测试的工作很大一部分时间都会花费在造测试数据上,尤其对于分布式系统。这种系统一般都是很多小组维护各自的模块,作为下游系统,如果要验证一些业务流程,数据必须来自上游系统的真实数据,所以我们维护了一个帮助测试同事造数的平台,这其中就涉及到 “多数据源的配置”
mybatis工作原理
- 创建SqlSessionFactoryBuilder对象,调用build(inputstream)方法读取并解析配置文件,返回SqlSessionFactory对象
- 由SqlSessionFactory创建SqlSession 对象
- 调用SqlSession中的api,传入Statement Id和参数,最后调用jdbc执行SQL语句,封装结果返回
实例
先配置两个库 teacher 、student
student.jdbc.url=jdbc:mysql://127.0.0.1:3306/student?serverTimezone=UTC&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
jdbc.student.name=root
jdbc.student.password=root
teacher.jdbc.url=jdbc:mysql://127.0.0.1:3306/teacher?serverTimezone=UTC&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
jdbc.teacher.name=root
jdbc.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<String> 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 分页的配置,不需要的话可以删除。
测试数据
多数据源整合测试数据
{
"teacher":[
{
"id":1,
"name":"老师1",
"sex":"男",
"age":30
},
{
"id":2,
"name":"老师2",
"sex":"女",
"age":28
},
{
"id":3,
"name":"老师3",
"sex":"女",
"age":25
}
],
"students":[
{
"id":1,
"name":"学生1",
"sex":"女",
"age":18
},
{
"id":2,
"name":"学生2",
"sex":"女",
"age":19
},
{
"id":3,
"name":"学生3",
"sex":"男",
"age":20
},
{
"id":4,
"name":"学生4",
"sex":"男",
"age":21
}
]
}
分页的测数据
[
{
"students":{
"id":3,
"name":"学生3",
"sex":"男",
"age":20
}
},
{
"students":{
"id":3,
"name":"学生3",
"sex":"男",
"age":20
}
},
{
"students":{
"id":3,
"name":"学生3",
"sex":"男",
"age":20
}
}
]
实例代码已上传github
https://github.com/627886474/mybatis-multidata
如果对你有帮助的话
欢迎微信搜索:可乐的测试之路