MyBatisによるコード自動生成で、Javaの予約語を回避する方法

こんにちは。 エキサイト株式会社の三浦です。

JavaにはMyBatisというライブラリがあり、それを使うことでDBとの接続用コードを自動で生成することができます。 DBとのやり取りをするアプリケーションにとっては非常に便利な機能であり、使っている方も多いと思うのですが、この「自動」というところに落とし穴があります。

例えば、Javaでは予約語となっている package というカラム名が存在する時、どうすればよいのでしょうか?

今回は、テーブル内でJava予約語が使われている場合に、いかにそれを回避してMyBatisによる自動コード生成をうまく機能させるかを説明します。

MyBatisとは

MyBatisは、いわゆるORマッパーの一つで、これを使用することで簡単にアプリケーションをDBと接続できるようになります。 あらかじめ使用するテーブルを一通り揃えておき、かつMyBatisの設定ファイル( generatorConfig.xml )を用意することで、そのテーブル構成をもとに接続用のコードを自動生成してくれるので、エンジニアとしては生成されたコードを使って簡単にテーブル操作ができるようになるという代物です。

多くの場合は生成するだけですぐ使えるようになるのですが、テーブルのカラムにJava予約語package など)が使用されていると問題が発生します。

カラム名等に予約語が入っていた場合

あるテーブルに、 package というカラムが存在しているとしましょう。 その場合でも、コードの自動生成自体はエラーが発生することはなく、問題なく生成されます。

問題が起きるのは実際にコードを実行したときです。 packageJava予約語であり、あらかじめ指定された使い方しかできないのですが、自動生成コードでは package をプロパティ名等として使用するようになっているため、そこでエラーが起きてしまうのです。

では、どのようにこの問題を回避すればよいのでしょうか?

解決方法

MyBatisの設定ファイル( generatorConfig.xml )にはいろいろな設定項目があるのですが、その一つに columnRenamingRule というものがあります。 これは名前の通り、カラム名をリネームしたい時に、そのリネームするルールを定めるというものです。

例えば、 package というカラム名をコード内では packageCode として使用したい場合は、以下のように記述することで実現することができます。

...
<generatorConfiguration>
    <context ...>
            <table....>
                <columnRenamingRule searchString="^package$" replaceString="package_code" />
            </table>
    </context>
</generatorConfiguration>

searchString に変換したい文字列を、 replaceString にどのように変換したいかの文字列を入れることで、コード生成時に自動的に変換後の文字列で生成してくれます。

注意点として、

  1. searchString には正規表現を入れる必要があるので、例えばもし packageNamepackageCodeName にしたくないのであれば、始端・終端を定める必要がある
  2. replaceString について、スネークケースの文字列をコード生成時に自動でキャメルケースにするので、 package_codeにしないとコード上では packageCode になってくれない

があります。

終わりに

最初からJavaをアプリケーションとして使うことが前提であればカラム名等にJava予約語を使うことはあまりないと思いますが、もともと別の言語のアプリケーションで使っていたDBをJavaで使うようになったときは、このような状況は起こり得ると思います。 幸いにもMyBatisはその状況を考えてくれているので、ぜひ使っていきましょう。