こんにちは。 エキサイト株式会社の三浦です。
JavaにはMyBatisというライブラリがあり、それを使うことでDBとの接続用コードを自動で生成することができます。 DBとのやり取りをするアプリケーションにとっては非常に便利な機能であり、使っている方も多いと思うのですが、この「自動」というところに落とし穴があります。
例えば、Javaでは予約語となっている package というカラム名が存在する時、どうすればよいのでしょうか?
今回は、テーブル内でJavaの予約語が使われている場合に、いかにそれを回避してMyBatisによる自動コード生成をうまく機能させるかを説明します。
MyBatisとは
MyBatisは、いわゆるORマッパーの一つで、これを使用することで簡単にアプリケーションをDBと接続できるようになります。
あらかじめ使用するテーブルを一通り揃えておき、かつMyBatisの設定ファイル( generatorConfig.xml )を用意することで、そのテーブル構成をもとに接続用のコードを自動生成してくれるので、エンジニアとしては生成されたコードを使って簡単にテーブル操作ができるようになるという代物です。
多くの場合は生成するだけですぐ使えるようになるのですが、テーブルのカラムにJavaの予約語( package など)が使用されていると問題が発生します。
カラム名等に予約語が入っていた場合
あるテーブルに、 package というカラムが存在しているとしましょう。
その場合でも、コードの自動生成自体はエラーが発生することはなく、問題なく生成されます。
問題が起きるのは実際にコードを実行したときです。
package はJavaの予約語であり、あらかじめ指定された使い方しかできないのですが、自動生成コードでは package をプロパティ名等として使用するようになっているため、そこでエラーが起きてしまうのです。
では、どのようにこの問題を回避すればよいのでしょうか?
解決方法
MyBatisの設定ファイル( generatorConfig.xml )にはいろいろな設定項目があるのですが、その一つに columnRenamingRule というものがあります。
これは名前の通り、カラム名をリネームしたい時に、そのリネームするルールを定めるというものです。
例えば、 package というカラム名をコード内では packageCode として使用したい場合は、以下のように記述することで実現することができます。
... <generatorConfiguration> <context ...> <table....> <columnRenamingRule searchString="^package$" replaceString="package_code" /> </table> </context> </generatorConfiguration>
searchString に変換したい文字列を、 replaceString にどのように変換したいかの文字列を入れることで、コード生成時に自動的に変換後の文字列で生成してくれます。
注意点として、
searchStringには正規表現を入れる必要があるので、例えばもしpackageNameをpackageCodeNameにしたくないのであれば、始端・終端を定める必要があるreplaceStringについて、スネークケースの文字列をコード生成時に自動でキャメルケースにするので、package_codeにしないとコード上ではpackageCodeになってくれない
があります。
終わりに
最初からJavaをアプリケーションとして使うことが前提であればカラム名等にJavaの予約語を使うことはあまりないと思いますが、もともと別の言語のアプリケーションで使っていたDBをJavaで使うようになったときは、このような状況は起こり得ると思います。 幸いにもMyBatisはその状況を考えてくれているので、ぜひ使っていきましょう。