引論 隨著Hibernate逐漸成為其他架構之首
現今的許多工作都是在對象關系(OR)映射域上進行
但是
那些對象關系映射工具有一個問題
大部分數據庫管理員似乎對這些對象關系(OR)映射工具所產生的查詢不放心
不幸的是
這些數據庫管理員不了解
架構所產生的查詢是多麼的優越
並且使你的應用程序更加靈活
他們覺得隨著數據庫成為應用程序的主要瓶頸
應該完全控制SQL查詢
以便他們能分析和調試以促進性能
但有個問題是
如果不使用對象關系(OR)映射工具
那麼你將花費很多資源在書面形式上和維護低級JDBC代碼
由於以下原因
每個JDBC應用程序都將含有重復代碼
連接和事務管理
設置java對象為查詢參數
轉換SQL ResultSets 為 java 對象
生成查詢字符串
iBatis 的 SQLMaps 架構幫助我們在相當大的程度上減少了正常情況下訪問關系數據庫的java代碼的總量
它考慮到了當前三個比較關心的問題
所以它可以將一個簡單的 JavaBean 對象映射到 PreparedStatement 參數和 ResultSet 值
SQLMaps 的原理其實很簡單
提供一個簡單的架構來提供
%的JDBC功能
這篇文章是關於如何使用 SQLMaps 架構的進階輔導
我們將建立一個簡單的 Struts 應用程序並且用 SQLMaps 配置它為開始
接著
我們將演示如何執行基本的數據庫操作比如 SELECT
INSERT
UPDATE 等等
然後
我們將演示 SQLMaps 為連接和事務管理提供的操作
在最後
我們將試著使用一些高級的 SQLMaps 功能部件比如緩存和分頁
SQLMaps 的基本思想 使用 SQLMaps 架構
你必須建立一個XML文件列出所有你希望在應用程序中執行的SQL查詢
對於每個SQL查詢
你來指定哪個java類可以交換參數和ResultSet(結果集)
在你的java代碼中
如果你想要執行一個特殊的查詢
你需要創建一個對象來傳遞查詢參數和必要的條件
然後傳遞這個對象和查詢的名字讓 SQLMaps 執行
一旦查詢被執行
SQLMaps 將為你指定的接受查詢結果的類創建一個句柄
並且將它和數據庫返回的ResultSet 中的值存儲在一起
一個簡單的使用SQLMaps的應用程序(Hello World) 我們將創建一個簡單的Struts應用程序開始來演示什麼是使用SQLMaps的應用程序所需要的
這個例子的代碼是來自以下資源部分
在這個例子中
我們用一個Jsp頁面要求用戶輸入contactId屬性
一旦它被提交
我們用它在CONTACT 表中搜索一個連接
並且用另一個Jsp頁面展示給用戶
接下來一步一步說明
拷貝ibatis
sqlmap
jar 和 ibatis
common
jar 到你的 web
inf/lib 文件夾中
在你的java源文件夾中創建一個 SqlMapConfig
xml 文件
像這樣
<sqlMapConfig> <settings useStatementNamespaces=
false
/> <transactionManager type=
JDBC
> <dataSource type=
SIMPLE
> <property name=
JDBC
Driver
value=
COM
ibm
db
jdbc
app
DB
Driver
/> <property name=
JDBC
ConnectionURL
value=
jdbc:db
:SAMPLE
/> <property name=
JDBC
Username
value=
db
admin
/> <property name=
JDBC
Password
value=
admin
db
/> </dataSource> </transactionManager> <sqlMap resource=
Contact
xml
/></sqlMapConfig>
SqlMapConfig
xml 是SQLMaps的部署描述信息
包括以下元素
<sqlMapConfig>是文件的根元素
<settings>被用來定義應用程序級別的設置
例如 useStatementNamespaces 屬性被用來定義是否要用准備說明的全限定名
它可以有一些另外的屬性用於控制緩存和初始化
要知道更進一步的細節請查看文檔
<transactionManager> 被用來定義你想要在你的應用程序中使用的事務管理
在我們的例程中
我們要用Connection 對象的 commit 和 rollback 方法來管理事務
所以我們用JDBC作為事項管理程序
它包含 <dataSource> 作為子元素
<dataSource>用來定義你要使用的連接管理的類型
在我們的例程中
我們要用SQLMaps自帶的連接池實現
如此我們將使用一個SIMPLE類型的數據源
為了建立連接池
SQLMaps要求像JDBC驅動名稱
URL
和密碼這些信息
因此
我們使用<property>元素來傳遞這些信息
稍後
我們將更加詳細地討論各種各樣可用的事務和連接管理選項
<sqlMap>元素被用來表明 SQLMap 配置文件
這些文件
如早先討論的
列出了你希望執行的SQL查詢
創建一個JavaBean類
Contact
java
有屬性 firstName
lastName 和 contactId 和相應的get
set方法
這個類將被用來向ResultSet傳遞查詢參數並讀取值
public class Contact implements Serializable{ private String firstName; private String lastName; private int contactId; //Getter setter methods for firstName
//lastName and contactId property}
建立一個Contact
xml文件
我們將在文件中列出所有要執行的與表Contact有關的SQL查詢
<sqlMap namespace=
Contact
> <typeAlias alias=
contact
type=
ntact
Contact
/
> <select id=
getContact
parameterClass=
int
resultClass=
contact
> select CONTACTID as contactId
FIRSTNAME as firstName
LASTNAME as lastName from ADMINISTRATOR
CONTACT where CONTACTID = #id# </select></sqlMap>
文件中使用的標簽如下
<sqlMap>是文件的根元素
正常情況下
你的應用程序將有不止一個表
由於你要把與不同表有關的查詢分開成不同的名稱空間(namespace)
<namespace> 元素就是被用來指定在此文件中查詢應被放置的名稱空間
<typeAlias> 用來說明Contact 類的全限定名的一個簡稱
在此說明後
這個簡稱可以被用來替代全限定名
在SQLMaps架構中 <select> 元素用來聲明SQLMaps架構中的SELECT查詢
它的值就是你能指定的要執行的查詢
id屬性被用來指定通知SQLMaps 執行特殊查詢的名稱
parameterClass 被用來指定傳遞查詢參數的類
resultClass 提供從ResultSet返回值的類的名稱
在Action類的 execute() 方法內
我們建立了一個SqlMapClient的句柄
它被用來和SQLMaps相互作用
我們必須向SqlMapClientBuilder傳遞SqlMapConfig
xml文件
它被用來讀取配置設置
DynaActionForm contactForm = (DynaActionForm)form; Reader configReader = Resources
getResourceAsReader(
SqlMapConfig
xml
); SqlMapClient sqlMap = SqlMapClientBuilder
buildSqlMapClient(configReader); Contact contact = (Contact) sqlMap
queryForObject(
getContact
contactForm
get(
contactId
)); request
setAttribute(
contactDetail
contact); return mapping
findForward(
success
);
當你要執行一個SELECT 查詢時
應該使用 SQLMaps 的 queryForObject 方法
在Contact
xml文件中
我們已經指定parameterClass為int
所以我們在傳遞查詢的名稱的時候傳遞一個integer作為contactId (i
e getContact)
SQLMaps 將返回一個Contact 類的對象
基本數據庫操作 現在我們要返回我們的所關注的使用SQMLaps如何表示一些基本的數據庫操作
Insert操作
我們從如何執行一個開始Insert操作開始
<insert id=
insertContact
parameterClass=
contact
>INSERT INTO ADMINISTRATOR
CONTACT( CONTACTID
FIRSTNAME
LASTNAME) VALUES(#contactId#
#firstName#
#lastName#);</insert>
<insert> 元素被用來聲明一個Insert的SQL查詢
它有一個parameterClass 屬性用來指明哪個JavaBean類將被用來傳遞(request)請求參數
在插入新的記錄時
我們要使用contactId屬性的值
所以我們必須在SQL查詢中使用一個#contactId#
public void contactInsert() throws SQLException
IOException { sqlMap
startTransaction(); try { sqlMap
startTransaction(); Contact contact = new Contact(); contact
setContactId(
); contact
setFirstName(
John
); contact
setLastName(
Doe
); sqlMap
insert(
insertContact
contact); mitTransaction(); } finally{ sqlMap
endTransaction(); }}
在我們的java代碼中
我們建立了一個Contact 對象
存放它的值
然後調用sqlMap
insert()方法
傳遞我們要執行的查詢的名稱和 Contact
這個方法將插入一個新的Contact並且返回新插入的Contact的主鍵
缺省情況下
SQLMaps 把每個DML方法當作工作的一個單元
但是你能使用 startTransaction
commitTransaction 和 endTransaction 方法來劃分事務處理
通過調用 startTransaction() 方法你可以啟動一個事務處理
此方法也能從連接池中獲得一個連接
在這個事務中
這個連接對象將被用來執行查詢
如果這個事務的所有查詢都被成功執行
應該調用 commitTransaction 方法提交你的改動
不考慮你的事務成功與否
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27482.html