最簡單的
iBatis
入門例子?
??
?
iBatis
是一個
O/R Mapping
解決方案,
iBatis
最大的特點就是小巧,上手很快。如果你不需要太多復雜的功能,
iBatis
是能滿足你的要求又足夠靈活的最簡單的解決方案。下面我們看一個最簡單的入門例子,是《
ibatis
開發指南》上的例子改的,不過上面講的不仔細,我開始學的時候搞了一個晚上才把那個例子跑起來的,相信一些朋友也和我一樣,在入門的時候有一點小郁悶,我把整個工程項目打包了供朋友
下載
,工具是
eclipse3.2+myeclipse5.0
,導入即可運行,數據庫用的是
MySQL
。也可以改用別的數據庫!??
先建數據庫和表吧;
sql
語句我導出來了:
/**/
/*
?

SQLyog?企業版?-?MySQL?GUI?v4.1?

主機?-?5.0.7-beta-nt?:?數據庫?-?sample?

*********************************************************************?

服務器版本?:?5.0.7-beta-nt?

create?database?if?not?exists?`sample`;?

USE?`sample`;?

/*?數據表?`t_user`?的表結構
*/
?

drop
?
table
?
if
?
exists
?`t_user`;?

CREATE
?
TABLE
?`t_user`?(?

??`id`?
int
?(
11
)?
NOT
?
NULL
?auto_increment,?

??`?name?`?
varchar
?(
50
)?
default
?
NULL
?,?

??`sex`?
int
?(
11
)?
default
?
NULL
?,?

??
PRIMARY
?
KEY
???(`id`)?

)?ENGINE
=
InnoDB?
DEFAULT
?CHARSET
=
latin1;?


/**/
/*
?數據表?`t_user`?的數據
*/
?

insert
?
into
?`t_user`?
values
?(
1
,?
'
zhupan
'
?,
1
),(
2
,?
'
zhupan
'
?,
2
),(
3
,?
'
3
'
?,
3
),(
4
,?
'
4
'
?,
4
),(
5
,?
'
5
'
?,
5
);?
整個工程目錄結構如下:??(圖片未能顯示,附件里面有)
lib
包下面的文件:??(圖片未能顯示,附件里面有)
下面開始編寫每個文件:??
編寫
iBatis
必須的配置文件
SqlMapConfig.xml
,放在包
com.ctgusec.zhupan.maps
下,文件名可以任意改,內容如下:
<?
?xml?version?=?"1.0"?encoding?=?"UTF-8"?
?>
?

<!
?DOCTYPE?sqlMapConfig?

????PUBLIC?"-//iBATIS.com//DTD?SQL?Map?Config?2.0//EN"?

????"http://www.ibatis.com/dtd/sql-map-config-2.dtd"?
>
?

<
?sqlMapConfig?
>
?

????
<
?settings?
cacheModelsEnabled?
=?"true"
?enhancementEnabled?
=?"true"
?

????????lazyLoadingEnabled?
=?"true"
?errorTracingEnabled?
=?"true"
?maxRequests?
=?"32"
?

????????maxSessions?
=?"10"
?maxTransactions?
=?"5"
?useStatementNamespaces?
=?"false"
?
/>
?

??

????
<
?transactionManager?
type?
=?"JDBC"
?
>
?

????????
<
?dataSource?
type?
=?"SIMPLE"
?
>
?

????????????
<
property?
name
="JDBC.Driver"
?value
="com.mysql.jdbc.Driver"
?
/>
?

???????????
<
property?
name
="JDBC.ConnectionURL"
????value
="jdbc:mysql://localhost/sample"
?
/>
?

???????????
<
property?
name
="JDBC.Username"
?value
="root"
?
/>
?

???????????
<
property?
name
="JDBC.Password"
?value
=""
?
/>
?

????????????
<
?property?
name?
=?"Pool.MaximumActiveConnections"
?value?
=?"10"
?
/>
?

????????????
<
?property?
name?
=?"Pool.MaximumIdleConnections"
?value?
=?"5"
?
/>
?

????????????
<
?property?
name?
=?"Pool.MaximumCheckoutTime"
?value?
=?"120000"
?
/>
?

????????????
<
?property?
name?
=?"Pool.TimeToWait"
?value?
=?"500"
?
/>
?

????????????
<
?property?
name?
=?"Pool.PingQuery"
?value?
=?"select?1?from?sample"
?
/>
?

????????????
<
?property?
name?
=?"Pool.PingEnabled"
?value?
=?"false"
?
/>
?

????????????
<
?property?
name?
=?"Pool.PingConnectionsOlderThan"
?value?
=?"1"
?
/>
?

????????????
<
?property?
name?
=?"Pool.PingConnectionsNotUsedFor"
?value?
=?"1"
?
/>
?

????????
</
?dataSource?
>
?

????
</
?transactionManager?
>
?

????
<
?sqlMap?
resource?
=?"com/ctgusec/zhupan/maps/User.xml"
?
/>
?

</
?sqlMapConfig?
>
?
如果不用
mysql
數據庫,需要重新配置數據源(紅色加粗字體標出),更改相應的屬性即可。
然后注意到這個配置文件還引用了一個
User.xml
,
iBatis
把每個需要
O/R Mapping
的
Java
對象關聯到一個
xml
配置文件,我們需要把
t_user
表映射到一個
User
類:
package
?com.ctgusec.zhupan.model;?

import
?java.io.Serializable;?

??


public
?
class
?User?
implements
?Serializable?
{?

??


????
/**?*/
/**
?

??????*?
@author
?zhupan?

??????
*/
?

????
private
?
static
?
final
?
long
?serialVersionUID?
=
?
1L
;?

??

????
private
?Integer?id?;?

??

????
private
?String?name?;?

??

????
private
?Integer?sex?;?

????


????
public
?User()?
{?

????}
?

??


????
public
?Integer?getId()?
{?

????????
return
?
this
?.?id?;?

????}
?

??


????
public
?
void
?setId(Integer?id)?
{?

????????
this
?.?id?
=
?id;?

????}
?

??


????
public
?String?getName()?
{?

????????
return
?
this
?.?name?;?

????}
?

??


????
public
?
void
?setName(String?name)?
{?

????????
this
?.?name?
=
?name;?

????}
?

??


????
public
?Integer?getSex()?
{?

????????
return
?
this
?.?sex?;?

????}
?

??


????
public
?
void
?setSex(Integer?sex)?
{?

????????
this
?.?sex?
=
?sex;?

????}
?

}
?
編寫
User.xml
文件:
<?
?xml?version?=?"1.0"?encoding?=?"UTF-8"?
?>
?

??

<!
?DOCTYPE?sqlMap?

????PUBLIC?"-//iBATIS.com//DTD?SQL?Map?2.0//EN"?

????"http://www.ibatis.com/dtd/sql-map-2.dtd"?
>
?

??

<
?sqlMap?
namespace?
=?"User"
?
>
?

??

????
<
?typeAlias?
alias?
=?"user"
?type?
=?"com.ctgusec.zhupan.model.User"
?
/>
?

????
<
?select?
id?
=?"getUser"
?parameterClass?
=?"java.lang.String"
?

????????resultClass?
=?"user"
?
>
?

????????
<![CDATA[
?????select??name,??sex???from?t_user???where?name?=?#name#???
]]>
?

????
</
?select?
>
?

????

????
<
?select?
id?
=?"getAllUser"
?resultClass?
=?"user"
?
>
?

????????
<![CDATA[
????select???name,??sex??from?t_user??
]]>
?

????
</
?select?
>
?

??

????
<
?update?
id?
=?"updateUser"
?parameterClass?
=?"user"
?
>
?

????????
<![CDATA[
????UPDATE?t_user??SET?name=#name#,?sex=#sex#?WHERE?id?=?#id#?
]]>
?

????
</
?update?
>
?

??

????
<
?insert?
id?
=?"insertUser"
?parameterClass?
=?"user"
?
>
?

????????INSERT?INTO?t_user?(?name,?sex)?VALUES?(?#name#,?#sex#?)?
</
?insert?
>
?

??

????
<
?delete?
id?
=?"deleteUser"
?parameterClass?
=?"java.lang.String"
?
>
?

????????delete?from?t_user?where?id=#value#?

????
</
?delete?
>
?

</
?sqlMap?
>
通過
<insert>
、
<delete>
、
<update>
、
<select>
節點,分別定義了針對
TUser
對象的增刪改查操作。在這些節點中,我們指定了對應的
SQL
語句:
ID
指定了操作
ID
,之后我們可以在代碼中通過指定操作
id
來執行此節點所定義的操作,如:
sqlMap.update("updateUser",user);?? ID
設定使得在一個配置文件中定義兩個同名節點成為可能(兩個
update
節點,以不同
id
區分)
parameterClass
指定
了
操
作
所
需的
參
數
類型
,
此例
中
update
操
作
以
com.ctgusec.zhupan.model
.User
類型的對象作為參數,目標是將提供的
User
實例更新到數據庫。
parameterClass="user"
中,
user
為“
com.ctgusec.zhupan.model.User
”類的別名,別名可通過
typeAlias
節點指定,如示例配置文件中的:
<typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/>
“
#name#
”在運行期會由傳入的
user
對象的
name
屬性填充。
“
#sex#
”,將在運行期由傳入的
user
對象的
sex
屬性填充?!?/span>
#id#
”,將在運行期由傳入的
user
對象的
id
屬性填充。??
只要你會寫
SQL
,就能非常容易地寫出配置文件。
最后便是如何使用
iBatis
實現
O/R
映射
,
測試給個例子:
package
?com.ctgusec.zhupan;???

import
?java.sql.SQLException;?

import
?java.util.List;???

import
?com.ctgusec.zhupan.model.User;?

import
?com.ibatis.sqlmap.client.SqlMapClientBuilder;???


/**?*/
/**
?

?*?

?*?
@author
?zhupan?

?
*/
?


public
?
class
?ExampleMain?
{?

??


???????
public
?
static
?
void
?update()?
{?

??????????????
//
?首先初始化?iBatis?獲得一個?SqlMapClient?對象?
??????????????String?resource?
=
?
"
com/ctgusec/zhupan/maps/SqlMapConfig.xml
"
;?

??????????????com.ibatis.sqlmap.client.SqlMapClient?sqlMap?
=
?
null
;?


??????????????
try
?
{?

?????????????????????java.io.Reader?reader?
=
?com.ibatis.common.resources.Resources.getResourceAsReader(resource);?

?????????????????????sqlMap?
=
?SqlMapClientBuilder.buildSqlMapClient(reader);?


??????????????}
?
catch
?(Exception?e)?
{?

?????????????????????e.printStackTrace();?

??????????????}
?

??????????????
//
?sqlMap?系統初始化完畢,開始執行?update?操作?
??????????????
try
?
{?

?????????????????????sqlMap.startTransaction();?

?????????????????????User?user?
=
?
new
?User();?

?????????????????????user.setId(
new
?Integer(
1
));?

?????????????????????user.setName(
"
zhupan
"
);?

?????????????????????user.setSex(
new
?Integer(
1
));?

?????????????????????sqlMap.update(
"
updateUser
"
,?user);?

?????????????????????sqlMap.commitTransaction();?


??????????????}
?
catch
?(SQLException?e)?
{?

?????????????????????System.out.println(e.getMessage());?


??????????????}
?
finally
?
{?


?????????????????????
try
?
{?

????????????????????????????sqlMap.endTransaction();?


?????????????????????}
?
catch
?(SQLException?e)?
{?

????????????????????????????e.printStackTrace();?

?????????????????????}
?

??????????????}
?

???????}
?


???????
public
?
static
?List?getUser()?
{?

//
????????????首先初始化?iBatis?獲得一個?SqlMapClient?對象?
??????????????String?resource?
=
?
"
com/ctgusec/zhupan/maps/SqlMapConfig.xml
"
;?

??????????????com.ibatis.sqlmap.client.SqlMapClient?sqlMap?
=
?
null
;?

??????????????List?user
=
null
;?


??????????????
try
?
{?

?????????????????????java.io.Reader?reader?
=
?com.ibatis.common.resources.Resources.getResourceAsReader(resource);?

?????????????????????sqlMap?
=
?SqlMapClientBuilder.buildSqlMapClient(reader);?


??????????????}
?
catch
?(Exception?e)?
{?

?????????????????????e.printStackTrace();?

??????????????}
?

??????????????
//
?sqlMap?系統初始化完畢,開始執行?getAllUser?操作?
??????????????
try
?
{?

?????????????????????sqlMap.startTransaction();?????????????????????????

?????????????????????user
=
sqlMap.queryForList(
"
getAllUser
"
,?
null
);?

?????????????????????sqlMap.commitTransaction();?


??????????????}
?
catch
?(SQLException?e)?
{?

?????????????????????System.out.println(e.getMessage());?


??????????????}
?
finally
?
{?


?????????????????????
try
?
{?

????????????????????????????sqlMap.endTransaction();?


?????????????????????}
?
catch
?(SQLException?e)?
{?

????????????????????????????e.printStackTrace();?

?????????????????????}
?

??????????????}
?

??????????????
return
?user;?

???????}
?


???????
public
?
static
?
void
?main(String[]?args)?
{?

??????????????update();?

??????????????List?user
=
getUser();???????

??????????????
for
(
int
?i
=
0
;i
<
user.size();i
++
)?


??????????????
{?

?????????????????????System.out.println(((User)user.get(i)).getName());?

??????????????}
?

???????}
?

}
?
運行時把
lib
包下的所有
.jar
構建到路徑中,操作如下:?(圖片未能顯示,附件里面有)?
點擊???(圖片未能顯示,附件里面有)??找到.jar文件全部選中,確認即可??
總結:iBatis確實簡單靈活,上手容易,代碼很少,配置稍嫌復雜。動態SQL的確是個強點,熟悉后感覺很不錯。iBatis中所有的DAO方法都只傳一個值對象,復雜查詢當然也不例外。另外對常見的1:1,1:N關系的支持不如Hibernate。使用iBatis 2.0和1.0有較大區別,主要體現在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地實現DAO模式。持久層使用了iBatis后,團隊中以前亂七八糟的jdbc包裝不見了,大家的編碼風格統一了,可以集中精力進行業務組件的編寫!??
源文件下載
進入頁面:
http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html?
?
參考文獻:
《
ibatis
開發指南》??
Ps
:第一次寫這東西,表達能力實在不怎么樣!結合《
ibatis
開發指南》會更容易明白!有不明白的地方也可以聯系我,我將盡力幫助,有錯誤地方也請指正,謝謝!
blog
:
e代劍客
??? email
:
zhupanjava@gmail.com?
?
e代劍客
于
2006
年
8
月
1
日
完成于
三峽大學軟件工程中心