半自动化的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>
分享到:
相关推荐
1.iBatis2学习笔记:基本原理和配置.doc 2.iBatis2学习笔记:与Spring2的整合.doc 3.iBatis2学习笔记:单表映射 .doc 4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc ...
ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记 ibatis学习笔记
IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得IBatis学习笔记以及使用心得
iBATIS 是一款著名的Java持久层框架,它与Hibernate等全自动化ORM解决方案不同,提供了一种半自动化的处理方式,让开发者对SQL拥有更大的控制权。在iBATIS中,主要包括SQL Maps和Data Access Objects(DAO)两个核心...
本练习Demo和笔记旨在帮助初学者快速掌握Ibatis的基本用法和核心概念。 【Ibatis 的主要组件】 1. **SqlSessionFactoryBuilder**:构建SqlSessionFactory的工具类,通常在应用启动时创建一次。 2. **...
### iBatis 学习笔记知识点总结 #### 一、iBatis 概念与特点 **1.1 iBatis 定义** - **iBatis** 是一个基于 Java 的开源持久层框架,它专注于 SQL 映射,提供了一种将对象与数据库交互过程中的 SQL 语句进行分离的...
这篇“ibatis学习笔记(一)”可能是博主对Ibatis基础概念、安装配置以及基本使用的介绍,让我们通过标签“源码”和“工具”来深入探讨Ibatis的相关知识。 首先,Ibatis是一个轻量级的Java ORM(对象关系映射)框架...
通过本文的学习笔记,我们可以了解到 iBatis 在简化数据库访问的同时提供了足够的灵活性。尽管 iBatis 相比 Hibernate 在自动化程度上略显不足,但对于需要高度定制 SQL 查询的场景来说,iBatis 的优势十分明显。...
### ibatis教程学习笔记 #### 一、ibatis简介与特点 ibatis 是一个基于 Java 的持久层框架,它提供了一种将 SQL 映射到 Java 对象的方式,简化了 JDBC 的复杂操作。ibatis 通过 XML 配置文件或者注解的形式来描述 ...
这个压缩包集合了Ibatis的学习笔记、文档和相关资源,为想要深入理解和掌握Ibatis的人提供了一站式的自学材料。 Ibatis的核心概念是SQL Mapping,它允许开发者将SQL语句直接写在XML配置文件中,或者使用注解方式,...
### IBATIS学习笔记知识点详解 #### 一、IBATIS简介 iBatis是一个用于Java的数据持久化框架,类似于Hibernate、JDO和EJB等技术。它的主要特点是将对象映射为SQL语句,这使得开发人员可以更加灵活地控制SQL的执行,...
Ibatis 是一款轻量级的Java持久层框架,它与Hibernate等ORM框架不同,Ibatis 提供了更加灵活的SQL映射机制,允许开发者直接编写自定义的SQL语句,而不像Hibernate那样进行全封装。这种设计使得Ibatis在处理复杂的SQL...
根据提供的标题、描述、标签及部分内容,我们可以整理出与ibatis相关的知识点,下面将详细解释这些知识点。 ### ibatis简介 ibatis是一个基于Java的持久层框架,它可以帮助开发者更轻松地实现对象关系映射(ORM)...