`
隐形的翅膀
  • 浏览: 497052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBatis基础

 
阅读更多
1. iBatis 属于半自动化框架
2. 什么场景应用iBatis
a. 由于安全原因,数据库结构部开发,无法使用Hibernate映射生成
b. 数据库方要求全部用存储过程
c. 系统数据量大,要求我们要用复杂的高效的SQL语句

3. iBatis配置
	<sqlMapConfig>
		<settings
		cacheModelsEnabled="true"			//是否启用SqlMapClient上的缓存机
		enhancementEnabled="true"			//是否针对POJO启用字节码增强机制以提升 getter/setter的调用效能,避免使用Java Reflect所带来的性能开销
		lazyLoadingEnabled="true"			//是否启用延迟加载机制,建议设为"true"
		errorTracingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5"
		useStatementNamespaces="false"
		/>
		
		
		
		<transactionManager type="JDBC">
			<dataSource type="SIMPLE">
				<property name="JDBC.Driver"
	
				value="1"/>
			</dataSource>
		</transactionManager>
		<sqlMap resource="com/ibatis/sample/User.xml"/>
		


JDBC
通过传统JDBC Connection.commit/rollback实现事务支持。
JTA
使用容器提供的JTA服务实现全局事务管理。
EXTERNAL
外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自
动的事务管理机制。此时ibatis 将把所有事务委托给外部容器进行管理。
此外,通过Spring 等轻量级容器实现事务的配置化管理也是一个不错的选
择。关于结合容器实现事务管理,参见“高级特性”中的描述。

</sqlMapConfig>

4.  sql 配置
sqlMap.update("updateUser",user);

	<update id="updateUser"
		parameterClass="user">      //传入的参数的类型
		<![CDATA[                   //避免xml中字符与sql冲突
		UPDATE t_user
		SET
		name=#name#,
		sex=#sex#
		WHERE id = #id#
		]]>
	</update>
	

5. 调用
	XmlSqlMapClientBuilder xmlBuilder = new XmlSqlMapClientBuilder();
	SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
	//sqlMap系统初始化完毕,开始执行update操作
	try{
	sqlMap.startTransaction();
	User user = new User();
	user.setId(new Integer(1));
	user.setName("Erica");
	user.setSex(new Integer(1));
	sqlMap.update("updateUser",user);
	sqlMap.commitTransaction();
	finally{
	sqlMap.endTransaction();
	}
	

6. 传入Map and 其它参数
	<statement id="statementName"
	[parameterClass="some.class.Name"]
	[resultClass="some.class.Name"]
	[parameterMap="nameOfParameterMap"]
	[resultMap="nameOfResultMap"]
	[cacheModel="nameOfCache"]
	>
	select * from t_user where sex = [?|#propertyName#]
	order by [$simpleDynamic$ ]
	</statement>

7. 一对多查询
	<resultMap id="get-user-result" class="user">
	<result property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="sex" column="sex"/>
	
	<result property="addresses" column="id"
	select="User.getAddressByUserId"/>
	
	</resultMap>
	
	<select id="getUsers"
	parameterClass="java.lang.String"
	resultMap="get-user-result">
	<![CDATA[
	select
	id,
	name,
	sex,
	from t_user
	where id = #id#
	]]>
	</select>

1 条本身, 10000条address 记录

如果 t_user 表中记录较少,不会有明显的影响,假设t_user 表中有十万条记录,那
么这样的操作将需要100000+1 条Select语句反复执行才能获得结果,无疑,随着记录
的增长,这样的开销将无法承受。

8.  一对多查询
	<resultMap id="get-user-result" class="user">
	<result property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="sex" column="sex"/>
	<result property="address" column="t_address.address"/>
	<result property="zipCode" column="t_address.zipcode"/>
	</resultMap>
	
	<select id="getUsers"
	parameterClass="java.lang.String"
	resultMap="get-user-result">
	<![CDATA[
	select
	from t_user,t_address
	where t_user.id=t_address.user_id
	]]>
	</select>
	

9. 延迟加载

7的列子, 只有当访问address时才会真正执行

10. 动态查询

不同的查询条件, 形成不同的查询sql
	<select id="getUsers"
	parameterClass="user"
	resultMap="get-user-result">
	
	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>
	

11  事务管理
JDBC, JTA, 外部事务管理

基于 JTA的事务管理机制
JTA提供了跨数据库连接(或其他JTA资源)的事务管理能力。这一点是与JDBC
Transaction最大的差异。

JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC Connection
中实现。事务周期限于Connection的生命周期。同样,对于基于JDBC的ibatis事务管
理机制而言,事务管理在SqlMapClient所依托的JDBC Connection中实现,事务周期限
于SqlMapClient 的生命周期。

JTA事务管理则由JTA容器实现,JTA容器对当前加入事务的众多Connection进
行调度,实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。
同样,对于基于JTA事务的ibatis而言,JTA事务横跨可横跨多个SqlMapClient。

12. Cache

<cacheModel
id="product-cache"
type ="LRU"
readOnly="true"           如数据对象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据库读取数据,构造新的数据对象。
serialize="false">       
</cacheModel>

如果需要全局的数据缓存,CacheModel的serialize属性必须被设为true。否则数据
缓存只对当前Session(可简单理解为当前线程)有效,局部缓存对系统的整体性能提
升有限。
在 serialize="true"的情况下,如果有多个Session同时从Cache 中读取某个
数据对象,Cache 将为每个Session返回一个对象的复本,也就是说,每个Session 将
得到包含相同信息的不同对象实例。因而Session 可以对其从Cache 获得的数据进行
存取而无需担心多线程并发情况下的同步冲突。

Cache Type:
与hibernate类似,ibatis通过缓冲接口的插件式实现,提供了多种Cache的实现机
制可供选择:
1.MEMORY
2.LRU
3.FIFO
4.OSCACHE

13 Memory Cache
	<cacheModel id="user_cache" type="MEMORY">
	<flushInterval hours="24"/>
	<flushOnExecute statement="updateUser"/>
	<property name="reference-type" value="WEAK" />
	</cacheModel>
	

MEMORY 类型的Cache 实现,实际上是通过Java 对象引用进行。ibatis 中,其实现类
为com.ibatis.db.sqlmap.cache.memory.MemoryCacheController,MemoryCacheController 内部,
使用一个HashMap来保存当前需要缓存的数据对象的引用。

reference-type属性可以有以下几种配置:
1. STRONG
即基于传统的Java对象引用机制,除非对Cache显式清空(如到了flushInterval
设定的时间;执行了flushOnExecute所指定的方法;或代码中对Cache执行了清除
操作等),否则引用将被持续保留。
此类型的设定适用于缓存常用的数据对象,或者当前系统内存非常充裕的情况。
2. SOFT
基于SoftReference 的缓存实现,只有JVM 内存不足的时候,才会对缓冲池中的数
据对象进行回收。
此类型的设定适用于系统内存较为充裕,且系统并发量比较稳定的情况。
3. WEAK
基于WeakReference 的缓存实现,当JVM 垃圾回收时,缓存中的数据对象将被JVM
收回。
一般情况下,可以采用WEAK的MEMORY型Cache配置。

14  LRU
LRU型Cache
当Cache达到预先设定的最大容量时,ibatis会按照“最少使用”原则将使用频率最少
的对象从缓冲中清除。
<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel>
可配置的参数有:
u flushInterval
指定了多长时间清除缓存,上例中指定每24小时强行清空缓存区的所有内容。
u size

15. FIFO型Cache
先进先出型缓存,最先放入Cache中的数据将被最先废除。可配置参数与LRU型相同:
<cacheModel id="userCache" type="FIFO">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel>

16. OSCache

在生产部署时,建议采用OSCache,OSCache 是得到了广泛使用的开源Cache 实现
(Hibernate 中也提供了对OSCache 的支持),它基于更加可靠高效的设计,更重要的是,
最新版本的OSCache 已经支持Cache 集群。如果系统需要部署在集群中,或者需要部署在
多机负载均衡模式的环境中以获得性能上的优势,那么OSCache在这里则是不二之选。

17 oscache.properties
	#是否使用内存作为缓存空间
	cache.memory=true
	#缓存管理事件监听器,通过这个监听器可以获知当前Cache 的运行情况
	cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroa
	dcastingListener
	#如果使用磁盘缓存(cache.memory=false),则需要指定磁盘存储接口实现
	#cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.Disk
	PersistenceListener
	# 磁盘缓存所使用的文件存储路径
	# cache.path=c:\\myapp\\cache
	# 缓存调度算法,可选的有LRU,FIFO和无限缓存(UnlimitedCache)	
	
	
	
	# cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache
	# cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache
	cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache
	#内存缓存的最大容量
	cache.capacity=1000
	# 是否限制磁盘缓存的容量
	# cache.unlimited.disk=false
	# 基于JMS的集群缓存同步配置
	#cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory
	#cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic
	#cache.cluster.jms.node.name=node1
	# 基于JAVAGROUP的集群缓存同步配置
	#cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_
	ttl=32;mcast_send_buf_size=150000;mcast_recv_buf_size=80000):PING(timeout
	=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000
	):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.NAKACK(gc_lag=50;retransm
	it_timeout=300,600,1200,2400,4800):pbcast.STABLE(desired_avg_gossip=20000):
	UNICAST(timeout=5000):FRAG(frag_size=8096;down_thread=false;up_thread=fal
	se):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_loc
	al_addr=true)
	#cache.cluster.multicast.ip=231.12.21.132
分享到:
评论

相关推荐

    C# IBatis IBatis基础 完整项目

    【标题】:“C# IBatis IBatis基础 完整项目” 【描述】中提到的是一个基于C#的IBatis学习项目,适用于初学者。IBatis是一个流行的数据访问层框架,它允许开发者将SQL语句与应用程序代码分离,提高了代码的可维护性...

    ibatis基础知识详解

    **Ibatis基础知识详解** Ibatis,全称MyBatis,是一个优秀的开源持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java应用中,Ibatis可以帮助开发者将数据库操作与业务逻辑分离,从而简化开发工作,提高代码...

    ibatis基础项目

    【Ibatis基础项目】是一个旨在帮助开发者熟悉IBM开源的轻量级持久层框架Ibatis的实践项目。这个项目的核心目标是让开发者了解如何在实际开发环境中配置和使用Ibatis,以便进行数据库操作。通过这个小型项目,我们...

    ibatis基础教学文档

    iBATIS 是一个Java开发中的持久化框架,由Clinton Begin创建,现由Apache基金会支持。它主要用于简化JDBC编程,提供一种“半...学习和理解iBATIS的基础知识,可以帮助开发者更高效地构建和维护数据驱动的应用程序。

    ibatis基础教程

    ### iBatis基础教程知识点详解 #### 一、iBatis简介与背景 iBatis是一种流行的开源框架,主要用于在Java应用程序中实现数据库操作。它采用了一种称为映射(Mapping)的技术,允许开发人员将Java对象与SQL语句进行...

    ibatis基础用法

    **标题:“ibatis基础用法”** 在Java Web开发中,iBATIS是一个持久层框架,它提供了一种将SQL语句与Java代码分离的方法,实现了数据访问的灵活性和高效性。iBATIS的主要功能是简化数据库操作,通过XML或注解的方式...

    ibatis常用基础知识

    【ibatis基础知识详解】 Ibatis,作为一个开源的Java持久层框架,主要目的是简化数据库操作,减少繁琐的JDBC代码编写。它将SQL语句与Java代码分离,使得开发者可以更专注于业务逻辑,而不必过于关心数据访问细节。...

    struts2,spring整合及ibatis基础

    ### Struts2、Spring 和 iBatis 的整合 #### 1. Spring 和 iBatis 整合步骤 - **配置 Spring 定义文件**: - 在 `src` 目录下编写 Spring 配置文件,使用 `SqlMapClientFactoryBean` 完成 SqlMapClient 的定义。 ...

    iBatis开发指南和一个iBatis实例

    首先,"iBatis精讲PDF"是理解iBatis基础概念和工作原理的重要资料。iBatis的核心理念是将SQL语句写在XML配置文件中,通过Mapper接口与Java代码交互,实现了SQL与业务逻辑的解耦。在这个PDF中,你可能会了解到如何...

    Ibatis 入门经典 实例

    1. Mybatis-Plus:在 Ibatis 基础上提供了更多的扩展功能,如 CRUD 操作、条件构造器等。 2. Mybatis Generator:自动化代码生成工具,自动生成 Entity、Mapper 和 XML 文件,提高开发效率。 通过以上内容,你将对 ...

    iBatis文档\ibatis.doc

    #### 构建 iBatis 基础代码 创建一个`SqlMapConfig.xml`配置文件,其中包含了数据库连接信息、SqlMapClient的配置以及数据源设置。此外,你还需要为每个数据库操作创建单独的XML文件(例如:`User.xml`),这些文件...

    IBATIS_IN_ACTION

    ### iBATIS基础 - **安装与配置**:了解如何在项目中集成iBATIS,设置数据源,配置SQL映射文件等基本步骤。 - **使用映射语句**:掌握如何定义和使用SQL映射语句,包括参数传递、结果映射等关键概念。 - **非查询...

    关于ibatis的基础教程

    **Ibatis基础教程** Ibatis,全称MyBatis,是一个优秀的开源Java持久层框架,它专注于SQL映射,使得开发者能够将精力集中在编写SQL上,而无需关注JDBC的繁琐工作。Ibatis的主要目标是简化Java应用与数据库之间的...

    ibatis基础案例

    关于ibatis的基础教程&lt;properties resource="it/ibatis/SqlMap.properties"/&gt; ${driver}" /&gt; ${url}" /&gt; ${username}" /&gt; ${password}" /&gt; &lt;/transactionManager&gt;

    ibatis实战之基础环境搭建(源码).zip

    在本教程中,我们将深入探讨如何搭建用于实战的iBatis基础环境,同时结合源码进行学习。iBatis是一个优秀的、开源的SQL映射框架,它能够将Java应用程序中的数据库操作与SQL语句分离,使得开发人员可以更加专注于业务...

    iBATIS 2.0 开发指南

    - **构建 iBATIS 基础代码**:这部分介绍了如何创建基本的 iBATIS 配置文件(通常为 XML 文件),并设置数据库连接参数。还包括了如何定义 SQL 映射语句的基础知识。 - **定义数据源**:通过配置文件指定数据库类型...

Global site tag (gtag.js) - Google Analytics