結果に表示するフィールドを選択したユーザーに基づいて動的にクエリを作成しています。問題は、データベースからデータを取得するときには、通常、適切なタイプを取得するためにgetXXX()
のメソッドを使用するということです。しかし、このケースでは、列がランダムに選択されるため、適切な型が何であるか分かりません。列の種類を知らなくても列の値を取得する方法
データ型XXXを指定せずに文字列形式でデータを取得できる方法はありますか?私はMySQLとサーブレットを使用しています。
結果に表示するフィールドを選択したユーザーに基づいて動的にクエリを作成しています。問題は、データベースからデータを取得するときには、通常、適切なタイプを取得するためにgetXXX()
のメソッドを使用するということです。しかし、このケースでは、列がランダムに選択されるため、適切な型が何であるか分かりません。列の種類を知らなくても列の値を取得する方法
データ型XXXを指定せずに文字列形式でデータを取得できる方法はありますか?私はMySQLとサーブレットを使用しています。
あなたがジェネリックgetObject方法を使用することができる。
は、Javaプログラミング言語のオブジェクトとして ResultSetオブジェクトの現在行にある指定された列の値を取得します。
このメソッドは、指定された列の値をJava オブジェクトとして返します。 Javaオブジェクトのタイプは、 のJDBC仕様で指定された組み込みタイプのマッピングに従って、カラムのSQLタイプに対応するデフォルトのJavaオブジェクト のタイプになります。値が SQL NULLの場合、ドライバはJava nullを返します。
私が知る限り、結果をJava Stringオブジェクトにしたい場合は、単にgetString()
を使用することができます。 MySQLのドライバは、getXXX()
で指定したJavaオブジェクトのバイトストリームをデシリアライズする必要があります。
DROP TABLE IF EXISTS thing;
CREATE TABLE thing (
a_int int,
a_string text,
a_date date
);
INSERT INTO thing (a_int, a_string, a_date)
VALUES ('1234', 'Hello world', CURRENT_DATE());
やコード:
public static void main(String[] args) throws Exception {
MysqlDataSource db = new MysqlDataSource();
db.setDatabaseName("test");
Connection conn = db.getConnection("test", "test");
ResultSet res = conn.prepareStatement("SELECT * FROM thing").executeQuery();
res.next();
System.out.println("Get a int as a string: " + res.getString("a_int"));
}
それは単にGet a int as a string: 1234
を印刷し、次のinitスクリプトを考えます。 a_date
列をJavaのint
として取得することもでき、それは私のマシン上で2013
に変換されます。したがって、バインドはの後にとなり、ドライバーはタイプされていないバイトのストリームをサーバーから取得したように見えます。場合によっては、列にgetInt()
を入力すると変換が失敗することがあります。
'getXXX()。toString()'は動作しません。 – deadlock
@deadlock - 'getXXX'はメソッドのクラス(getDate、getBytes、getFloatなど)の同義語です。それは本当の方法ではなく、OPは根本的な型が分からないときに特定のgetメソッドを使用する代わりの方法について質問しています。 – Perception
はい、私はxxxを事前に知っておくことができましたが...その努力を救いたいです。 – Vini