Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

DAO Support and JDBC Framework その2

Chapter 5。
・JdbcTemplateの便利メソッド

  • int queryForInt(String sql)
  • int queryForInt(String sql, Object[] args)
  • long queryForLong(Stirng sql)
  • int queryForLong(String sql, Object[] args)
  • Object queryForObject(String sql, Class requiredType)
  • Object queryForObject(String sql, Class requiredType, Object[] args)
  • List queryForList(String sql)
  • List queryForList(String sql, Object[] args)


Objectのやつは型が違うとTypeMismatchDataAccessExceptionをスロー。
ListのやつはDBのカラム名と値のMapをListにしてる。


・JdbcTemplateを使った基本的な問い合わせ
・JdbcTemplateを使った基本的な更新
・JdbcTemplateの進んだ使い方
んー、このままでは使いにくいから使わなさそう・・・。


RowSetのサポート
JDBC2.0のRowSetサポートしてます。


RDBMSオペレーションクラス
Springのサンプルもこれ使ってるし、JDBC抽象フレームワークではこれを使うのが
標準的なのかな?

  • MappingSqlQueryクラス(select文)
  • SqlUpdateクラス(insert文、update文、delete文)

両方ともこんな感じ。(適当です)

class SampleQuery extends MappingSqlQuery {
  private static String SQL = "select ID, NAME from SAMPLE where ID = ?";

  public SampleQuery(DataSource ds){
    super(ds, SQL);
    declareParameter(new SqlParameter("ID", Types.INTEGER));
    compile();
  }

  @Override
  protected Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    Sample sample = new Sample();
    sample.setId(rs.getInt("id"));
    sample.setName(rs.getString("name"));
    return sample;
  }
}

コンストラクタでデータソースもらっといて、
それとSQLスーパークラスのコンストラクタに渡す。
値の型を宣言する。カラムIDがINTEGERとするとこの書き方。
でcompile()を呼び出す。


実行はsampleQuery.execute()。
で、MappingSqlQueryの場合はクエリの実行後に
抽象メソッドmapRow()が呼び出されるので、
今回はResultSetからEntityオブジェクトに値を移しておく。
SqlQueryの場合はなし。