S2JDBC/SQLを使ってクエリを投げる

S2JDBC/SQLを使ってクエリを投げる

S2JDBCでは文字列のSQLをクエリとして投げるやりかたもある。

このやり方はJavaコードでSQLを全部構築できるので、

  • 検索条件を自由に埋め込みやすい
  • 状況によってSQLの形が大きく変化するようなクエリを作りやすい
  • 初学者にとってSQLが普通のJavaで制御されているだけなので読みやすい

ということがある。

・・・が・・・このような場合は大体設計に無理があるので、変な制約がない限りは使わないほうが無難だ。

使い方

List<Hoge> results = jdbcManager.selectBySql(Hoge.class, 
    "SELECT " +
    "    * " +
    "FROM " +
    "    hoge " +
    "WHERE " +
    "    piyo_id = ? AND " +
    "    fuga_id = ?", 
    10, 20)
    .getResultList();

のように使う。第一引数に戻す型のクラスをとり、第二引数にSQL、第三引数以降にプレースホルダに入れるパラメータを埋め込む順番に記述する。

SQLは全部文字列なので当然なにも考えず

List<Hoge> results = jdbcManager.selectBySql(Hoge.class, 
    "SELECT " +
    "    * " +
    "FROM " +
    "    hoge " +
    "WHERE " +
    "    piyo_id = 10 AND " +
    "    fuga_id = 20")
    .getResultList();

のような記述でもできる。しかし10と20の部分が外部からの変数になった時にSQLインジェクションの危険性を避けられないのでプレーすホルダを使ったほうが無難。

クエリの結果はカラム名とプロパティを一致させておくと勝手にマッピングしてくれる。 DB側(スネーク)→Java側(キャメル)というように自動マッピングされる。 DB側の結果のpiyo_idカラムの値はJava側のHogeDtoクラスのpiyoIdプロパティに自動的に格納されるということだ

memo

結果を受け用のクラスを作らずに BeanMap でお手軽に受けることもできる。BeanMap というのは Apache 系のパッケージにも存在するが、この場合は Seasar2 系のパッケージの BeanMap を使わないと値がマッピングされない。 単に Map に詰め込まれるのでは無いみたいだ。

タグ

s2/s2jdbc/use_2waysql.txt · 最終更新: 2017-09-26 19:17 by ore