SpringBoot+MyBatisでRDBMS毎にSQLを切り替える #mybatis
概要
RDBMS毎(例えばMySQLとPostgreSQL)で同じ目的の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だけの吸収が辛くなるので設計大事だなと思う。