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