如何在 Flyway 的 JavaMigration 中使用 MyBatis 的 Mapper

57 阅读1分钟

阿里云推广

本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.

正文

前一段时间有一些批量操作数据库的复杂业务需要处理, 单靠 SQL 脚本来执行已经十分困难,于是考虑使用 JavaMigration 来操作数据库,以便实现复杂的业务需求,但直接操作 PreparedStatement 又十分繁琐,所以想用 MyBatis 的 Mapper 来操作数据库。

实践时发现没法直接向 JavaMigration 类中注入 MyBatis 的 Mapper 对象。为了避免直接注入 Mapper 对象导致循环依赖的问题,我们需要向 JavaMigration 中注入 SqlSessionFactory 工厂类对象,并开启一段新的 SQL 会话,从中获取需要的 Mapper 类:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ExampleMigration extends BaseJavaMigration {
    @Autowired
    private SqlSessionFactory sessionFactory;
     
    @Override
    public void migrate(Context context) throws Exception {
        try (SqlSession session = sessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            //...
        }
    } 
}

更多内容

推广

欢迎大家领取 阿里云优惠券, 新购续费更优惠, 详询 钉钉: 限量阿里云优惠券