JavaコードからSQLを追い出したい(Spring編)

Javaって複数行文字列が良い感じに書けないので、長いSQLを書こうとすると結構辛いです。 StringBuilderでくっ付けくっ付けしていくとか、どっかで定数定義しておくとか、プロパティファイルに追い出すとか・・・

今SpringBatchを使うお仕事があったので、良い感じにSQLを定義できないかなと考えてました。

目標は以下のような感じです。

  1. 長いSQLでも(できるだけ)見やすくしたい
  2. Javaコードに文字列として定義したくない
  3. SQLを識別するために分かり易い名前を付けたい

最初、SpringはXMLで色々定義してDIできるので、XML内でSQLを定義しておけばいいじゃないと考えました。

SpringのXMLでSQL定義1

このアプローチだと、(2)はまぁ実現できるのですが、使用するSQLの分だけStringのフィールドが定義されるとか、、、なんか、、、すごく、、、ダサいですね。

で、ぐーぐる先生に聞いてみた結果、XML内でMap<SQL識別名,SQL本文>みたいな感じのMapを定義しちゃう技を見つけたので、それを使うとこんな感じ。

How to keep SQL Queries outside java code using spring,

いいですね。このサイトだとApplicationContextから取ってますが、インジェクションするのもMap一つだけで済むし、キーは文字列なので好きな名前を付けられます。

でも・・・ただの文字列だとキー名が変わった時とか追加になったときに面倒なんですよね。 文字列検索するしかないので修正に漏れが出てしまう可能性だってあります。 そこで、EnumMapを使う方法を考えました。

gist7691047

こんな感じ。 XMLの定義とJavaコードで同じ識別名を参照するイメージです。

こうしておくと、識別名を変えたときでも

  1. Javaコード上はコンパイルエラーとなる
  2. SpringのXML上も赤くなる(IntelliJ使ってる場合。他は知らん・・・)

となって、実行した後文字列間違っててしょんぼり・・・とかいうしょぼい事態を回避できてハッピーになります。なれました。

以上です。