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