读书人

iBatis配备详解

发布时间: 2012-07-26 12:01:08 作者: rapoo

iBatis配置详解

<! DOCTYPE sqlMapConfig?
????? PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0/?
????? "http://www.ibatis.com/dtd/sql-map-config-2.dt?

<sqlMapConfig >?

???? < settings?
?????? cacheModelsEnabled ="true"??????
????? enhancementEnabled ="true"??????
????? lazyLoadingEnabled ="true"??????
????? errorTracingEnabled ="true"??????
????? maxRequests ="32"???????????
????? maxSessions ="10"???????????
????? maxTransactions ="5"??????????
????? useStatementNamespaces ="false"????
?????? />?

???? < transactionManager??? type ="JDBC" >?

???? < dataSource??? type ="SIMPLE" >?
???????? < property??? name ="JDBC.Driver"??? value ="com.p6spy.engine.spy.P6SpyDriver" />?
???????? < property??? name ="JDBC.ConnectionURL"??? value ="jdbc:mysql://localhost/sample" />?
???????? < property??? name ="JDBC.Username"??? value ="user" />?
???????? < property??? name ="JDBC.Password"??? value ="mypass" />?
???????? < 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/ibatis/sample/User.xml" />?

</ sqlMapConfig >???


⑴ Settings 节点?

cacheModelsEnabled?
是否启用SqlMapClient上的缓存机制。 建议设为"true"?

enhancementEnabled?
是否针对POJO启用字节码增强机getter/setter的调用效能,避免Reflect所带来的性能开销。同时,这也为Lazy Loading带来提升。 建议设为"true"?

errorTracingEnabled?
是否启用错误日志,在开发期间建议设为"true" 以方便调试?

lazyLoadingEnabled?
是否启用延迟加载机制,建议设为"true"?

maxRequests?
最大并发请求数(Statement并发数)?

maxTransactions?
最大并发事务数?

maxSessions??? 最大Session数。即当前最大允许的并发SqlMapClient数。?

useStatementNamespaces?
是否使用Statement命名空间。?
这里的命名空间指的是映射文件中,sqlMap节的namespace属性,如在上例中针对t_use?
表的映射文件sqlMap节点: <sqlMap namespace="User"> 这里,指定了此sqlMap节点下定义的操作均属于"User"命名空间。在useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",user);?
否则直接通过Statement名称调用即可,如: sqlMap.update("updateUser",user); 但请注意此时需要保证所有映射文件中,Statement定义无重名。?


transactionManager节点?
transactionManager节点定义了ibatis的事务管理器,目前提供了以下几种选择:?
JDBC?
通过传统JDBC Connection.commit/rollback实现事务支持。?
JTA?
使用容器提供的JTA服务实现全局事务管理。?
EXTERNAL?
外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自?
动的事务管理机制。此时ibatis将把所有事务委托给外部容器进行管理。?

dataSource节点?
??? dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。?
type属性:?
dataSource节点的type属性指定了dataSource的实现类型。 可选项目:?
SIMPLE:?
??? SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的?
数据库连接池机制,对应 ibatis 实现类为?
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。?

DBCP:?
??? 基于Apache DBCP连接池组件实现的DataSource封装,当无容器提?
供DataSource服务时,建议使用该选项,对应ibatis实现类为?
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。?

JNDI:?
使用J2EE容器提供的DataSource实现,DataSource将通过指定?
的JNDI Name从容器中获取。对应 ibatis实现类为?
com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。?

dataSource的子节点说明(SIMPLE&DBCP):?
JDBC.Driver??? JDBC 驱动。?
如:org.gjt.mm.mysql.Driver?

JDBC.ConnectionURL?
数据库URL。?
如:jdbc:mysql://localhost/sample?
如果用的是SQLServer JDBC Driver,需要?
在url后追加SelectMethod=Cursor以获得?
JDBC事务的多Statement支持。?
JDBC.Username?
??? 数据库用户名?
JDBC.Password?
数据库用户密码?
Pool.MaximumActiveConnections?
数据库连接池可维持的最大容量。?

Pool.MaximumIdleConnections?
数据库连接池中允许的挂起(idle)连接数。?

JNDI由于大部分配置是在应用服务器中进行,因此ibatis中的配置相对简?
分别使用JDBC和JTA事务管理的JDNI配置:?
使用JDBC事务管理的JNDI DataSource配置?


< transactionManager??? type ="JDBC"???? >?
< dataSource??? type ="JNDI" >?
< property??? name ="DataSource"???? value ="java:comp/env/jdbc/myDataSource" />?
</ dataSource >?
</ transactionManager >?
< transactionManager??? type ="JTA"???? >?
< property??? name ="UserTransaction"???? value ="java:/ctx/con/UserTransaction" />?
< dataSource??? type ="JNDI" >?
< property??? name ="DataSource"???? value ="java:comp/env/jdbc/myDataSource" />?
</ dataSource >???
sqlMap节点?
sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定?
项目内所包含的所有映射文件。?

ibatis基础语义?

XmlSqlMapClientBuilder?
XmlSqlMapClientBuilder是ibatis 2.0之后版本新引入的组件,用以替代1.x?
版本中的XmlSqlMapBuilder。其作用是根据配置文件创建SqlMapClient实例。?

SqlMapClient?
SqlMapClient是ibatis的核心组件,提供数据操作的基础平台。SqlMapClient?
可通过XmlSqlMapClientBuilder创建:?


String resource??? = " com/ibatis/sample/SqlMapConfig.xml " ;?
Reader reader;?

reader??? =??? Resources.getResourceAsReader(resource);?

XmlSqlMapClientBuilder xmlBuilder??? =???
new??? XmlSqlMapClientBuilder();?

SqlMapClient sqlMap??? =??? xmlBuilder.buildSqlMap(reader);?
"com/ibatis/sample/SqlMapConfig.xml"指明了配置文件在CLASSPATH?
中的相对路径。XmlSqlMapClientBuilder通过接受一个Reader类型的配置文?
件句柄,根据配置参数,创建SqlMapClient实例。?

SqlMapClient提供了众多数据操作方法,下面是一些常用方法的示例,具体说明?
文档请参见ibatis java doc,或者ibatis官方开发手册。?

SqlMapClient基本操作示例?

以下示例摘自ibatis官方开发手册,笔者对其进行了重新排版以获得更好的阅读效果。?
例1: 数据写入操作(insert, update, delete):?


sqlMap.startTransaction();?
Product product??? =???? new??? Product();?
product.setId ( 1 );?
product.setDescription (“Shih Tzu”);?
int??? rows??? =??? sqlMap.insert (“insertProduct”, product);?
sqlMap.commitTransaction();?
例2: 数据查询 (select)?


sqlMap.startTransaction();?
Integer key??? =???? new??? Integer ( 1 );?
Product product??? =??? (Product)sqlMap.queryForObject (“getProduct”, key);?
sqlMap.commitTransaction();?
例3: 在指定对象中存放查询结果(select)?


sqlMap.startTransaction();?
Customer customer??? =???? new??? Customer();?
sqlMap.queryForObject(“getCust”, parameterObject, customer);?
sqlMap.queryForObject(“getAddr”, parameterObject, customer);?
sqlMap.commitTransaction();?
例4: 执行批量查询 (select)?


sqlMap.startTransaction();?
List list??? =??? sqlMap.queryForList (“getProductList”,??? null )?
sqlMap.commitTransaction();?
例5: 关于AutoCommit?


// 没有预先执行startTransaction时,默认为auto_commit模式?
int??? rows??? =??? sqlMap.insert (“insertProduct”, product);?
例6:查询指定范围内的数据?


sqlMap.startTransaction();?
List list??? =??? sqlMap.queryForList (“getProductList”,??? null ,??? 0 ,??? 40 );?
sqlMap.commitTransaction();?
例7: 结合RowHandler进行查询(select)?


??? public???? class??? MyRowHandler??? implements??? RowHandler???? {?
????? public???? void??? handleRow (Object object, List list)??? throws?
????? SQLException???? {?
??????? Product product??? =??? (Product) object;?
??????? product.setQuantity ( 10000 );?
??????? sqlMap.update (“updateProduct”, product);?
????? }?
}?
sqlMap.startTransaction();?
RowHandler rowHandler??? =???? new??? MyRowHandler();?
List list??? =??? sqlMap.queryForList (“getProductList”,??? null ,?
rowHandler);?
sqlMap.commitTransaction();?


// 例8: 分页查询 (select)?
PaginatedList list??? =?
sqlMap.queryForPaginatedList (“getProductList”,??? null ,??? 10 );?
list.nextPage();?
list.previousPage();?


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

读书人网 >其他数据库

热点推荐