半自动化的ibatis
ibatis并不会为程序员在运行期自动生成sql执行。具体的sql需要程序员编写,然后通过映射配置文件,将sql所需的参数,以及返回的结果字段映射到指定的pojo。
使用ibatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的java对象,这一层与通过hibernate实现orm而言基本一致,而对于具体的数据操作,hibernate会自动生成sql语句,而ibatis则要求开发者编写具体的sql语句。
ibatis采用了apache common_logging,并结合了log4j作为日志输出组件。在classpath新建log4j.properties
xml 代码
- log4j.rootLogger=DEBUG, stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
- log4j.logger.java.sql.PreparedStatement=DEBUG
SqlMapConfig.xml代码
xml 代码
- xml version="1.0" encoding="UTF-8" ?>
-
- PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
- "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
- <sqlMapConfig>
- <settings cacheModelsEnabled="true" //是否启用SqlMapClient上的缓存机制。建议true
- enhancementEnabled="true" //是否针对pojo启用字节码增强机制以提升getter/setter的调用性能,避免使用
-
- //reflect的性能开销,同时也为lazy loading带来了极大的性能提升。
- lazyLoadingEnabled="true" //延迟加载
- errorTracingEnabled="true" //是否启用错误日志
- maxRequests="32" //最大请求并发数(statement并发数)
- maxSessions="10" //最大的sqlmapclient数。介于>maxtransactions和<=maxrequests之间
- maxTransactions="5" //最大并发事务数
- useStatementNamespaces="false" /> //是否使用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 type="JDBC">
- <dataSource type="SIMPLE">
- <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
- <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:8080/sample" />
- <property name="JDBC.Username" value="root" />
- <property name="JDBC.Password" value="123456" />
- <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/hengji/sql/User.xml" />
- <!---->sqlMapConfig>
transactionManager节点定义了事务管理器,目前提供两种:
jdbc
jta
external外部事务管理,spring等
dataSource:
type(simple/dbcp/jndi)
xml 代码
- <transactionManager type="JDBC" >
- <dataSource type="JNDI">
- <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>
- <!---->dataSource>
- <!---->transactionManager>
xml 代码
- <typeAlias alias="user" type="com.ibatis.sample.User"/>
- <cacheModel id="userCache" type="LRU">
- <flushInterval hours="24"/> //设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
- <flushOnExecute statement=" updateUser"/> //指定执行特定Statement时,将缓存清空。
- <property name="size" value="1000" /> //本CacheModel中最大容纳的数据对象数量。
- <!---->cacheModel>
typeAlias定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过
typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",
这样在本配置文件的其他部分,需要引用"com.ibatis.sample.User"类时,只需以其别名替代即可。
这里申明了一个名为"userCache"的cacheModel,之后可以在
Statement申明中对其进行引用:
xml 代码
- <select id="getUser"
- parameterClass="java.lang.String"
- resultClass="user"
- cacheModel="userCache"
- >
-------------------------------------------
ibatis高级特性
1,一对多关联
xml 代码
- <sqlMap namespace="User">
- <typeAlias alias="user" type="com.ibatis.sample.User"/>
- <typeAlias alias="address" type="com.ibatis.sample.Address"/>
- <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>
- <select id="getAddressByUserId"
- parameterClass="int"
- resultClass="address">
- <![CDATA[
- select
- address,
- zipcode
- from t_address
- where user_id = #userid#
- ]]>
- </select>
- </sqlMap>
这里通过在resultMap 中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。
实际上,这种方式类似于前面所说的通过两条单独的Statement 进行关联数据的读
取,只是将关联关系在配置中加以描述,由ibatis自动完成关联数据的读取。
如果t_user 表中记录较少,不会有明显的影响,假设t_user 表中有十万条记录,那
么这样的操作将需要100000+1 条Select语句反复执行才能获得结果,无疑,随着记录
的增长,这样的开销将无法承受。
延迟加载
Settings 节点有两个与延迟加载相关的属性lazyLoadingEnabled 和
enhancementEnabled,其中lazyLoadingEnabled设定了系统是否使用延迟加载
机制,enhancementEnabled设定是否启用字节码强化机制(通过字节码强化机制可
以为Lazy Loading带来性能方面的改进。
xml 代码
- <dynamic prepend="WHERE">
- <isNotEmpty prepend="AND" property="name">
- (name like #name#)
- </isNotEmpty>
- <isNotEmpty prepend="AND" property="address">
- (address like #address#)
- </isNotEmpty>
- </dynamic>
通过dynamic 节点,我们定义了一个动态的WHERE 子句。此WHERE 子句中将
可能包含两个针对name 和address 字段的判断条件。而这两个字段是否加入检索取决
于用户所提供的查询条件(字段是否为空[isNotEmpty])。
事务处理:
java 代码
- sqlMap = xmlBuilder.buildSqlMap(reader);
- sqlMap.startTransaction();
- User user = new User();
- user.setId(new Integer(1));
- user.setName("Erica");
- user.setSex(new Integer(0));
- sqlMap.update("User.updateUser", user);
- sqlMap.commitTransaction();
-
- sqlMap.endTransaction();
cache应用:
cache几个重要属性
1.readonly
readOnly值的是缓存中的数据对象是否只读。这里的只读并不是意味着数据对象一
旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对
象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据
库读取数据,构造新的数据对象。
而readOnly="false"则意味着缓存中的数据对象可更新,如user 对象的name
属性发生改变。
只读Cache能提供更高的读取性能,但一旦数据发生改变,则效率降低。系统设计
时需根据系统的实际情况(数据发生更新的概率有多大)来决定Cache的读写策略。
2.serialize
如果需要全局的数据缓存,CacheModel的serialize属性必须被设为true。否则数据
缓存只对当前Session(可简单理解为当前线程)有效,局部缓存对系统的整体性能提
升有限。
在serialize="true"的情况下,如果有多个Session同时从Cache 中读取某个
数据对象,Cache 将为每个Session返回一个对象的复本,也就是说,每个Session 将
得到包含相同信息的不同对象实例。因而Session 可以对其从Cache 获得的数据进行
存取而无需担心多线程并发情况下的同步冲突。
3.type
在生产部署时,建议采用OSCache,OSCache 是得到了广泛使用的开源Cache 实现
(Hibernate 中也提供了对OSCache 的支持),它基于更加可靠高效的设计,更重要的是,
最新版本的OSCache 已经支持Cache 集群。如果系统需要部署在集群中,或者需要部署在
多机负载均衡模式的环境中以获得性能上的优势,那么OSCache在这里则是不二之选。
xml 代码
- <cacheModel id="userCache" type="OSCACHE">
- <flushInterval hours="24"/>
- <flushOnExecute statement="updateUser"/>
- <property name="size" value="1000" />
- </cacheModel>
分享到:
相关推荐
通过阅读《iBATIS学习笔记.doc》和《iBATIS-SqlMaps-2_cn.pdf》,你将能够全面掌握iBATIS的基础知识,理解其实现原理,并具备使用iBATIS进行数据库操作的能力。这份资料集不仅适合初学者入门,也对有一定经验的...
《深入理解iBatis:一个全面的学习指南》 在当今的软件开发中,数据库操作是不可或缺的一部分。iBatis,作为一个轻量级的持久层框架,因其灵活性和易用性,受到了广大开发者们的喜爱。本篇文章将围绕iBatis的学习...
《深入理解iBatis:一个全面的学习指南》 iBatis,作为一个优秀的持久层框架,为Java开发者提供了灵活的数据访问接口,将SQL语句与Java代码分离,使得数据库操作更加简洁、高效。本文将深入探讨iBatis的核心概念、...
3. **ibatis 开发指南.pdf**:这份指南可能涵盖了iBATIS的完整开发流程,从安装到使用,再到高级特性,如缓存、事务控制等。 4. **Struts2.0+Spring+Ibatis讲义-20110304.ppt**:可能是一个教学或研讨会的幻灯片,...
而"MyBatis+3+User+Guide+Simplified+Chinese.pdf"是MyBatis 3的中文用户指南,可以帮助理解如何使用iBatis进行数据库操作。"复件 springibatis"可能是关于Spring和iBatis集成的文档或代码资源。 总的来说,Struts2...
Freemaker_入门+深入+开发指南+学习笔记.doc FreeMarker标签中文文档.pdf FreeMarker教程.pdf ibatis开发指南(中文版).pdf java web标签大全.CHM jBPM_4.4_开发指南.pdf jquery1.7 中文手册.chm lucene3.0-api.CHM...
该指南可能详细介绍了如何配置iBatis,使用动态SQL,处理结果集,以及如何在项目中集成和使用iBatis,帮助开发者提高数据库操作的效率和灵活性。 通过学习这些资源,无论是Java初学者还是有经验的开发者,都能从中...
这可能是一位开发者的学习笔记,记录了他在使用MyBatis过程中的一些关键点、技巧或问题解决方案,阅读这些笔记能从实战角度深入理解MyBatis的使用。 6. **最全面的JS表单验证.doc** 虽然不是直接关于MyBatis的,...
AppFuse 是一个开源项目,旨在加速和简化J2EE应用程序的开发流程。由Matt Raible设计,它作为一...通过深入阅读和实践AppFuse的学习笔记,开发者可以逐步掌握其核心功能,并将其应用到实际项目中,提升开发质量和效率。
AppFuse提供了从旧版本到新版本的迁移指南,包括从2.0到2.0.1再到2.0.2的版本更新笔记,以及在不同版本间迁移时可能遇到的问题和解决方案。 综上所述,AppFuse 2.0.2不仅是一个框架,更是一套完整的Web应用开发解决...
7. **文档**:"doc"目录下的文件可能是项目相关的API文档、用户指南或开发者笔记,为理解项目提供了辅助信息。 总的来说,jpetstore-3-1-1是一个极好的实践平台,对于想要学习Java EE、MVC架构、Struts框架以及...
此外,本文还将提供关于JPetStore 5.0版本的基本设置指南。 #### 二、环境搭建与配置步骤 **1. 下载与解压** 首先,从官方站点下载JPetStore 5.0源码包:[ibatis.apache.org](http://ibatis.apache.org/)。解压到...