ひがやすを技術ブログ

電通国際情報サービスのプログラマ

タイプセーフなデータベースプログラミング

最新版のSeasar2S2JDBC-Genによって、タイプセーフなデータベースプログラミングが可能になっています。それをHibernateと比較しながら見ていきましょう。
Hibernateの元ネタはこちら。
Hibernate 入門記 クリテリア


最初は単純なLikeを使う例。
Hibernateはこうなります。Expression.*をstaticインポートしています。


session.createCriteria(Model.class)
.add(like("name.firstName", "Yu%"))
.list();
これまでのS2JDBCだとこんな感じ。

jdbcManager.from(Model.class)
.where("name.firstName like ?", "Yu%")
.getResultList()
S2JDBCのタイプセーフな書き方だととこうなります。

select()
.where(starts(name().firstName(), "Yu"))
.getResultList()


今度は複数のORを使う例。
Hibernateはこうなります。


session.createCriteria(Model.class)
.add(disjunction()
.add(like("name.firstName", "Yu%"))
.add(eq("age", 18))
.add(isNull("magazine")))
.list();
これまでのS2JDBCだとこんな感じ。

jdbcManager.from(Model.class)
.where("name.firstName like ? or age = ? or magazine is null", "Yu%", 18)
.getResultList()
S2JDBCのタイプセーフな書き方だととこうなります。

select()
.where(or(starts(name().firstName(), "Yu"),
eq(age(), 18),
isNull(magazine())))
.getResultList()


今度は、order byを使う例。Order.*をstaticインポートしています。
Hibernateはこうなります。


session.createCriteria(Model.class)
.addOrder(asc("magazine"))
.addOrder(desc("age"))
.addOrder(asc("name.firstName"))
.addOrder(asc("name.lastName"))
.list();
これまでのS2JDBCだとこんな感じ。

jdbcManager.from(Model.class)
.orderBy("magazine, age desc, name.firstName, name.lastName")
.getResultList()
S2JDBCのタイプセーフな書き方だととこうなります。

select()
.orderBy(asc(magazine()),
desc(age()),
asc(name().firstName()),
asc(name().lastName()))
.getResultList()


一番読みやすい、あるいはSQLに近いのは、これまでのS2JDBCの書き方でしょう。そっちが好きな人はもちろんこのまま使い続けることができます。
ただ、where句やorder by句を文字列で指定しているため、データベースのリファクタリングなどがあったときに、変更箇所を見つけるのが難しくなります。


HibernateとタイプセーフなS2JDBCを比べると、構文は大体同じですが、Hibernateはプロパティ名を文字列で指定しているのに対し、S2JDBCはメソッドを呼び出すことでタイプセーフに設定しています。
Hibernateは、データベースのリファクタリングなどがあったときに、変更箇所を見つけるのが難しくなりますが、S2JDBCは一発でその変更箇所を見つけることができます。
また、S2JDBCは、プロパティ名の指定にIDEのコード補完を利用できます。また、タイプミスも事前に防ぐことができます。この生産性の向上は何気に大きいよ。


これまで、データベースのリファクタリングは、変更のコストがかかるので、あまり行われてきませんでした。あるいは、仕方なく行って多くの作業が発生していました。
S2JDBC-Genを使えば、エンティティクラスをリファクタリングすることで、その変更をデータベースにも反映させることができます。また、タイプセーフな流れるようなインターフェースを使うことで、変更箇所を直ぐ(コンパイラが教えてくれる)に見つけることができます。


ふがたわさんが S2JDBCで複雑なSQLもタイプセーフに流れるようなインターフェースで書いた方が良いと思う理由で、書かれているように、データベースの変更をローコストで安全に行えるようになるので、S2JDBCを使ったタイプセーフなデータベースのプログラミングを推奨します。
だって、ローコストで安全で生産性が高いもの。