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>