【问题标题】:Vaadin : commit new Items to Database (SQLContainer)Vaadin:将新项目提交到数据库(SQLContainer)
【发布时间】:2012-01-19 14:06:40
【问题描述】:

我有一个显示图表的应用程序,其中填充了来自 SQL 表的数据。我正在寻找一种可能性,让用户“编辑”表格,以便他可以更改图表。今天我找到了我所需要的 Vaadin“SQLContainer”插件。我能够连接到数据库并获取我需要的表并将其连接到 Vaadin 表,这样我就可以在 Vaadin 中看到一个数据库表。我已经阅读了很多次 SQLContainer 的 Vaadin 教程(更新的 AdressBook 教程),但我仍然不知道如何通过 SQLContainer 将某些内容提交到数据库。这是我到目前为止所得到的:

public void displayTable(){ 
    try {
        connectionPool = new SimpleJDBCConnectionPool(
                "org.postgresql.Driver",
                "jdbc:postgresql://localhost:5432/database", "username", "password", 2, 5);
        FreeformQuery query = new FreeformQuery("select * FROM table", connectionPool);
        container = new SQLContainer(query);
        container.addListener(new QueryDelegate.RowIdChangeListener() {
            public void rowIdChange(RowIdChangeEvent event) {
                System.err.println("Old ID: " + event.getOldRowId());
                System.err.println("New ID: " + event.getNewRowId());
            }
        });
    } catch (SQLException e) {
          e.printStackTrace();
    }
    table= new Table("Table",container);
    table.setSelectable(true);
    table.addListener(this);
    window.addComponent(table);
    }

}

我正在使用 Vaadin 6.6.6 版并使用 PostgrSQL。

【问题讨论】:

  • 顺便说一下,您可能会对与当前版本 7 捆绑在一起的新 Vaadin Grid 小部件感兴趣。它包括一个内置的编辑窗格。见The Book of Vaadin

标签: java sql containers vaadin


【解决方案1】:

我看到您的查询只是“选择 * FROM 表”。如果是这种情况,您应该使用 TableQuery 而不是 FreeformQuery。对于直接从单个 SQL 表填充容器的情况,TableQuery 已经实现了所有读/写、排序、过滤等。

使用 TableQuery,您应该能够将 vaadin 表设置为可编辑模式 (setEditable) 并直接能够操作数据库中的值,通过调用 container.commit() 来存储它们,除非它处于 writeThrough 和 autoCommit 模式。或者您可以取表格的一行(一项)并在 Vaadin 表单中进行编辑。

如果您需要使用 FreeformQuery(对于更复杂的查询,例如 JOINing 两个或更多表),您需要自己实现写入支持,如另一个答案中所述。有关这方面的一个简单示例,请查看the implementation of the DemoFreeformQueryDelegate 以获取 SQLContainer 演示应用程序。

HTH

【讨论】:

  • 你是对的,我可以直接在表中编辑值并将它们提交给 DB。这仅在查询保持“简单”时才有效。例如,如果我有“从表中选择 column1 + column2”而不是“从表中选择 *”,我是否需要 FreeformQuery 作为该语句,或者我可以使用 TableQuery 吗?
  • @Kiesa 您仍然可以使用 TableQuery 并隐藏 UI 中的额外列(Table.setVisibleColumns)并使用 GeneratedColumn 连接列,但这当然会从数据库中加载所有列.当然,任何连接的列都需要单独存储/编辑。总结一下:如果你只需要处理一张SQL表的数据,你总是可以把解决方案移到Java代码上。在其他情况下,您必须使用 FreeformQuery。 HTH
【解决方案2】:

当谈到 SqlContainer 时,作者为您提供了以下信息

FreeformQuery 模式允许您指定任何复杂的查询并拥有 它的结果填充容器,但是你需要推动 支持写入、排序、过滤和延迟加载 实现 FreeformQueryDelegate 接口。

我自己没有使用过 SqlContainer,但这里有一个 samplesource code 。如果您按表格中的一行,您将获得保存/编辑数据的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多