Ibatis 配置参数详解 (五)

相对Hibernate和Apache OJB 等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现。

 

以前ORM的框架(hibernate,ojb)的局限:

 

1. 系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。

 

2. 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交通银行,都在开发规范中严格指定)

 

3. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。

 

ibatis 的着力点:

 

在于POJO 与SQL之间的映射关系。也就是说,ibatis

 

并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。

 

Ibatis与Hibernate的区别:

 

Hibernate提供了全面的数 据库封装机制的“全自动化”ORM 实现而言,“全自动”ORM 实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行,而ibatis 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。

 

ibatis配置文件:

 

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2.   
  3. <!DOCTYPE sqlMapConfig  
  4.   
  5. PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"  
  6.   
  7. "http://www.ibatis.com/dtd/sql-map-config-2.dtd">  
  8.   
  9. <sqlMapConfig>  
  10.   
  11. <settings //-------------------------(1)  
  12.   
  13. cacheModelsEnabled="true"  
  14.   
  15. enhancementEnabled="true"  
  16.   
  17. lazyLoadingEnabled="true"  
  18.   
  19. errorTracingEnabled="true"  
  20.   
  21. maxRequests="32"  
  22.   
  23. maxSessions="10"  
  24.   
  25. maxTransactions="5"  
  26.   
  27. useStatementNamespaces="false"  
  28.   
  29. />  
  30.   
  31. <transactionManager type="JDBC"> //-----------------------(2)  
  32.   
  33. <dataSource type="SIMPLE">    //-------------------------(3)  
  34.   
  35. <property name="JDBC.Driver" value="com.p6spy.engine.spy.P6SpyDriver"/>  
  36.   
  37. <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/sample"/>  
  38.   
  39. <property name="JDBC.Username" value="user"/>  
  40.   
  41. <property name="JDBC.Password" value="mypass"/>  
  42.   
  43. <property name="Pool.MaximumActiveConnections" value="10"/>  
  44.   
  45. <property name="Pool.MaximumIdleConnections" value="5"/>  
  46.   
  47. <property name="Pool.MaximumCheckoutTime" value="120000"/>  
  48.   
  49. <property name="Pool.TimeToWait" value="500"/>  
  50.   
  51. <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>  
  52.   
  53. <property name="Pool.PingEnabled" value="false"/>  
  54.   
  55. <property name="Pool.PingConnectionsOlderThan" value="1"/>  
  56.   
  57. <property name="Pool.PingConnectionsNotUsedFor" value="1"/>  
  58.   
  59. </dataSource>  
  60.   
  61. </transactionManager>  
  62.   
  63. <sqlMap resource="com/ibatis/sample/User.xml"/> //-------------------(4)  
  64.   
  65. <sqlMap resource="com/ibatis/sample/Address.xml"/>  
  66.   
  67. </sqlMapConfig>  

 

 

 

⑴Settings 节点 参数

 

描述

 

cacheModelsEnabled

 

是否启用SqlMapClient上的缓存机制。建议设为"true"

 


 

enhancementEnabled

 

是否针对POJO启用字节码增强机制以提升getter/setter的调用效能,避免使用JavaReflect所带来的性能开销。

 

同时,这也为Lazy Loading带来了极大的性能提升。建议设为"true"

 


 

errorTracingEnabled

 

是否启用错误日志,在开发期间建议设为"true"以方便调试

 


 

lazyLoadingEnabled

 

是否启用延迟加载机制,建议设为"true"

 


 

maxRequests

 

最大并发请求数(Statement并发数)

 


 

maxTransactions

 

最大并发事务数

 


 

maxSessions

 

最大Session 数。即当前最大允许的并发SqlMapClient数。

 

maxSessions设定必须介于maxTransactions和maxRequests之间,

 

即 maxTransactions<maxSessions=<maxRequestsuseStatementNamespaces

 

是否使用Statement命名空间。这里的命名空间指的是映射文件中,sqlMap节点的namespace属性,如在上例中针对t_user

 

表的映射文件sqlMap节点:

 

<sqlMap namespace="User">

 

这里,指定了此sqlMap节点下定义的操作均从属于"User"命名空间。

 

在useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",user);

 

否则直接通过Statement名称调用即可,如:sqlMap.update("updateUser",user);

 

但请注意此时需要保证所有映射文件中,Statement定义无重名。

 

 

 

 

 

⑵ transactionManager节点

 

transactionManager 节点定义了ibatis 的事务管理器,目前提供了以下几种选择:

 

Ø JDBC

 

通过传统JDBC Connection.commit/rollback实现事务支持。

 

 

 

Ø JTA

 

使用容器提供的JTA服务实现全局事务管理。

 

 

 

Ø EXTERNAL

 

外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制。

 

此时ibatis 将把所有事务委托给外部容器进行管理。此外,通过Spring 等轻量级容器实现事务的配置化管理也是一个不错的选择。

 

关于结合容器实现事务管理,参见“高级特性”中的描述。

 

 

 

⑶ dataSource节点

 

dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。

 

type属性: dataSource节点的type属性指定了dataSource的实现类型。可选项目:

 


 

Ø SIMPLE:

 

SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。

 


 

Ø DBCP:

 

基于Apache DBCP 连接池组件实现的DataSource 封装,当无容器提供DataSource 服务时,建议使用该选项,

 

对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

 


 

Ø JNDI:

 

使用J2EE 容器提供的DataSource 实现,DataSource 将通过指定的JNDI Name 从容器中获取。

 

对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。

 

---------------------------------------------------------------------------------------------------------------------------------------

 


 

dataSource的子节点说明(SIMPLE&DBCP):

 

参数

 

描述

 

JDBC.Driver

 

JDBC 驱动。如:com.microsoft.jdbc.sqlserver.SQLServerDriver

 


 

JDBC.ConnectionURL

 

数据库URL。如:

 

jdbc:microsoft:sqlserver://localhost:1433;databaseName=ibatis如果用的是SQLServer JDBC Driver,

 

需要在url后追加SelectMethod=Cursor以获得JDBC事务的多Statement支持。

 


 

JDBC.Username

 

数据库用户名

 


 

JDBC.Password

 

数据库用户密码

 


 

Pool.MaximumActiveConnections

 

数据库连接池可维持的最大容量。

 


 

Pool.MaximumIdleConnections

 

数据库连接池中允许的挂起(idle)连接数。

 

以上子节点适用于SIMPLE 和DBCP 模式,分别针对SIMPLE 和DBCP 模式的DataSource私有配置节点如下:

 


 

SIMPLE:

 

Pool.MaximumCheckoutTime

 

数据库联接池中,连接被某个任务所允许占用的最大时间,如果超过这个时间限定,连接将被强制收回。(毫秒)

 


 

Pool.TimeToWait

 

当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。

 

此参数设定了线程所允许等待的最长时间。(毫秒)

 


 

Pool.PingQuery

 

数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲状态时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用。

 

检测语句应该是一个最简化的无逻辑SQL。如“select 1 from t_user”,如果执行此语句成功,连接池管理器将认为此连接处于可用状态

 


 

Pool.PingEnabled

 

是否允许检测连接状态。

 


 

Pool.PingConnectionsOlderThan

 

对持续连接时间超过设定值(毫秒)的连接进行检测。

 


 

Pool.PingConnectionsNotUsedFor

 

对空闲超过设定值(毫秒)的连接进行检测。

 


 

DBCP:

 

Pool.MaximumWait

 

当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。

 

此参数设定了线程所允许等待的最长时间。(毫秒)

 


 

Pool.ValidationQuery

 

数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲状态时会将其断开。

 

而连接池管理器将通过此语句检测池中连接是否可用。检测语句应该是一个最简化的无逻辑SQL。如“select 1 from t_user”,

 

如果执行此语句成功,连接池管理器将认为此连接处于可用状态。

 


 

Pool.LogAbandoned

 

当数据库连接被废弃时,是否打印日志。

 


 

Pool.RemoveAbandonedTimeout

 

数据库连接被废弃的最大超时时间

 


 

Pool.RemoveAbandoned

 

当连接空闲时间超过RemoveAbandonedTimeout时,是否将其废弃。

 


 

JNDI:

 

由于大部分配置是在应用服务器中进行,因此ibatis中的配置相对简单,下面是分别使用JDBC和JTA事务管理的JDNI配置:

 

使用JDBC事务管理的JNDI DataSource配置

 

[html] view plain copy
  1. <transactionManager type="JDBC" >  
  2.   
  3. <dataSource type="JNDI">  
  4.   
  5. <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>  
  6.   
  7. </dataSource>  
  8.   
  9. </transactionManager>  
  10.   
  11. <transactionManager type="JTA" >  
  12.   
  13. <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>  
  14.   
  15. <dataSource type="JNDI">  
  16.   
  17. <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>  
  18.   
  19. </dataSource>  
  20.   
  21. </transactionManager>  

 


 

⑷ sqlMap节点

 

sqlMap 节点指定了映射文件的位置,配置中可出现多个sqlMap 节点,以指定项目内所包含的所有映射文件。

 

<?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"/> 给对应的类取别名

 

<cacheModel id="userCache" type="LRU">

 

<flushInterval hours="24"/> 设定缓存有效期

 

<flushOnExecute statement=" updateUser"/>

 

 

 

指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。

 

<property name="size" value="1000" /> CacheModel中最大容纳的数据对象数量

 

</cacheModel>

 

申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:例如:

 

<select id="getUser" parameterClass="java.lang.String" resultClass="user"

 

cacheModel="userCache">

 

<select id="" parameterClass="java.lang.String" resultClass="user">

 

<![CDATA[    可以避免SQL 中与XML 规范相冲突的字符对XML映射文件的合法性造成影响。

 

SQL语句

 

]]>

 

</select>

 

< update id=" " parameterClass="java.lang.String" >

 

<![CDATA[

 

SQL语句

 

]]>

 

 

 

</ update >

 

< insert id=" " parameterClass="java.lang.String" >

 

<![CDATA[

 

SQL语句

 

]]>

 

 

 

</ insert >

 

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

 

<![CDATA[

 

SQL语句

 

]]>

 

 

 

</ delete >

 

</sqlMap>

 

需要一个JAVABEAN:有getter和setter方法

 

如何读取配置文件:

 

[java] view plain copy
  1.        public class SQLMapper {  
  2.   
  3.        public static SqlMapClient sqlMapper;  
  4.   
  5.        static{  
  6.   
  7.               String resource = "org/lzp/xml/SqlMapConfig.xml";指明了配置文件的相对路径  
  8.   
  9.               try {  
  10.   
  11.                      Reader reader = Resources.getResourceAsReader(resource);  
  12.   
  13.            //ibatis2.0  
  14.   
  15.            /* XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder(); 
  16.  
  17. sqlMapper = xmlBuilder.buildSqlMap(reader); 
  18.  
  19. */  
  20.   
  21. //ibatis1.0  
  22.   
  23.                      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);  
  24.   
  25.               } catch (Exception e) {  
  26.   
  27.                      e.printStackTrace();  
  28.   
  29.               }  
  30.   
  31.        }  
  32.   
  33. }  

 

SqlMapClient是ibatis运作的核心,所有操作均通过SqlMapClient实例完成。例如:

 

sqlMapper.insert("名称", 参数);

 

sqlMapper提供了众多数据操作方法,下面是一些常用方法的示例,具体说明文档请参见ibatis java doc,或者ibatis官方开发手册。

 

Statement配置:

 

Statement配置包含了数个与SQL Statement相关的节点,分别为:

 

u statement: 最为通用,它可以替代其余的所有节点。

 

u insert

 

u delete

 

u update

 

u select

 

u procedure

 

参数描述:可以是类、基本数据类型和MAP进行传值

 

参数

 

描述

 

parameterClass

 

参数类。指定了参数的完整类名(包括包路径)。

 

可通过别名避免每次重复书写冗长的类名。

 

 

 

resultClass

 

结果类。指定结果类型的完整类名(包括包路径)

 

可通过别名避免每次重复书写冗长的类名。

 

parameterMap

 

参数映射,需结合parameterMap节点对映射关系加以定义。对于存储过程之外的statement而言,

 

建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现也更加出色。

 

 

 

resultMap

 

结果映射,需结合resultMap节点对映射关系加以定义。

 

 

 

cacheModel

 

statement对应的Cache模块。

 

动态映射:

 

[html] view plain copy
  1. <select id="getUsers" parameterClass="user" resultClass="user">  
  2.   
  3. Select id,name,sex from t_user  
  4.   
  5. <dynamic prepend="WHERE">  
  6.   
  7. <isNotEmpty prepend="AND" property="name">  
  8.   
  9. (name like #name#)  
  10.   
  11. </isNotEmpty>  
  12.   
  13. <isNotEmpty prepend="AND" property="address">  
  14.   
  15. (address like #address#)  
  16.   
  17. </isNotEmpty>  
  18.   
  19. </dynamic>  
  20.   
  21. </select>  

 

 

 

Ø 一元判定: 是针对属性值本身的判定,如属性是否为NULL,是否为空值等。

 

一元判定节点有:

 

节点名

 

描述

 

<isPropertyAvailable>

 

参数类中是否提供了此属性

 

 

 

<isNotPropertyAvailable>与<isPropertyAvailable>相反

 

 

 

<isNull>

 

属性值是否为NULL

 

<isNotNull>与<isNull>相反

 

 

 

<isEmpty>

 

如果属性为Collection或者String,其size是否<1,如果非以上两种类型,则通过String.valueOf(属性值)

 

获得其String类型的值后,判断其size是否<1

 

<isNotEmpty>与<isEmpty>相反。

 

 

 

Ø 二元判定

 

二元判定有两个判定参数,一是属性名,而是判定值,如

 

<isGreaterThan prepend="AND" property="age" compareValue="18">(age=#age#)</isGreaterThan>

 

其中,property="age"指定了属性名”age”,compareValue=”18”指明了判定值为”18”。

 

上面判定节点isGreaterThan 对应的语义是:如果age 属性大于18(compareValue),则在SQL中加入(age=#age#)条件。

 

 

 

二元判定节点有:

 

节点名

 

属性值与compareValues的关系

 

<isEqual>相等。

 

<isNotEqual>不等。

 

<isGreaterThan>大于

 

<isGreaterEqual>大于等于

 

<isLessThan>小于

 

<isLessEqual>小于等于

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值