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配置

ibatis配置文件:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE sqlMapConfig
 3 PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
 4 "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
 5 <sqlMapConfig>
 6 <settings ⑴
 7 cacheModelsEnabled="true"
 8 enhancementEnabled="true"
 9 lazyLoadingEnabled="true"
10 errorTracingEnabled="true"
11 maxRequests="32"
12 maxSessions="10"
13 maxTransactions="5"
14 useStatementNamespaces="false"/>
15 <transactionManager type="JDBC"> ⑵
16 <dataSource type="SIMPLE"> ⑶
17 <property name="JDBC.Driver" value="com.p6spy.engine.spy.P6SpyDriver"/>
18 <property name="JDBC.ConnectionURL"value="jdbc:mysql://localhost/sample"/>
19 <property name="JDBC.Username" value="user"/>
20 <property name="JDBC.Password" value="mypass"/>
21 <property name="Pool.MaximumActiveConnections" value="10"/>
22 <property name="Pool.MaximumIdleConnections" value="5"/>
23 <property name="Pool.MaximumCheckoutTime" value="120000"/>
24 <property name="Pool.TimeToWait" value="500"/>
25 <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>
26 <property name="Pool.PingEnabled" value="false"/>
27 <property name="Pool.PingConnectionsOlderThan" value="1"/>
28 <property name="Pool.PingConnectionsNotUsedFor" value="1"/>
29 </dataSource>
30 </transactionManager>
31 <sqlMap resource="com/ibatis/sample/User.xml"/> ⑷
32 <sqlMap resource="com/ibatis/sample/Address.xml"/>
33 </sqlMapConfig> 

Settings 节点

    


参数

描述

cacheModelsEnabled

是否启用SqlMapClient上的缓存机制。

建议设为"true"


enhancementEnabled

是否针对POJO启用字节码增强机制以提升

getter/setter的调用效能,避免使用Java

Reflect所带来的性能开销。

同时,这也为Lazy Loading带来了极大的性能

提升。

建议设为"true"


errorTracingEnabled

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

以方便调试


lazyLoadingEnabled

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

maxRequests

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

maxTransactions

最大并发事务数

maxSessions

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

maxSessions设定必须介于

maxTransactions和maxRequests之间,即

maxTransactions<maxSessions=<

maxRequests


useStatementNamespaces

是否使用Statement命名空间。

这里的命名空间指的是映射文件中,sqlMap节点

的namespace属性,如在上例中针对t_user

表的映射文件sqlMap节点:

<sqlMap namespace="User">

这里,指定了此sqlMap节点下定义的操作均从

属于"User"命名空间。

在useStatementNamespaces="true"的情

况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",use

r);

否则直接通过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。

2 DBCP:

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

  com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

3  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.MaximumActiveConn

ections


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

Pool.MaximumIdleConnec

tions


数据库连接池中允许的挂起(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配置

    

1 <transactionManager type="JDBC" >
2   <dataSource type="JNDI">
3     <property name="DataSource"
4            value="java:comp/env/jdbc/myDataSource"/>
5     </dataSource>
6 </transactionManager>
1 <transactionManager type="JTA" >
2 <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
3 <dataSource type="JNDI">
4 <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>
5 </dataSource>
6 </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:有gettersetter方法

如何读取配置文件:

  

 1 public class SQLMapper {
 2        public static SqlMapClient sqlMapper;
 3        static{
 4               String resource = "org/lzp/xml/SqlMapConfig.xml";指明了配置文件的相对路径
 5               try {
 6                      Reader reader = Resources.getResourceAsReader(resource);
 7            //ibatis2.0
 8            /* XmlSqlMapClientBuilder xmlBuilder =
 9               new XmlSqlMapClientBuilder();
10               sqlMapper = xmlBuilder.buildSqlMap(reader);
11            */
12            //ibatis1.0
13                      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
14               } catch (Exception e) {
15                      e.printStackTrace();
16               }
17        }
18 } 

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模块。

动态映射:

 1 <select id="getUsers" parameterClass="user" resultClass="user">
 2    Select id,name,sex from t_user
 3 <dynamic prepend="WHERE">
 4 <isNotEmpty prepend="AND" property="name">
 5    (name like #name#)
 6 </isNotEmpty>
 7 <isNotEmpty prepend="AND" property="address">
 8    (address like #address#)
 9 </isNotEmpty>
10 </dynamic>
11 </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>

小于等于
时间: 2024-08-28 09:19:35

Ibatis的简单介绍的相关文章

Spring学习笔记一(Spring简单介绍)

1.前言 从今天起开始写几篇关于Spring的文章,来总结一下,近来的学习情况,也想与大家分享一下学习Spring的心得和体会.希望大家能够多多指正.  2.Spring简单介绍 上图是有关Spring的整个架构图,从图中我们可以看出,Spring主要包括AOP.数据访问,WEB访问等几大块内容. Spring是一个基于JAVA的轻量级J2EE的应用框架. 那么Spring能干什么呢?目前我们看到市面上有很多的框架,比如Struts2+Spring.Spring+Servlet.Spring+i

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通

javascript的return语句简单介绍

javascript的return语句简单介绍:return语句在js中非常的重要,不仅仅具有返回函数值的功能,还具有一些特殊的用法,有个清晰的把握是非常有必要的.下面就结合实例简单介绍一下return语句的作用.一.用来返回控制和函数结果:通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数.语法格式: return 表达式 代码实例如下: function add(){

Object-c集合的简单介绍

一.简单介绍 NSArray/NSMutableArray NSSet/NSMutableSet NSDictionary/NSMutableDictionary NSArray.NSSet.NSDictionary是不可变的,创建的时候初始化 NSMutableArray.NSMutableSet.NSMutableDictionary是可变的 二.使用介绍 NSArray是有序的数组 NSMutableArray *myArray=[[NSMutableArray alloc] init];

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

CSS之box-sizing的用处简单介绍

前几天才发现有 box-sizing 这么个样式属性,研究了一番感觉很有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 例如:当一个容器宽度定义为 width:100%;  之后,如果再增加 padding 或者 border 则会溢出父容器,是向外扩张的 如果使用该样式,指定为 box-sizing: border-box; 则 padding 和 border 就不会再溢出,而是向内收缩的,这个效果感觉非常实用, 特别是 input 和 textarea 等 现在设置 100% 再直

【玩转微信公众平台之七】 PHP语法简单介绍

经过多篇的努力,我们终于成为了微信公众平台的开发者.但是别高兴的太早,就跟修真小说一样:修炼多年武破虚空,飞升到仙界后本以为成为了天仙即可跳出三界外,不在五行中.可实际到了仙界才发现,成仙只是修行的第一步......没错,成为开发者也才只是第一步,因为现在你的微信公众平台还没有任何功能,说难听点就是小白,说好听点就是白马王子,说可爱点就是小白白,说黄色点就是洗白白,说...----------------要想在微信公众平台添加功能,那就需要写代码:既然说到写代码,那么肯定是要用php(如果用AS

Zookeeper简单介绍

转自:ZooKeeper学习第一期---Zookeeper简单介绍 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误解.如果这些进程全部是跑在一台机上的

七、变量与常量的简单介绍

七.变量与常量的简单介绍 本文将介绍VB语言中的变量与常量. 基本概念 首先大家要明白变量和常量是很重要的东西,因为他们储存着程序运行中的各种数据.顾名思义,变量就是可以变的量,而常量就是不变的,这个概念和数学上的有点接近. 接下来我简单讲讲这两个重要的东西:计算机程序在不运行的时候,程序文件保存在硬盘上,当用户运行程序之后,系统就会把程序文件装进计算机的内存里面,无论在硬盘中还是内存中,程序数据都是以二进制的形式保存着的.当程序在运行的时候,可以把计算机的内存理解为一个超级大的棋盘,每个格子都