我浪费了几个小时试图找到解决方案,但我做不到。我上了3门课:
数据库、表和列:
public class Database {
private List<Table> table;
private String name; ...
public class Table {
private String name;
private List<Column> column; ...
public class Column {
private String columnName;
private String dataType;
private int data_length; ...
下面的查询给了我一个信息,我想用它来制作新的对象。
SELECT TABLE_NAME, COLUMN_NAAM, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS;
OUTPUT:
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH
------------------------------ ------------------------------ --------- -----------
DONATIE PROJECTID NUMBER 22
DONATIE KLANTID NUMBER 22
DONATIE DONATIEDATUM DATE 7
DONATIE BEDRAG NUMBER 22
DONATIE DONATIEID NUMBER 22
KLANT ROL VARCHAR2 10
KLANT WACHTWOORD VARCHAR2 30
KLANT GEBRUIKERSNAAM VARCHAR2 30
KLANT TELEFOONNUMMER NUMBER 22
KLANT EMAIL VARCHAR2 30
KLANT WOONPLAATS VARCHAR2 15
KLANT POSTCODE VARCHAR2 6
KLANT HUISNUMMER VARCHAR2 5
KLANT ADRES VARCHAR2 30
KLANT GESLACHT VARCHAR2 5
我使用以下代码来执行查询:
public Database getTargetDbStructure(String username, String password, String url, String dbName) {
Database db = new Database();
db.setName(dbName);
List<Table> tableStructureList = new ArrayList<Table>();
try (Connection con = super.getConnectionTargetDb(username, password, url)) {
String query = "SELECT DISTINCT(TABLE_NAME) FROM USER_TAB_COLUMNS";
PreparedStatement pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while (rs.next()){
String query2 = "SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = ?";
PreparedStatement pstmt2 = con.prepareStatement(query2);
String tableName = rs.getString("TABLE_NAME");
pstmt2.setString(1, tableName);
ResultSet rs2 = pstmt.executeQuery();
Table t = new Table();
t.setName(tableName);
System.out.println("1");
while (rs2.next()){
System.out.println("2");
String column_name = rs2.getString("COLUMN_NAAM");
String data_type = rs2.getString("DATA_TYPE");
int data_length = rs2.getInt("DATA_LENGTH");
Column column = new Column();
column.setColumnName(column_name);
column.setDataType(data_type);
column.setData_length(data_length);
t.addColumn(column);
}
db.addTable(t);
tableStructureList.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
}
return db;
}
正如你所看到的,java对我来说是新的,我正在努力学习。应该执行查询的代码不起作用。一定有更好的方法,而不是在结果集中运行结果集。我试图创建新的表对象,并将它们直接添加到表列表中,但问题是每个表对象只有一列。我想归档以下结构:
DATABASE
DONATIE
PROJECTID
KLANTID
DONATIEDATUM
BEDRAGDONATIEID
KLANT
ROL
WACHTWOORD
GEBRUIKERSNAAM
ETC..
TABLE3
ETC...
所以一个简单的数据库对象应该包含这些东西。有人能帮帮我吗。提前感谢
我不会像您自己观察到的那样同时打开两个ResultSet对象,我在这里看到了两个替代解决方案。
-
保留现有的两个查询,但完全循环第一个查询,将所有表添加到
tableStructureList
中,然后在完成第一个查询后,可以转到第二个查询,而是循环tableStructureList
以获得要使用的表。 -
第二种选择是将两个查询合并为一个查询,并在结果集上循环,将当前行的表名与前一行的表名称进行比较,如果不相同,则创建一个新的table对象,并将行中的列添加到该表中,然后继续此操作,直到表名称再次更改为止。为此,您需要修改第二个查询,使其在SELECT子句中包含
TABLE_NAME
,并在TABLE_NAME
上对其进行排序,使其成为SELECT TABLE_NAME, ...(same as before)... ORDER BY TABLE_NAME