相对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配置文件:
- <?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 //-------------------------(1)
- cacheModelsEnabled="true"
- enhancementEnabled="true"
- lazyLoadingEnabled="true"
- errorTracingEnabled="true"
- maxRequests="32"
- maxSessions="10"
- maxTransactions="5"
- useStatementNamespaces="false"
- />
- <transactionManager type="JDBC"> //-----------------------(2)
- <dataSource type="SIMPLE"> //-------------------------(3)
- <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"/> //-------------------(4)
- <sqlMap resource="com/ibatis/sample/Address.xml"/>
- </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配置
- <transactionManager type="JDBC" >
- <dataSource type="JNDI">
- <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>
- </dataSource>
- </transactionManager>
- <transactionManager type="JTA" >
- <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
- <dataSource type="JNDI">
- <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>
- </dataSource>
- </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方法
如何读取配置文件:
- public class SQLMapper {
- public static SqlMapClient sqlMapper;
- static{
- String resource = "org/lzp/xml/SqlMapConfig.xml";指明了配置文件的相对路径
- try {
- Reader reader = Resources.getResourceAsReader(resource);
- //ibatis2.0
- /* XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
- sqlMapper = xmlBuilder.buildSqlMap(reader);
- */
- //ibatis1.0
- sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
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模块。
动态映射:
- <select id="getUsers" parameterClass="user" resultClass="user">
- Select id,name,sex from t_user
- <dynamic prepend="WHERE">
- <isNotEmpty prepend="AND" property="name">
- (name like #name#)
- </isNotEmpty>
- <isNotEmpty prepend="AND" property="address">
- (address like #address#)
- </isNotEmpty>
- </dynamic>
- </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>小于等于
相关推荐
### ibatis配置文件详解 #### 一、ibatis概述 ibatis,又称MyBatis,是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。ibatis可以...
标题:ibatis教程 输入参数详解 描述:ibatis教程 输入参数详解 ibatis快速入门 标签:ibatis list 部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用...
**Ibatis基础知识详解** Ibatis,全称MyBatis,是一个优秀的开源持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java应用中,Ibatis可以帮助开发者将数据库操作与业务逻辑分离,从而简化开发工作,提高代码...
### ibatis配置文件、映射文件详解 #### 1. SQL Map Config 文件详解 在ibatis框架中,`sqlMapConfig.xml`是一个非常重要的配置文件,它主要用于设置ibatis的全局配置信息,包括数据库连接信息、环境配置以及其它...
#### 二、ibatis配置文件详解 ibatis的配置文件主要包括三部分:`SqlMap.properties`、`SqlMapConfig.xml` 和 `Student.xml`。下面将分别对这三个文件进行详细介绍。 ##### 1. SqlMap.properties 文件 `SqlMap....
在本篇文章中,我们将深入探讨Ibatis的配置及其相关知识点。 首先,Ibatis的核心是SqlSessionFactory,它是通过SqlSessionFactoryBuilder创建的。SqlSessionFactoryBuilder从配置源(XML或Java Config)读取信息,...
1. `<properties>`元素可以引用外部的属性文件,如`database.properties`,这样可以在SQL映射文件中使用`${}`占位符引用这些属性,以实现参数化配置。例如,数据库连接信息可以在属性文件中定义,然后在SQL语句中...
《iBatis配置与映射文件详解》 iBatis,作为一个轻量级的持久层框架,以其灵活的SQL映射和良好的数据库交互性深受开发者喜爱。本文将深入解析iBatis的核心配置文件`sqlMapConfig.xml`,以及映射文件的使用方法,...
`sqlMapConfig.xml`是iBATIS的全局配置文件,它包含了所有iBATIS运行时的设置,如数据源、事务管理器、缓存配置等。让我们逐一解析其主要元素: 1. **根节点 `<sqlMapConfig>`**: - 这个节点是配置文件的起点,...
### Ibatis配置详解 1. **全局配置文件(ibatis-config.xml)** 全局配置文件是Ibatis系统的起点,它包含了数据源、事务管理器、插件、类型别名等整体设置。例如: ```xml <!DOCTYPE configuration PUBLIC "-/...
### Spring与iBatis整合详解 #### 一、前言 在Java企业级应用开发中,Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力深受开发者喜爱,而iBatis(现更名为MyBatis)作为一款优秀的持久层框架,通过...
### ibatis配置文件详解 #### 一、引言 在Java开发领域中,持久层框架是连接业务逻辑层与数据库的重要桥梁。ibatis(现已更名为MyBatis)作为一款优秀的持久层框架,提供了灵活的数据访问层支持。本文将对ibatis的...
iBATIS-SqlMaps详解是Java开发中一个重要的知识点,尤其对于那些致力于后端开发的程序员来说,掌握iBATIS框架及其SqlMap配置是至关重要的。iBATIS是一款优秀的持久层框架,它将SQL与Java代码分离,使得数据库操作变...
在XML文件中,可以定义查询、插入、更新和删除等不同类型的SQL语句,同时配置参数映射和结果集映射,确保数据的正确绑定和转换。 在《iBATIS-SqlMaps详解》中,读者将了解到如何创建和管理SQL Maps,包括: 1. **...
在Ibatis配置文件中,`sqlMapConfig`是Ibatis的全局配置,它引用了具体的SQL映射文件。`sqlMap`元素指定了资源路径,即`Ibatis.xml`,这个文件包含了SQL语句的定义。 `Ibatis.xml`是Ibatis的SQL映射文件,它是...
**IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...