2012-01-19 35 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它。如果您在表格中按下一行,您將可以選擇保存/編輯數據。