我使用jdbc和postgresql作为数据库,我试图创建一个逻辑,这样我们就可以从一个表中获取所有数据,不管用户在输入中给出什么表名,它都应该被获取,但这里的问题是,我不知道怎么做。
每当我们使用resultset从数据库获取表数据时,我们都需要指定在每个索引上获取的数据类型。
如何克服提供这种元数据的硬编码需求,并使我们的代码对于任何列数和任何类型的表都更加通用
我的代码:
Statement sttm = con1.createStatement();
System.out.println("Enter table name (usertable)");
String name = sc.next();
String tableData="";
String qu = "select * from "+name;
ResultSet rs =sttm.executeQuery(qu);
while(rs.next()) {
// here we need to define the type by writing .getInt or getString
tableData = rs.getInt(1)+":"+rs.getString(2)+":"+rs.getInt(3);
System.out.println(tableData);
}
System.out.println("*********---------***********-----------**********");
sttm.close();
任何人都可以给我一些建议。
1条答案
按热度按时间voj3qocg1#
你可以用
ResultSet.getObject(int)
.getObject
将自动检索列的sql数据类型的最合适java类型中的数据。要检索列数,可以使用
ResultSet.getMetaData()
,然后使用ResultSetMetaData.getColumnCount()
检索列数。简而言之,要打印所有行的所有列,可以执行以下操作:
你也可以使用
ResultSetMetaData
获取有关结果集列的更多信息,例如,如果需要对某些类型的列进行特定处理。你可以用getColumnType
得到java.sql.Types
列的值,或getColumnTypeName
获取数据库中的类型名称,或getColumnClassName
获取由返回的类的名称ResultSet.getObject(int/String)
等然而,正如sorin在评论中指出的那样,接受用户输入并将其连接到查询字符串中(就像您当前所做的那样),会使您容易受到sql注入的攻击。不幸的是,不可能参数化对象名称,但您可以通过1)对照数据库元数据检查表(例如。
DatabaseMetaData.getTables
),及2)使用Statement.enquoteIdentifier
(尽管这不一定能保护你免受所有形式的注射)。