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 件のコメント:
コメントを投稿