[英]How to retrieve all the tables from database using Java
我正在使用 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();
任何人都请建议我一些方法来做到这一点。
如果您想打印数据库中任何表格的数据,请通过 CRUD 检查我的 github 项目 java MySQL
https://github.com/gptshubham595/jdbc_mysql_CRUD-JAVA-
这些是实现的
您可以使用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
(尽管这不一定会保护你反对所有形式的注射)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.