我正在根据用户选择要在结果中显示的字段动态创建查询。问题是,当要从数据库检索数据时,我通常使用
getXXX()
方法来检索适当的类型。但在这种情况下,我不知道合适的类型是什么,因为列是随机选择的。
有什么方法可以在不指定数据类型XXX的情况下获取字符串格式的数据吗?我正在使用 MySQL 和 Servlet。
您可以使用通用的 getObject 方法:
获取当前行指定列的值 ResultSet 对象作为 Java 编程语言中的对象。
此方法将以 Java 形式返回给定列的值 目的。 Java 对象的类型将是默认的 Java 对象 与列的 SQL 类型相对应的类型,遵循以下映射 JDBC 规范中指定的内置类型。如果该值为 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
。您甚至可以将 a_date
列作为 Java int
获取,并在我的机器上将其转换为 2013
。因此,绑定似乎是在驱动程序从服务器检索到非类型化字节流之后发生的。有时转换会失败,例如,如果您在 getInt()
列上尝试 TEXT
。ResultRetMetadata then
,使用其名为
getColumnTypeName(int indexOfCol)
的方法来获取其类型,然后使用if else将其与数据类型进行比较,并使用适当的方法getxxx()
。 import java.sql.Types;
// your code....
ResultSetMetaData rsmd = resultset.getMetaData();
int n = rsmd.getColumnCount();
for(int i = 1; i <=n; i++){
if(rsmd.getColumnTypeName(i) == Types.INTEGER){
System.out.println(resultset.getInt(i));
}
else if(rsmd.getColumnTypeName(i) == Types.VARCHAR){
System.out.println(resultset.getString(i));
}
// and so on ...
}
}
http://www.java2s.com/example/java-api/java/sql/types/other-0.html