こんにちは。 エキサイト株式会社の三浦です。
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はその状況を考えてくれているので、ぜひ使っていきましょう。