Struts HOW-TO 系列 之 資料庫訪問 (轉)
HOW-TO 系列
++怎樣訪問++
[訪問一個資料庫]
在一個其於Struts的應用的設計過程中,最好能在/表示層(presentation layer)和你的商務邏輯類(包含所有資料訪問操作的層)的中間,定義一個Action類,作為小型的介面卡(thin adapter)。
所以,你可以先定義一些商務(business API),這些API就是簡單的類。你可以傳遞一些引數給這些,並從這些物件返回一個Java Bean或者Java Bean的集合。這個Action類負責這些物件,並把它們返回的值傳遞給web/表示層。
通常,你可以為每一個你需要呼叫的商務方法/商務類API建立一個Action類。理想情況下,所有的資料庫訪問程式碼都被封裝進了這些商務API類裡,所以Struts並不知道你正在使用的持久層(persistent layer)(甚至都不知道你使用了持久層)。它只需要傳遞一個主鍵(Key)或者一個查詢引數,然後處理返回的結果bean或者bean集合。這樣,你就可以在其他的應用環境裡複用這些商務API類,你還可以對這些獨立於Struts或HTTP環境的商務API進行單體測試。
開始的時候,最簡單的方法就是設計一個1:1的方案,為你的每一個商務API入口(entry-point)定義一個Action類。當你的豐富了以後,你也可以使用DispatchAction組合這些Action類。你甚至可以定義一個簡單的""Action,用來呼叫所有的這些商務類。你可以在contrib目錄裡找到Scaffold設計的ProcessAction,這是一個"框架"Action的完整實現。使用這種方案可以使用更少的Action類,但你必須對Struts和MVC框架的底層實現有較深的理解。不要害怕在開始的時候定義過多的Action,Struts的方案可以給予你充分的自由在以後重構你的設計,因為你可以靈活的改變你的Action類,而不會對應用造成影響。
在理想情況下,商務邏輯層(business logic layer)應該封裝所有的資料訪問細節,包括資料庫連線的獲得。但是,一些應用程式的設計要求呼叫者可以從一個Data物件來獲得資料庫連線。遇到這種情況時,Struts DataSource管理器可以使你在需要的時候配置這些DataSource資源。
Struts DataSource管理器在Struts配置(Struts-config.)裡定義。這個管理器可以用來分發和配置任何實現了javax..DataSource介面的資料庫連線池(connection pool)。如果你的MS或者容器內建了符合這些要求的連線池,你可以優先選用它。
[Jakarta的公共連線池實現 - BasicDataSource]
如果你的手頭沒有連線池的本地(native)實現,你可以使用Jakarta提供的公共連線池實現[org..commons.dbcp.BasicDataSource],它可以和DataSource管理器"合作"的很好。另外,Struts還在它的util包裡包含了一個GenericDataSource類,這也是一個連線池實現。但是這只是一個非常簡單的實現方案,不推薦使用,因為它可能在Struts的以後版本中被BasicDataSource或其它的資料來源實現替換掉。
下面是一段Struts-config.xml配置檔案中的資料來源配置(使用GenericDataSource資料來源實現),你可以更改相應的設定以適合你自己的系統。
<!-- configuration for GenericDataSource wrapper -->
value="false"/>
value="Example Data Source Configuration"/>
value="org.postgresql.Driver"/>
value="4"/>
value="2"/>
value="mypassword"/>
value=":postgresql://localhost/mydatabase"/>
value="myusername"/>
使用BasicDataSource資料來源實現的配置方案如下:
<!-- configuration for commons BasicDataSource -->
value="org.postgresql.Driver" />
value="jdbc:postgresql://localhost/mydatabase" />
value="me" />
value="test" />
value="10" />
value="5000" />
value="false" />
value="false" />
value=" COUNT(*) FROM market" />
注意,你可以在你的應用系統中定義不止一個資料來源,你可以根據需要定義多個資料來源,併為它們分別起一個邏輯名(logical name)。這樣做可以給你的應用系統提供更好的性和可測量性(scalability),你還可以定義一個專用於測試的資料來源。
配置好DataSource以後,你就可以在你的應用系統中使用這些資料來源了。下面這段程式碼演示了怎樣在Action類的execute方法中透過這些資料來源來生成資料庫連線。
public ActionForward execute(
ActionMap mapping,
ActionFoform,
HttpRequest request,
HttpServletResponse response)
throws Exception
{
DataSource dataSource;
Connection cnn;
try
{
dataSource = getDataSource(request);
cnn = dataSource.getConnection();
// 資料連線已經建立了,你可以做你想做的事情了
}
catch (SQLException e)
{
getServlet().log("處理資料庫連線", e);
}
finally
{
// 在finally塊裡包含這些程式碼
// 用以保證連線最後會被關閉
try
{
cnn.close();
}
catch (SQLException e)
{
getServlet().log("關閉資料庫連線", e);
}
}
}
注意:如果你使用公共的BasicDataSource,你提供給pingQuery屬性的查詢語句(如果你設定了話)必須至少要能返回一行記錄。
例子:SELECT COUNT(*) FROM VALIDTABLE
你可以把VALIDTABLE替換成你的資料庫中包含的任何有效的表。
[使用多個資料來源]
如果你需要在模組(Module)中使用多於一個的資料來源,你可以在配置檔案的
…屬性配置略, 同上…
…屬性配置略, 同上…
你程式碼裡,你可以透過這些key獲得不同的資料來源。程式碼如下:
…
try
{
dataSourceA = getDataSource(request, "A");
dataSourceB = getDataSource(request, "B");
…
你可以根據需要為每一個模組設定多個資料來源。但同一模組裡每個資料來源的key屬性必須唯一,因為Struts模組系統是以每一個模組為單位管理名稱空間的。
[更多的內容請參考:]
-archive.com/Struts-user@jakarta.apache.org/msg24621.html">
轉換/資料傳遞(Tranormation/Data Transfer)
[提供動態結果集(dynamic result set)]
大多數的資料庫查詢結果都會跟你的已經使用的ActionForms一一對應,你只需要把你的查詢結果集合提交給相應的ActionForm就可以了。但有時候,結果集(ResultSet)裡有些欄位並不是ActionForm的屬性,或者更糟。
幸運的是,Struts的自定義標籤集並不關心你傳遞給他們的bean型別。你甚至可以直接輸出結果集。但是由於結果集會一直保持著與資料庫的連線,並且由於它們把所有的資料都直接傳遞給了,使得頁面變得零亂不堪。那麼我們該怎麼做呢?
從Struts 1.1開始,你可以使用新增加的ResultSetDynaClass來把你的結果集轉換成一個DynaBeans的ArrayList。Struts自定義標籤集可以像一般的JavaBean一樣使用DynaBean的屬性。(關於DynaActionForm類更詳細的資訊,請參考Struts手冊)。
ResultSetDynaClass類已經包含在於BeanUtils.jar包中,所以你現在所要做的,只需要拿出這個工具,實現自己的傳遞方案吧…………
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-962862/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用perl訪問mysql資料庫(轉)MySql資料庫
- 遠端資料庫的訪問 (轉)資料庫
- 透過socket訪問資料庫(轉)資料庫
- JSP訪問資料庫大全(轉)JS資料庫
- MySql資料庫C++訪問(轉)MySql資料庫C++
- 如何限定IP訪問Oracle資料庫-轉Oracle資料庫
- Applet直接訪問資料庫 (轉)APP資料庫
- 用JDBC訪問一個資料庫(轉)JDBC資料庫
- JavaWeb之Struts2訪問ServletAPIJavaWebServletAPI
- JDBC資料庫訪問JDBC資料庫
- 在Linux下訪問MSSQLServer資料庫 (轉)LinuxSQLServer資料庫
- 大型網站資料庫及資料訪問最佳化(轉)網站資料庫
- 直接透過ODBC API訪問SQL資料庫 (轉)APISQL資料庫
- Oracle資料庫訪問控制Oracle資料庫
- 異構資料庫訪問資料庫
- Oracle學習系列—資料庫優化—RBO訪問路徑Oracle資料庫優化
- Java Web之Struts2訪問Servlet APIJavaWebServletAPI
- jboss訪問資料庫的問題資料庫
- 分散式文件儲存資料庫之MongoDB訪問控制分散式資料庫MongoDB
- 【資料庫訪問優化方案之讀寫分離】資料庫優化
- Oracle,SqlServer,Access資料庫通用訪問類設計(轉)OracleSQLServer資料庫
- 在Linux下訪問MS SQL Server資料庫(轉)LinuxSQLServer資料庫
- 外網訪問MySQL資料庫MySql資料庫
- Oracle資料庫限制訪問IPOracle資料庫
- C#訪問MySQL資料庫C#MySql資料庫
- C#訪問SQLite資料庫C#SQLite資料庫
- 訪問HyperSQL資料庫的方法SQL資料庫
- 限制特定IP訪問資料庫資料庫
- Data Guard broker系列之五:資料庫角色轉換資料庫
- 資料庫如何處理大資料訪問資料庫大資料
- 求助:資料庫併發訪問問題資料庫
- 使用Visual Basic訪問資料庫幾個注意的問題 (轉)資料庫
- oracle透明閘道器之異構資料庫的訪問Oracle資料庫
- 本機資料庫資料庫鏈無法訪問遠端資料庫資料庫
- [轉]SQLServer跨伺服器訪問資料庫(openrowset/opendatasource/openquery)SQLServer伺服器資料庫ENQ
- 封裝ADO訪問資料庫的兩個類 (轉)封裝資料庫
- 使用設計模式構建通用資料庫訪問類 (轉)設計模式資料庫
- 用連線池提高Servlet訪問資料庫的效率 (轉)Servlet資料庫