來源:http://big5.webasp.net/article/18/17813.htm

Struts HOW-TO 系列

++怎樣訪問數據庫++

〔訪問一個數據庫〕

在一個其於Struts的應用系統的設計過程中,最好能在web/表示層(presentation layer)和你的商務邏輯類(包含所有數據訪問操作的層)的中間,定義一個Action類,作為小型的適配器(thin adapter)。

所以,你可以先定義一些商務API(business API),這些API就是簡單的Java類。你可以傳遞一些參數給這些對象,並從這些對像返回一個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)應該封裝所有的數據訪問細節,包括數據庫連接的獲得。但是,一些應用程序的設計要求調用者可以從一個DataSource對像來獲得數據庫連接。遇到這種情況時,Struts DataSource管理器可以使你在需要的時候配置這些DataSource資源。

Struts DataSource管理器在Struts配置文件(Struts-config.xml)裡定義。這個管理器可以用來分發和配置任何實現了javax.sql.DataSource接口的數據庫連接池(connection pool)。如果你的DBMS或者容器內置了符合這些要求的連接池,你可以優先選用它。

〔Jakarta的公共連接池實現 - BasicDataSource〕

如果你的手頭沒有連接池的本地(native)實現,你可以使用Jakarta提供的公共連接池實現[org.apache.commons.dbcp.BasicDataSource],它可以和DataSource管理器"合作"的很好。另外,Struts還在它的util包裡包含了一個GenericDataSource類,這也是一個連接池實現。但是這只是一個非常簡單的實現方案,不推薦使用,因為它可能在Struts的以後版本中被BasicDataSource或其它的數據源實現替換掉。

下面是一段Struts-config.xml配置文件中的數據源配置(使用GenericDataSource數據源實現),你可以更改相應的設置以適合你自己的系統。

<!-- configuration for GenericDataSource wrapper -->
<data-sources>
<data-source>
<set-property
property="autoCommit"
value="false"/>
<set-property
property="description"
value="Example Data Source Configuration"/>
<set-property
property="driverClass"
value="org.postgresql.Driver"/>
<set-property
property="maxCount"
value="4"/>
<set-property
property="minCount"
value="2"/>
<set-property
property="password"
value="mypassword"/>
<set-property
property="url"
value="jdbc:postgresql://localhost/mydatabase"/>
<set-property
property="user"
value="myusername"/>
</data-source>
</data-sources>

使用BasicDataSource數據源實現的配置方案如下:

<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property
property="driverClassName"
value="org.postgresql.Driver" />
<set-property
property="url"
value="jdbc:postgresql://localhost/mydatabase" />
<set-property
property="username"
value="me" />
<set-property
property="password"
value="test" />
<set-property
property="maxActive"
value="10" />
<set-property
property="maxWait"
value="5000" />
<set-property
property="defaultAutoCommit"
value="false" />
<set-property
property="defaultReadOnly"
value="false" />
<set-property
property="validationQuery"
value="SELECT COUNT(*) FROM market" />
</data-source>
</data-sources>

注意,你可以在你的應用系統中定義不止一個數據源,你可以根據需要定義多個數據源,並為它們分別起一個邏輯名(logical name)。這樣做可以給你的應用系統提供更好的安全性和可測量性(scalability),你還可以定義一個專用於測試的數據源。

配置好DataSource以後,你就可以在你的應用系統中使用這些數據源了。下面這段代碼演示了怎樣在Action類的execute方法中通過這些數據源來生成數據庫連接。

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest 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)中使用多於一個的數據源,你可以在配置文件的<data-source>元素裡包含一個key屬性。

<data-source>
<data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
…屬性配置略, 同上…
</data-source>
<data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
…屬性配置略, 同上…
</data-source>
</data-source>

你代碼裡,你可以通過這些key獲得不同的數據源。代碼如下:


try
{
dataSourceA = getDataSource(request, "A");
dataSourceB = getDataSource(request, "B");

你可以根據需要為每一個模塊設置多個數據源。但同一模塊裡每個數據源的key屬性必須唯一,因為Struts模塊系統是以每一個模塊為單位管理命名空間的。

大多數的數據庫查詢結果都會跟你的已經使用的ActionForms一一對應,你只需要把你的查詢結果集合提交給相應的ActionForm就可以了。但有時候,結果集(ResultSet)裡有些字段並不是ActionForm的屬性,或者更糟。

幸運的是,Struts的自定義標籤集並不關心你傳遞給他們的bean類型。你甚至可以直接輸出結果集。但是由於結果集會一直保持著與數據庫的連接,並且由於它們把所有的數據都直接傳遞給了JSP,使得頁面變得零亂不堪。那麼我們該怎麼做呢?

從Struts 1.1開始,你可以使用新增加的ResultSetDynaClass來把你的結果集轉換成一個DynaBeans的ArrayList。Struts自定義標籤集可以像一般的JavaBean一樣使用DynaBean的屬性。(關於DynaActionForm類更詳細的信息,請參考Struts用戶手冊)。

ResultSetDynaClass類已經包含在於BeanUtils.jar包中,所以你現在所要做的,只需要拿出這個工具,實現自己的傳遞方案吧…………

struts數據庫訪問相关推荐

  1. oracle缺少key xe.reg,【Oracle XE系列之一】Windows 7 64位安裝Oracle XE(32位)數據庫(REG_XE報錯、字符集、修改8080端口等)...

     一.安裝 1.去Oracle官網下載XE版的安裝包(貌似Windows只有32位的,Linux只有6位的),解壓. 2.雙擊Setup.exe,啟動安裝程序,在選在路徑那里不要點下一步,否則會報 ...

  2. solr 4.8 mysql_solr 4.8+mysql數據庫數據導入 + mmseg4j中文全文索引 配置筆記

    1.如何將solr部署,請參考之前的文章 2.按上述配置好后,在solr_home文件夾中,將包含collection1文件夾,這就是solr的一個實例.下面我們來看看collection1中的文件內 ...

  3. FMDB與SQLite 數據庫應用示範:打做一隻簡單的電影資料庫 App

    原文:http://www.appcoda.com/fmdb-sqlite-database/ 作者:GABRIEL THEODOROPOULOS 譯者:kmyhy 通常在 App 中使用數據庫并處理 ...

  4. unity3d排行榜mysql_Unity3D 連接MySql數據庫

    Unity3D 連接MySql數據庫 一.在Mac OS X中架設MySql數據庫 下載mysql for Mac http://dev.mysql.com/downloads/mysql/5.0.h ...

  5. oracle odp arraybindcount 极限,極限挑戰—C#+ODP 100萬條數據導入Oracle數據庫僅用不到1秒...

    .Net程序中可以通過ODP調用特性,對Oracle數據庫進行操作,今天來講一下數據批量插入的功能,所用技術不高不深,相信很多朋友都接觸過,小弟班門弄斧了,呵呵.這篇文章是上篇文章的續集,因為上一次試 ...

  6. php access 插入,如何使用PHP將附件插入Access數據庫?

    I need to add some files uploaded from an HTML form to an MS Access DDBB. Using PHP, SQL and ODBC I ...

  7. mysql使用从c3p0_使用c3p0連接池操作mysql數據庫中文亂碼解決辦法

    今天在一台新的CentOS機器上使用c3p0連接池操作mysql數據庫出現中文亂碼問題,具體表現為:查詢時無中文亂碼問題,寫數據時中文亂碼,查看了機器上數據庫字符集也是UTF8,應該不會出現中文亂碼才 ...

  8. php mssql生僻字,php生僻字的處理,插入數據庫被截斷,空白,亂碼解決辦法,php冷僻字處理...

    前言歡迎喜歡php的朋友.喜歡mssql的朋友.喜歡extjs的朋友,一起來交流,本人不才,建個群,希望各位老師賞光.QQ群: PHP-MSSQL-EXTJS 號碼: 110888868 網上找了資料 ...

  9. oracle估算大小,Oracle 估算數據庫大小的方法

    一.說明 一網友問我將一個查詢的結果集存放到臨時表里,如果估算臨時表的大小,當時想的方法是通過統計block來計算.后來想,此方法的操作性也不是很高. 最好是能在查詢操作執行之前就能估算出大小. 查看 ...

最新文章

  1. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
  2. 75分钟入门微生物组数据分析和结果解读—刘永鑫(合肥,2021年6月23日)
  3. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
  4. HTTP referer/HTTP referrer
  5. SAP Spartacus index.html 里的 occ-backend-base-url 如何被解析的?
  6. esxi.主机配置上联端口_为什么现代的电脑机箱仍然具有USB 2.0端口?
  7. 从王者荣耀看设计模式(五.组合模式)
  8. tomcat可以直接起jar吗_天津买房可以直接落户吗
  9. 打印浏览器文章为pdf
  10. gcc/g++使用及gdb调试新手入门
  11. 10.24 cv方向3DMM必备环境——Windows10/11下pytorch3d[完美安装版]
  12. win10系统如何设置局域网服务器,win10系统设置局域网地址的操作方法
  13. 正则表达式——(2) 匹配、切割、替换、获取
  14. 计算器程序java开方运算_模拟计算器java程序
  15. java程序连接MinIO 报错The request signature we calculated does not match the signature you provided.
  16. 数据挖掘与数据分析的区别
  17. 数据挖掘计算机语言,数据挖掘工程师
  18. 谈谈papi酱的价值
  19. NAO机器人的Walk功能
  20. 店铺首页图片css,CSS布局与JS结合 实现某宝店铺首页

热门文章

  1. 求从n个数组任意选取一个元素的所有组合
  2. MFC-使用自定义控件的方法
  3. Kotlin 基础语法
  4. VirtualBox虚拟机菜单选项隐藏后重现
  5. python 读取excel表数据获取坐标_python读取并定位excel数据坐标系详解
  6. QPainter函数setClipRect
  7. Android开发之百度地图距离判断(判断定位位置是否在圆的范围内)
  8. 语言android编程规范,计算机语言编程规范-在路上.PDF
  9. 打包指令_将Vue项目打包为Windows应用(.exe)
  10. HDU - 6126 Give out candies