jdbc—如何使用java从数据库检索所有表

fv2wmkja  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(501)

我使用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();

任何人都可以给我一些建议。

voj3qocg

voj3qocg1#

你可以用 ResultSet.getObject(int) . getObject 将自动检索列的sql数据类型的最合适java类型中的数据。
要检索列数,可以使用 ResultSet.getMetaData() ,然后使用 ResultSetMetaData.getColumnCount() 检索列数。
简而言之,要打印所有行的所有列,可以执行以下操作:

try (ResultSet rs = stmt.executeQuery(qu)) {
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    while (rs.next()) {
        StringBuilder tableData = new StringBuilder();
        for (int colIdx = 1; colIdx <= columnCount; colIdx++) {
            tableData.append(rs.getObject(colIdx));
            if (colIdx != columnCount) {
                tableData.append(':');
            }
        }
        System.out.println(TableData);
    }
}

你也可以使用 ResultSetMetaData 获取有关结果集列的更多信息,例如,如果需要对某些类型的列进行特定处理。你可以用 getColumnType 得到 java.sql.Types 列的值,或 getColumnTypeName 获取数据库中的类型名称,或 getColumnClassName 获取由返回的类的名称 ResultSet.getObject(int/String)
然而,正如sorin在评论中指出的那样,接受用户输入并将其连接到查询字符串中(就像您当前所做的那样),会使您容易受到sql注入的攻击。不幸的是,不可能参数化对象名称,但您可以通过1)对照数据库元数据检查表(例如。 DatabaseMetaData.getTables ),及2)使用 Statement.enquoteIdentifier (尽管这不一定能保护你免受所有形式的注射)。

相关问题