- PR -

DBUtilsで値が落ちる

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/01/14
投稿数: 1
投稿日時: 2005-01-14 16:43
DBUtilsを使用してHSQLDBにアクセスすると、本来値が入っているはずのカラムなのに0が取得されます。
byte,short型に限ってこの現象が起きます。
マッピングは正しいようですし、ソースのバグとは思えません。
DBUtilsに詳しい方がいらっしゃいましたら、教えてくださいませんか。
環境は
OS:WindowsXP
DB:HSQLDB1.7.3
JAVA:j2sdk1.4.2_04
DBUtils:DBUtils1.0
です。
//////////////////////////////////////////
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.hsqldb.jdbcDriver;

public class DbutilsTest {

public static void execute() {
try {
Connection conn = null;
try {
DriverManager.registerDriver(new jdbcDriver());

conn =
DriverManager.getConnection(
"jdbc:hsqldb:hsql://localhost", "sa", "");
QueryRunner runner = new QueryRunner();

List accounts = (List)runner.query(
conn,
"select * from wk4",
new BeanListHandler(Wk4.class));
Wk4 temp;
for(int i=0; i<accounts.size(); ++i){
temp = (Wk4)accounts.get(i);
System.out.println(
temp.getData1() +"," +
temp.getData2() +"," +
temp.getData3() +"," +
temp.getData4() +"," +
temp.getData5()
);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(conn != null)
conn.close();
}
} catch(SQLException sqle) {
sqle.printStackTrace();
}
}

public static void main(String[] args) {
long start = System.currentTimeMillis();
execute();
long end = System.currentTimeMillis();
System.out.println("all "+(end - start) + " ms");
}
}

//////////////////////////////////////////
public class Wk4{
private boolean data1;
private byte data2;
private short data3;
private long data4;
private double data5;
public boolean getData1(){ return data1; }
public byte getData2(){ return data2; }//*
public short getData3(){ return data3; }//*
public long getData4(){ return data4; }
public double getData5(){ return data5; }
public void setData1(boolean data1){ this.data1 = data1; }
public void setData2(byte data2){ this.data2 = data2; }
public void setData3(short data3){ this.data3 = data3; }
public void setData4(long data4){ this.data4 = data4; }
public void setData5(double data5){ this.data5 = data5; }
}

//////////////////////////////////////////
create table wk4 (
data1 bit,
data2 TINYINT,
data3 SMALLINT,
data4 BIGINT,
data5 REAL);
//////////////////////////////////////////
//////////////////////////////////////////
//////////////////////////////////////////
//////////////////////////////////////////
この結果がdata2,data3カラムに限り、DB上はデータが入っているのに0になります。

よろしくお願いします。
pascal
常連さん
会議室デビュー日: 2004/04/29
投稿数: 29
お住まい・勤務地: 神奈川県
投稿日時: 2005-01-14 22:51
こんにちは。

直接のお役には立てそうになくて、申し訳ありませんが、少し気になることがあるので、書きます。

org.apache.commons.dbutils.handlers.BeanListHandlerのJavadocを読むと、
/* 引用
ResultSet を JavaBeans の List へ変換する ResultSetHandler の実装です。 このクラスはスレッドセーフです。
*/
とあります。
ここでいうJavaBeansとは、Wk4クラスのことだと思いますが、記されているコードを見ると、JavaBeansの要件を満たしていません。
JavaBeansは、setter,getterの規則以外に、
1.引数無しのコンストラクタの存在
2.java.io.Serializableのimplement
が条件だと思います。
関係ないのかもしれませんが、念のため。


それから、0が返ってくるというフィールドですが、そのフィールドのsetterが呼ばれてるのかどうか、調べてみたほうが良いのではないですか。

1

スキルアップ/キャリアアップ(JOB@IT)