转:IBATIS配置简介,看完基本上会了ibatis-飞外

iBatis其实不是个真正意义上的OR-Mapping, 只能称为是个OSQL-Mapping吧,我们开发人员还是要自己写SQL,不过这个我比较喜欢,我们可以控制的更多,更灵活。不像Hibernate那么死板。
iBatis将Java对象(大多是我们的Java Bean)映射成JDBC的PreparedStatement的输入参数和ResultSet。个人认为主要就是将我的的Java对象映射到SQL的参数和将SQL的查询结果转换为Java对象。

下面说说我学习iBATIS SQL Maps开发指南的一些收获吧。

(1) SQL Map XML 配置文件 SqlMapConfig.xml的深刻认识。

setting 元素,这个以前自己没有接触过,最学习到了,想和大家分享一下。 setting 元素用于配置和优化SqlMapClient实例。 setting 元素本身及其所有的属性都是可选的,子元素如下:

maxRequests 同时执行SQL语句的最大线程数,通常至少是maxTransactions的10倍,默认值是512。
maxSessions 同时活动的最大session数。应该小于maxRequests,并大于或等于maxTransactions,默认128。
maxTransactions 同时进入sqlMapClient.startTransaction()的最大线程数,默认32。
cacheModelsEnabled 全局性地启用或禁止SqlMapClient的所有缓存model,默认true。调试程序时使用。
lazyLoadingEnabled 全局性地启用或禁用SqlMapClient的所有延迟加载,默认true。调试程序时使用。
enhancementEnabled 全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能,同时优化延迟加载的性能,默认false。

useStatementNamespaces 如果启用本属性,必须使用全限定名来引用 mapped statement。Mapped statement的全限定名由sql-map的名称和mapped-statement的名称组成,sql-map.mapped-statement。

(2) iBatis事务,可能用Spring AOP的声明式事务,我不用去管理iBatis的事务,交给Spring去管理了。但了解它还是不错的。 transactionManager 元素定义SQL MAP的事务管理服务。属性type指定所使用的事务管理器类型。
JDBC: 让JDBC管理事务,也就是使用通常的commit(), rollback()方法。
JTA: JTA本地事务管理器使用一个JTA全局事务。
EXTERNAL: 自己管理事务。

(3) 在SQL Map XML映射文件件中配置缓存,以前自己没接触这个,所以学习到了,感觉还是很兴奋地,呵呵。


cacheModel readOnly="true" serialize="false" !-之都缓存,采用LRU置换算法- flushInterval hours="24"/ flushOnExecute statement="insertProduct"/ flushOnExecute statement="updateProduct"/ !-更新的时候刷新缓存- flushOnExecute statement="deleteProduct"/ property / /cacheModel !--利用缓存-- staement cacheModel="productCache" parameter SELECT * FROM product WHERE prd_cat_id = #value# /statement /sqlMap

缓存分为制度缓存和读写缓存,读写缓存又分为Serializable可读写缓存和非Serializable可读写缓存,者两个还没弄打明白。
缓存类型分为:
MEMORY MEMORY cache实现使用reference类型来管理cache的行为。适于没有统一的对象重用模式的应用,或内存不足的到应用。
LRU LRU cache实现使用"近期最少使用"原则来确定如何从cache中清除对象。对于在较长的时期内,某些用户经常使用的某些特定对象的情况,LRU cache是个不错的选择。
FIFO FIFO cache实现使用"先进先出"的原则来确定如何从cache中清除对象。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFO cache是个不错的选择。
OSCache 利用OSCache缓存插件。

(4) Parameter Map和Result Map
利用这两个Map我们可以控制更多的东西,利用nullValue我们可以指定NULL的替换值,这个对Java Bean的简单类型的属性很有用,但强烈要求Java Bean用类类型。

(5) 返回自动生成的主键
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map 通过 insert 的子元素 selectKey 来支持自动生成的键值。
它同时支持预生成(如Oracle)和后生成两种类型(如 MySQL)。 下面是两个例子: !


(6) iBatis调用存储过程
SQL Map通过 procedure 元素支持存储过程。
下面给出调用存储过程的一个例子


parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="inout"/ parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="inout"/ /parameterMap

注意!!!要确保始终只使用JDBC标准的存储过程语法。

(6) iBatis对象关联解决方案(复杂类型属性),同样可以实现Hibernate的对象关联。
查询 (select)
PaginatedList list =
sqlMap.queryForPaginatedList (“getProductList”, null , 10 );
list.nextPage();
list.previousPage();


// 例9: 基于Map的批量查询 (select)
sqlMap.startTransaction();
Mapmap = sqlMap.queryForMap (“getProductList”, null , “productCode”);
sqlMap.commitTransaction();
Product p = (Product)map.get(“EST - 93 ”);

/************************************************************************/
主要是sqlMapConfig.xml: ?xml version="1.0" encoding="UTF-8" ?  !DOCTYPE sqlMapConfig (View Source for full doctype...) - sqlMapConfig - !-- Configure a built-in transaction manager. If you're using an  app server, you probably want to use its transaction manager  and a managed datasource - transactionManager  commitRequired="false" - dataSource   property   /  property   /  property   /  property   /  /dataSource  /transactionManager - !-- List the SQL Map XML files. They can be loaded from the  classpath, as they are here (com.domain.data...)  sqlMap resource="com/mydomain/data/Account.xml" / - !-- List more here... sqlMap resource="com/mydomain/data/Order.xml"/  sqlMap resource="com/mydomain/data/Documents.xml"/  /sqlMapConfig 以及sql的映射问价,如Account.xml的文件内容: ?xml version="1.0" encoding="UTF-8" ?  !DOCTYPE sqlMap (View Source for full doctype...) - sqlMap namespace="Account" - !-- Use type aliases to avoid typing the full classname every time.  typeAlias alias="Account"  / - !-- Result maps describe the mapping between the columns returned from a query, and the class properties. A result map isn't necessary if the columns (or aliases) match to the properties  exactly. - resultMap   result property="id" column="ACC_ID" /  result property="firstName" column="ACC_FIRST_NAME" /  result property="lastName" column="ACC_LAST_NAME" /  result property="emailAddress" column="ACC_EMAIL" /  /resultMap - !-- Select with no parameters using the result map for Account class.  select  resultMap="AccountResult" select * from ACCOUNT /select - !-- A simpler select example without the result map. Note the  aliases to match the properties of the target result class.  select  parameter result select ACC_ID as id, ACC_FIRST_NAME as firstName, ACC_LAST_NAME as lastName, ACC_EMAIL as emailAddress from ACCOUNT where ACC_ID = #id# /select - !-- Insert example, using the Account parameter class  insert  parameter insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL values ( #id#, #firstName#, #lastName#, #emailAddress# ) /insert - !-- Update example, using the Account parameter class  update  parameter update ACCOUNT set ACC_FIRST_NAME = #firstName#, ACC_LAST_NAME = #lastName#, ACC_EMAIL = #emailAddress# where ACC_ID = #id# /update - !-- Delete example, using an integer as the parameter class  delete  parameter delete from ACCOUNT where ACC_ID = #id# /delete  /sqlMap