最简单的
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
属性填充。“
#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
日
完成于
三峡大学软件工程中心