Java 高效地从H2数据库检索数据
在我当前的项目中,我使用一个H2数据库来存储来自JTable的数据,以精确地表示TableModel的数据 我已经编写了保存表中所有列的代码,现在我想再次从数据库中检索数据 到目前为止还不错,但我想不出任何好的方法从数据库中检索数据并对其进行润色,使其能够再次添加到我的表中。 我有一种方法可以让我的表添加一个新行,其中包含所有列的数据,这样就没有问题了,比如public void addRowObject dataForFirstCol,Object dataForSecondCol[…],但我需要逐行获取数据。使用H2/JavaSQL怎么可能做到这一点 我发现ResultSet对此很有帮助,但我仍然需要通过SQL逐行获取数据,而类似于从SOMEDATABASE中选择*之类的东西不会有多大帮助 我真的很感激一些帮助我开始,目前我 除了请求列A的所有数据外,别无选择,全部添加 将必要的行添加到表中,并为 那一列一行接一行。然后请求B列的数据,并添加 这是一行一行到B列的表格。在我看来,这通常是 这是一个可能的解决方案,但添加一个完整的行将更令人满意 而且最有可能的方式是在数千行中更有效 编辑:这是我用来创建和保存数据库的代码。不过,DROP查询只是出于测试目的Java 高效地从H2数据库检索数据,java,sql,database,swing,h2,Java,Sql,Database,Swing,H2,在我当前的项目中,我使用一个H2数据库来存储来自JTable的数据,以精确地表示TableModel的数据 我已经编写了保存表中所有列的代码,现在我想再次从数据库中检索数据 到目前为止还不错,但我想不出任何好的方法从数据库中检索数据并对其进行润色,使其能够再次添加到我的表中。 我有一种方法可以让我的表添加一个新行,其中包含所有列的数据,这样就没有问题了,比如public void addRowObject dataForFirstCol,Object dataForSecondCol[…],但我
/**
* Save tables content into H2 database
* @param filename of the database
* @param table to get the contents from
*/
public void save(File filename, JTable table) {
// prevent saving when user is editing a cell
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
try {
Class.forName("org.h2.Driver");
System.out.println(filename.toString());
Connection conn = DriverManager.getConnection("jdbc:h2:" + filename.toString(), "sa", "");
Statement state = conn.createStatement();
state.execute("DROP TABLE IF EXISTS TASKS");
state.execute("CREATE TABLE TASKS ("
+ "SeqNumber INT PRIMARY KEY,"
+ "FBNumber INT,"
+ "ReportNumber INT,"
+ "BetraNumber INT,"
+ "Date varchar(255),"
+ "StationName varchar(255),"
+ "Kilometrage varchar(255),"
+ "BlockTime varchar(255),"
+ "WorkTime INT,"
+ "Worker varchar(255),"
+ "Task varchar(255),"
+ "Comments varchar(255),"
+ "ClosedState BOOLEAN," + ")"
);
String sqlInsert = "INSERT INTO TASKS "
+ "(SeqNumber, "
+ "FBNumber, "
+ "ReportNumber, "
+ "BetraNumber, "
+ "Date, "
+ "StationName, "
+ "Kilometrage, "
+ "BlockTime, "
+ "WorkTime, "
+ "Worker, "
+ "Task, "
+ "Comments, "
+ "ClosedState) "
+ "VALUES"
+ "(?" // SeqNumber
+ ",?" // FBNumber
+ ",?" // ReportNumber
+ ",?" // BetraNumber
+ ",?" // Date
+ ",?" // StationName
+ ",?" // Kilometrage
+ ",?" // BlockTime
+ ",?" // WorkTime
+ ",?" // Worker
+ ",?" // Task
+ ",?" // Comments
+ ",?)"; // ClosedState
for (int rowIndex = 0; rowIndex < table.getModel().getRowCount(); rowIndex++) {
PreparedStatement sqlState = conn.prepareStatement(sqlInsert);
sqlState.setInt(COLUMN_SEQ_NUMBER, getSeqNumber(table, rowIndex));
sqlState.setInt(COLUMN_FB_NUMBER, getFBNumber(table, rowIndex));
sqlState.setInt(COLUMN_REPORT_NUMBER, getRepNumber(table, rowIndex));
sqlState.setInt(COLUMN_BETRA_NUMBER, getBetraNumber(table, rowIndex));
sqlState.setString(COLUMN_DATE, getDate(table, rowIndex));
sqlState.setString(COLUMN_STATION_NAME, getStationName(table, rowIndex));
sqlState.setString(COLUMN_KILOMETRAGE, getKilometrage(table, rowIndex));
sqlState.setString(COLUMN_BLOCK_TIME, getBlockTime(table, rowIndex));
sqlState.setInt(COLUMN_WORK_TIME, getWorkTime(table, rowIndex));
sqlState.setString(COLUMN_WORKER, getWorker(table, rowIndex));
sqlState.setString(COLUMN_TASK, getTask(table, rowIndex));
sqlState.setString(COLUMN_COMMENTS, getComments(table, rowIndex));
sqlState.setBoolean(COLUMN_CLOSED_STATE, getClosedState(table, rowIndex));
sqlState.executeUpdate();
}
// This is also just temporary code to see the contents
ResultSet dbContent = conn.createStatement().executeQuery("SELECT * FROM TASKS");
while(dbContent.next()) {
for (int i = 1; i+1 < DBDatabaseSystem.table.getColumnCount(); i++) {
System.out.println(dbContent.getString(i));
}
}
conn.close();
unsavedChanges = false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
DBDatabaseSystem.infoSystem.addError("Es gab ein SQL Problem beim Speichern der Datenbank");
}
}
您询问有关检索到Jtable的信息,并包括用于保存和简单打印的代码
以下是一些理论观点:
显示来自数据库的GUI数据可能意味着有很多行。GUI swing Jtable、SWT表、web等在开始时显示在100行以下。我认为你应该把这些行放在开头。
接口公共接口TableModel以检索惰性或
网络实现中存在动态或分页这样的词,不幸的是,我不知道官方支持/实现。谷歌展示了一些,我不知道它们是好是坏。
几乎所有的推进都必须从…中选择计数*。。。到
实现getRowCount;然后使用norportable sql子句获取数据,
在H2中阅读有关此语法的信息,选择*。。。限制偏移以获得具体行。这个问题我不太清楚,但你们可能知道这个想法?
编辑:第二部分是关于垂直维度这个问题对我来说很难,我不是以英语为母语的人。如果您考虑水平维度,通常我会将一行中的所有对象列从ResultSet行映射到Map为什么您说从SOMETABLE中选择*对您没有帮助?您的数据库表是如何设计的?Ohh犯了一个错误,从某个数据库中选择*当前,我的所有数据都存储在一个数据库中,其中包含一个表。web上可能有一些关于搜索结果集tablemodel的ResultSetTableModel源代码。如果您编辑了问题并添加了数据库表结构,将更有效率,JTable结构,您用来保存它的代码,等等。目前它都相当模糊。