2012-01-19 34 views
1

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

+0

顺便说一句,你可能会在新的Vaadin [网]与7版本当前版本捆绑(https://vaadin.com/grid)部件有趣它包括一个内置的编辑窗格。参见[Vaadin之书](https://vaadin.com/book/vaadin7/-/page/components.grid.html)。 –

回答

3

我看到您的查询仅仅是“SELECT * FROM表”。如果是这种情况,您应该使用TableQuery而不是FreeformQuery。对于您直接从单个SQL表填充容器的情况,TableQuery已经具有所有读取/写入,排序,过滤等功能。

使用TableQuery,您应该能够在可编辑模式(setEditable)中设置vaadin表,并且直接能够操纵数据库中的值,通过调用container.commit()来存储它们,除非它被放入writeThrough和autoCommit模式。或者你可以把表格中的一行(一个项目)并用Vaadin表格编辑。

如果你需要使用FreeformQuery(对于更复杂的查询,例如连接两个或多个表),你需要实现写养活自己,在另一个答案已经提到。有关此的一个简单示例,请查看the implementation of the DemoFreeformQueryDelegate以获取SQLContainer演示应用程序。

HTH

+0

你是对的,我可以直接在表格中编辑值并将它们提交给数据库。这只能在查询保持“简单”的情况下运行。例如,如果我有“从表中选择column1 + column2”而不是“select * from table”,那么我需要该语句的FreeformQuery还是可以使用TableQuery? – Kiesa

+0

@Kiesa你仍然可以使用TableQuery和隐藏在UI(Table.setVisibleColumns)的额外列并连接使用GeneratedColumn列,但这种意志,当然,从数据库中加载的所有列。当然,任何连接的列都需要单独存储/编辑。综上所述:如果您只需要处理来自一个SQL表的数据,则始终可以将解决方案移至Java代码。在其他情况下,您必须使用FreeformQuery。 HTH – Jonatan

1

当涉及到SqlContainer笔者为您提供了他以下信息

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

我还没有使用SqlContainer我自己,但这里是samplesource cod e它。如果您在表格中按下一行,您将可以选择保存/编辑数据。