[英]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.