2012/05/30

DbUtilsのサンプル

Apache CommonsのDbUtilsを使用してデータの取得、更新を行うサンプル。

//JdbcTest.java
package pkg.sample;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Iterator;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.log4j.*;
import org.apache.log4j.xml.*;
  
public class JdbcTest {
  static Logger logger = Logger.getLogger(JdbcTest.class);
  
  Connection con = null;
  QueryRunner qr = new QueryRunner();
  
  public void exec(){
    try{
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      try{
        //DB接続
        con = DriverManager.getConnection("jdbc:sqlserver://localhost;database=ASN;integratedSecurity=true;");
        //オートコミットを無効に
        con.setAutoCommit(false);
        logger.info("connect.");
        
        //BeanListHandlerサンプル
        System.out.println("---登録データ---");
        select();
        
        //INSERTサンプル
        insert();
        
        //UPDATEサンプル
        update();
        
        //更新結果確認
        System.out.println("---更新結果---");
        select();
        
        //commit
        DbUtils.commitAndCloseQuietly(con);
        logger.info("commit.");
        
      }catch(SQLException se){
        DbUtils.rollbackAndCloseQuietly(con);
        logger.info("rollback.");
        se.printStackTrace();
        logger.error(se.getMessage());
      }

    }catch(ClassNotFoundException e){
      e.printStackTrace();
      logger.error(e.getMessage());
    }finally{
      //Close処理
      DbUtils.closeQuietly(con);
    }
  }
  
  /**
   * BeanListHandlerのサンプルコード
   * @throws SQLException
   */
  private void select() throws SQLException{
    String query = "SELECT * FROM SampleTable";
    
    ResultSetHandler rsh = new BeanListHandler(PersonInfo.class);
    List list = (List) qr.query(con, query, rsh);
    
    Iterator items = list.iterator();
    while(items.hasNext()){
      PersonInfo p = (PersonInfo) items.next();
      
      System.out.println(p.getName());
      System.out.println(p.getBirth());
      System.out.println(p.getRegist());
    }
  }
  
  /**
   * QueryRunner.updateのテスト (1)
   * @throws SQLException
   */
  private void insert() throws SQLException{
    //三つ目のパラメータを SYSDATETIME() に置き換えると例外が出る。 "Wrong number of parameters" ???
    String query = "INSERT INTO SampleTable (name, birth, regist) VALUES (?, ?, ?)";
    
    qr.update(con, query, new Object[]{ "サトウ", "1980-01-01", getCurrentDatetime() });
    qr.update(con, query, new Object[]{ "タナカ", null, getCurrentDatetime() });
  }
  
  /**
   * SYSDATETIME()の代わり。 現在日時(ミリ秒単位)の文字列表現を取得
   * @return yyyy-MM-dd HH:mm:ss.SSS
   */
  private String getCurrentDatetime(){
    java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    return df.format(new java.util.Date());
  }
  
  /**
   * QueryRunner.updateのテスト (2)
   * @throws SQLException
   */
  private void update() throws SQLException {
    String query = "UPDATE SampleTable SET birth = ?, regist = SYSDATETIME() WHERE name = ?";
    
    qr.update(con, query, new Object[]{ "2000-12-31", "タナカ" });
  }
  
  /**
   * @param args
   */
  public static void main(String[] args) {
    //log4j設定ファイル読み込み
    DOMConfigurator.configure("logging.xml");

    JdbcTest j = new JdbcTest();
    j.exec();
  }
}

データベースから取得した値を格納するクラス。
BeanListHandlerを使用してQueryRunner.queryメソッドを実行すると結果がセットされて返される。

当然、Beanクラスのプロパティ名を取得対象テーブルのフィールド名と合わせる事。
取得対象テーブルのフィールド名とプロパティ名が一致しない場合は無視されるだけなので、Beanクラス側に追加のプロパティがあってもよい。

// Beanクラス(PersonInfo.java)
package pkg.sample;

public class PersonInfo {
  private String name;
  private String birth;
  private String regist;
  /**
   * @return the birth
   */
  public String getBirth() {
    return birth;
  }
  /**
   * @param birth the birth to set
   */
  public void setBirth(String birth) {
    this.birth = birth;
  }
  /**
   * @return the name
   */
  public String getName() {
    return name;
  }
  /**
   * @param name the name to set
   */
  public void setName(String name) {
    this.name = name;
  }
  /**
   * @return the regist
   */
  public String getRegist() {
    return regist;
  }
  /**
   * @param regist the regist to set
   */
  public void setRegist(String regist) {
    this.regist = regist;
  }
}

0 件のコメント:

コメントを投稿