Java Vaadin:将新项目提交到数据库(SQLContainer)

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

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

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。

关于SqlContainer,作者向您提供了以下信息

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


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

当涉及到SqlContainer时,作者向您提供以下信息

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


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

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

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

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


HTH

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

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

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


HTH

没错,我可以直接编辑表中的值并将它们提交给DB。这仅在查询保持“简单”时有效。e、 g如果我使用“从表中选择列1+列2”而不是“从表中选择*我会需要该语句的FreeformQuery还是我可以使用TableQuery?@Kiesa您仍然可以使用TableQuery并隐藏UI中的额外列(table.setVisibleColumns)并使用GeneratedColumn连接列,但这当然会,从数据库中加载所有列。当然,任何连接的列都需要单独存储/编辑。总而言之:如果您只需要处理一个SQL表中的数据,那么您可以将解决方案移动到Java代码中。在其他情况下,必须使用FreeformQuery。您说得对,我可以直接编辑表中的值并将它们提交给DB。这仅在查询保持“简单”时有效。e、 g如果我使用“从表中选择列1+列2”而不是“从表中选择*我会需要该语句的FreeformQuery还是我可以使用TableQuery?@Kiesa您仍然可以使用TableQuery并隐藏UI中的额外列(table.setVisibleColumns)并使用GeneratedColumn连接列,但这当然会,从数据库中加载所有列。当然,任何连接的列都需要单独存储/编辑。总而言之:如果您只需要处理一个SQL表中的数据,那么您可以将解决方案移动到Java代码中。在其他情况下,必须使用FreeformQuery。顺便说一句,您可能会对与当前版本7捆绑在一起的新Vaadin小部件感兴趣。它包括一个内置的编辑窗格。顺便说一句,您可能会对与当前版本7捆绑在一起的新Vaadin小部件感兴趣。它包括一个内置的编辑窗格。看见