用java从查询结果创建类对象



我浪费了几个小时试图找到解决方案,但我做不到。我上了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对象,我在这里看到了两个替代解决方案。

  1. 保留现有的两个查询,但完全循环第一个查询,将所有表添加到tableStructureList中,然后在完成第一个查询后,可以转到第二个查询,而是循环tableStructureList以获得要使用的表。

  2. 第二种选择是将两个查询合并为一个查询,并在结果集上循环,将当前行的表名与前一行的表名称进行比较,如果不相同,则创建一个新的table对象,并将行中的列添加到该表中,然后继续此操作,直到表名称再次更改为止。为此,您需要修改第二个查询,使其在SELECT子句中包含TABLE_NAME,并在TABLE_NAME上对其进行排序,使其成为SELECT TABLE_NAME, ...(same as before)... ORDER BY TABLE_NAME

最新更新