springboot+mybatis多数据源配置(附源码,page helper分页配置)

测试的工作很大一部分时间都会花费在造测试数据上,尤其对于分布式系统。这种系统一般都是很多小组维护各自的模块,作为下游系统,如果要验证一些业务流程,数据必须来自上游系统的真实数据,所以我们维护了一个帮助测试同事造数的平台,这其中就涉及到 “多数据源的配置”

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=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

如果对你有帮助的话
欢迎微信搜索:可乐的测试之路
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值