SpringBoot+MyBatisでRDBMS毎にSQLを切り替える #mybatis

概要

RDBMS毎(例えばMySQLPostgreSQL)で同じ目的のSQLでも構文に違いがあったりする。

MyBatisでは VendorDatabaseIdProvider を使うと、接続先のDBによって発行するSQLを切り替えることができる。

SpringBootで利用する方法についてまとめる。

VendorDatabaseIdProvider をBean登録

適当なConfigurationクラス等に、 org.apache.ibatis.mapping.VendorDatabaseIdProvider をBean登録する。

@Configuration
public class MyBatisConfig {
    @Bean
    public VendorDatabaseIdProvider vendorDatabaseIdProvider() {
        VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        Properties vendorProperties = new Properties();
        vendorProperties.put("PostgreSQL", "postgresql");
        vendorProperties.put("MySQL", "mysql");
        vendorProperties.put("H2", "h2");
        databaseIdProvider.setProperties(vendorProperties);
        return databaseIdProvider;
    }
}

Mapper XMLにdatabaseIdを追加する

Mapper XMLで定義しているSQLに、RDBMSに応じたdatabaseIdを追加する。

SQLのIdは同一

  <select id="selectHoge" databaseId="mysql" ...>
    select name from hoge...
  </select>

  <select id="selectHoge" databaseId="postgresql" ...>
    select name from hoge...
  </select>

補足

アプリケーションで一部のSQLだけ方言吸収のために切り替えるにはよさそう。

ただ多くのSQLを切り替えるのであれば、管理が煩雑になってしまう気がする。

その場合は、いっそSpringのプロファイルから切り替えて、Mapper XMLから別で管理した方がいい気がする。
SQLの重複は覚悟の上で)

mybatis:
  mapper-locations: mybatis/postgresql/*.xml

あとはリポジトリレイヤがきちんと抽象化されていないと、SQLだけの吸収が辛くなるので設計大事だなと思う。

参考