ibatis的初识

在工作中,服务端的框架基本上是struts+spring+ibatis+velocity。ibatis曾经没有接触到,而曾经使用的hibernate在公司居然没碰着。同样都是数据库封装,为什么没有选择hibernate,这是当时疑惑的地方。

1、ibatis与hibernate的不同之处

     Hibernate 对数据库进行了全面的封装,全自动的实现了POJO与数据库表的映射。使用hibernate,只需要定义POJO,及POJO与数据库表的映射文件,就能实现自动生成表,而hibernate对jdbc的封装,使得我们不需要去关心sql语句,这些都由hibernate封装成方法供调用了。但对于对性能要求苛刻的系统来说,hibernate可能就无法满足要求。相对与hibernate,ibatis就半自动化得多。ibatis需要手动的写sql语句,在这点上就能提供系统的性能。

 

2、使用ibatis时的一些配置含义

   曾经自己简单的实现了个例子,采用的是struts2+spring+ibatis+velocity。虽然跑通了,但部分的配置还是不太理解,现在看了下ibatis,豁然开朗。

   2.1  sqlmap-config 的配置意义

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig  
  PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"  
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> 

<sqlMapConfig>
        <settings    
	        cacheModelsEnabled="true"    
	        enhancementEnabled="true"    
	        lazyLoadingEnabled="true"    
	        errorTracingEnabled="true"    
	        maxRequests="32"    
	        maxSessions="10"    
	        maxTransactions="5"    
	        useStatementNamespaces="false"    
      /> 
      
       <sqlMap resource="MyFile.xml"/>

</sqlMapConfig>

 在settings的标签中,各个属性的含义:

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

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

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

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

maxRequests:   最大并发请求数(Statement 并发数);

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

maxTransactions:   最大 Session 数。即当前最大允许的并发SqlMapClient 数。maxSessions 设定必须介于maxTransactions 和 maxRequests 之间,即maxTransactions<maxSessions=< maxRequests;

useStatementNamespaces:是否使用 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 定义无重名。

  另外,指定的<sqlMap resource="MyFile.xml"/> 会从CLASSPATH中寻找,如果MyFile.xml放的位置不正确,会报FileNotFoundException.

   2.2 MyFile.xml的配置

<sqlMap namespace="MyFile">
	<typeAlias alias="MyFile" type="com.jd.training.domain.MyFile"></typeAlias>
	<resultMap id="MyFileMap" class="MyFile">
		<result property="id" column="id" />
		<result property="name" column="name"/>
		<result property="gmtCreate" column="gmt_create" />
	</resultMap>
	
	<select id="findAll" resultMap="MyFileMap">
		select id,name,gmt_create from my_file
	</select>
</sqlMap> 

     2.3  调用 findAll

public List<MyFile> findAll() {
		try{
			List<MyFile> fs =  getSqlMapClientTemplate().queryForList("findAll");
			return fs;
		}
		catch(Exception e){			
			e.printStackTrace();
		}
		return null;
	}

按照上面的useStatementNamespaces,如果值为true,则findAll前面需要加上MyFile。而我设置的为false,所以这里直接是findAll.

   2.4 SqlMapClient

   SqlMapClient 是 ibatis 运的核心, 所有操作均通过 SqlMapClient实例完成。

   在spring中,SqlMapClient的配置:

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="/WEB-INF/sqlmap-config.xml"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

 

posted @ 2014-01-02 20:42  爱生活者wmmang  Views(193)  Comments(0Edit  收藏  举报