Spring Framework 入門記 JDBCその8 SqlFunction他

職場に行っていないので,StoredProcedure後編ではなくて,JDBC編の残りをさらっと片づけてしまいたいと思います.StoredProcedureOracleでの検証は「その7」に追記するということで.
ということで,まずは

  • SqlFunction

です.といってもこれ,全然たいしたものではなく,MappingSqlQueryの派生クラスで,結果セットが1行だけ返す問い合わせをお手軽に扱うためのクラスに過ぎません.なので,例によって

    • dataSource
    • sql
    • types

というプロパティを設定して問い合わせを実行します.
特に select count(*) from・・・ を意識しているようで,結果をintで受け取る

    • int run()
    • int run(int)
    • int run(Object[])

といったメソッドが用意されています.
それから,結果をObjectで受け取るための

    • Object runGeneric()
    • Object runGenerid(int)
    • Object runGeneric(Object[])

も用意されています.
これはこんなところですかね.
これで一応,「9.4. Modeling JDBC operations as Java objects」はお終いです.やったね!


あと「Chapter 9. Data Access using JDBC」に出てくるけど,これまですっ飛ばしてきたものを軽〜く眺めてみると...

  • SQLExceptionTranslater

このinterfaceは,SQLExceptionをSpringのuncheckedで階層化された例外(DataAccessException)に変換するものです.主要なRDBMSはSpringがサポートしてくれているのですが,それ以外のマイナーなRDBMSを使う場合には,このinterfaceimplementsしたclassを用意するみたい.実際には,

  • SQLErrorCodeSQLException

というclassが用意されているので,それをextendsすればいいようです.
そしてそれを org/springframework/jdbc/support/sql-error-codes.xml 記述してあげればよさげ.頑張って>id:ukki4903さん(^^;


それから,DataSourceextedsしたinterfaceである

  • SmartDataSource

と,それをimplementsしたclassがいくつかあったみたい.

  • DriverManagerDataSource
  • SingleConnectionDataSource

SmartDataSourceってどんなに賢いんだろう? ってドキドキしちゃいますが,実のところ

    • boolean shouldClose(Connection)

というメソッドが用意されているだけです.何がしたいの?
どうやらですね,前述のDataSourceの実装はConnectionのプロキシではなく,DriverManagerが生成したConnectionをそのまま返すのですね.それで,DriverManagerDataSourceの方は,getConnection()の度に新しいConnectionを返すので,それのclose()を呼び出さなきゃいけないけど,SingleConnectionDataSourceの方は何度getConnection()を呼び出されても単一のConnectionを返すので,close()を呼び出されては困る,そこでshouldClose()が必要という事みたい... スマート?
うーみゅ,これ以上追求するのは止めておこう.


これで9章は終わりかなぁ.ちょっと時間をかけすぎたくらいだと思うので,もういいでしょう.
ということで,本来なら次は「Chapter 10. Data Access using O/R Mappers」なのですが,内容はほとんどHibernateと組み合わせて使う場合の話です.一応JDOとiBATISも見出しだけはあるのですが,中身は「ToDo」だけだったり.(^^;
しかしながら私,Hibernateを触ったことがありません.それで10章に進むのはどうよ? というわけで,「Spring Framework 入門記」は当分お休みにして,以前からひがさん他にリクエストされていた「Hibernate入門記」を近々始めたいと思います.来週からかなぁ?