iBatis
学习笔记
一、何为 iBatis
iBatis 是一种“半自动化”的ORM实现。
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”
ORM 实现而言,“全自动”ORM 实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。而ibatis 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
二、何时用 iBatis
1. 系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几
条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2. 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由
存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交
通银行,都在开发规范中严格指定)
3. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高
度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
三、iBatis 的下载
四、iBatis 的基础构建代码
1
.
ibatis
实例配置
一个典型的配置文件如下(具体配置项目的含义见后):
<?
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.p6spy.engine.spy.P6SpyDriver" />
< property name ="JDBC.ConnectionURL"
value ="jdbc:mysql://localhost/sample" />
< property name ="JDBC.Username" value ="user" />
< property name ="JDBC.Password" value ="mypass" />
< 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
ACCOUNT" />
< property name ="Pool.PingEnabled" value ="false" />
< property name ="Pool.PingConnectionsOlderThan"
value ="1" />
< property name ="Pool.PingConnectionsNotUsedFor"
value ="1" />
</ dataSource >
</ transactionManager >
< sqlMap resource ="com/ibatis/sample/User.xml" />
</ sqlMapConfig >
<! 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.p6spy.engine.spy.P6SpyDriver" />
< property name ="JDBC.ConnectionURL"
value ="jdbc:mysql://localhost/sample" />
< property name ="JDBC.Username" value ="user" />
< property name ="JDBC.Password" value ="mypass" />
< 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
ACCOUNT" />
< property name ="Pool.PingEnabled" value ="false" />
< property name ="Pool.PingConnectionsOlderThan"
value ="1" />
< property name ="Pool.PingConnectionsNotUsedFor"
value ="1" />
</ dataSource >
</ transactionManager >
< sqlMap resource ="com/ibatis/sample/User.xml" />
</ sqlMapConfig >
下面是我用作示例的一个
POJO:
public
class
User
implements
Serializable {
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
/** 默认构造函数 */
public User() {
}
/** 省略 getter/setter 方法 */
………………………………………….
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
/** 默认构造函数 */
public User() {
}
/** 省略 getter/setter 方法 */
………………………………………….
与
Hibernate
不同。因为需要人工编写
SQL
代码,
ibatis
的映射文件一般采
用手动编写(通过
Copy/Paste
,手工编写映射文件也并没想象中的麻烦)。
针对上面
POJO
的映射代码如下:
<?
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.ibatis.sample.User" />
< select id ="getUser"
parameterClass ="java.lang.String"
resultClass ="user" >
<![CDATA[
select
name,
sex
from t_user
where name = #name#
]]>
</ 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 >
<! 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.ibatis.sample.User" />
< select id ="getUser"
parameterClass ="java.lang.String"
resultClass ="user" >
<![CDATA[
select
name,
sex
from t_user
where name = #name#
]]>
</ 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 >
六、iBatis 的高级特性
七、iBatis 与其它的ORM解决方案的区别
未写完的待续。。。