本文是我和同事陈为、徐进共同完成,主要的配置和说明借鉴夏昕的《ibatis开发指南》,稍微增加的了点东西。 附件中包含所需要的jar包
基于IBATIS框架发布包、标准化开发安装实施
1 所需jar文件
1.1 主要jar文件
ibatis-2.3.0.677.jar
1.2 辅助jar文件
log4j-1.2.14.jar
ojdbc14.jar
2 配置文件及说明
2.1 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <!-- 在这里配置jdbc.propertis,在配置datasource的时候,用${}获得jdbc.properties里的属性的值,这个配置是可选的--> <properties resource="jdbc.properties " /> <!-- settings参数详细说明: cacheModelsEnabled 是否启用SqlMapClient上的缓存机制.建议设为"true"; enhancementEnabled 是否针对POJO启用字节码增强机制以提升getter/setter的调用效能,避免使用JavaReflect所带来的性能开销。同时,这也为Lazy Loading带来了极大的性能提升。建议设为"true"; lazyLoadingEnabled 是否启用延迟加载机制,建议设为"true" errorTracingEnabled 是否启用错误日志,在开发期间建议设为"true" 以方便调试; maxRequests 最大并发请求数(Statement并发数); maxSessions 最大并发事务数; 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定义无重名。 --> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <!—配置JDBC 驱动 --> <property name="JDBC.Driver" value="${driver}"/> <!-- 数据库URL --> <property name="JDBC.ConnectionURL" value="${url}"/> <!-- 数据库用户名 --> <property name="JDBC.Username" value="${username}"/> <!-- 数据库用户密码 --> <property name="JDBC.Password" value="${password}"/> <!-- 数据库连接池可维持的最大容量 --> <property name="Pool.MaximumActiveConnections" value="10"/> <!-- 数据库连接池中允许的挂起(idle)连接 --> <property name="Pool.MaximumIdleConnections" value="5"/> <!-- 数据库联接池中,连接被某个任务所允许占用的最大时间,如果超过这个时间限定,连接将被强制收回 (毫秒)--> <property name="Pool.MaximumCheckoutTime" value="120000"/> <!-- 当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。此参数设定了线程所允许等待的最长时间 (毫秒)--> <property name="Pool.TimeToWait" value="500"/> </dataSource> </transactionManager> <!-- sqlMap 节点指定了映射文件的位置 --> <sqlMap resource="com/zrar/wxxt/config/User.xml"/> ……<!—更多的配置文件 --> 【注意:】在这里配置映射文件的时候,指定的是映射文件的路径,而不是包名,不能写成com.zrar.wxxt.config.User.xml </sqlMapConfig>
2.2 Jdbc.properties
driver= oracle.jdbc.driver.OracleDriver
url= jdbc:oracle:thin:@192.168.3.45:1521:pure
username= wxxt
password= arkj123
2.3 映射文件(以User.xml为例)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="User"> <!-- 定义了本映射文件中的别名,以避免过长变量值在resultClass或parameterClass中的反复书写 --> <typeAlias alias="user" type="com.zrar.wxxt.entity.User" /> <!-- 定义了本映射文件中使用的Cache机制,这里申明了一个名为"dwylbxjbxxCache"的cacheModel,之后可以在Statement申明中对其进行引用,通过Select statement获取的数据,使用cacheModel "dwylbxjbxxCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。 cacheModel主要有下面几个配置点: flushInterval :设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。 size:本CacheModel中最大容纳的数据对象数量。 flushOnExecute:指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。 --> <cacheModel id="userCatche" type="LRU"> <flushInterval hours="6"/> <!—updateUser和下面update标签的id相同--> <flushOnExecute statement="updateUser"/> <property name="size" value="1000"/> </cacheModel> <select id="getUser" parameterClass="java.lang.String" resultClass="user" <!—userCatche与上面定义的cacheModel标签的id相同--> cacheModel=" userCatche "> <!-- #name#,井号之间的字符串,必需与com.zrar.wxxt.entity.User中的属性名相同,如果传入的参数不是实体类而是map,井号之间的字符串则必需以map中的key值相同 --> select id, name, sex from t_user where name = #name# </select> <update id="updateUser" parameterClass="user"> <!— 注意:<![CDATA[……]]> 该标签是为了以防sql语句中有与xml标签冲突的字符存在可以省略 --> <![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id = 3 ]]> </update> <insert id="insertUser" parameterClass="user"> <![CDATA[ INSERT INTO t_user (id, name, sex) VALUES (#id#, #name#, #sex#) ]]> </insert> <delete id="deleteUser" parameterClass="java.lang.String"> delete from t_user where id = #value# </delete> <select id="queryUser" parameterClass="java.util.Map" resultClass="user" cacheModel=" userCatche " > SELECT * FROM $tableName$ 【注意:】$tableName$ 为动态表名,通过实体类中的属性名或者Map中的Key值匹配。 <!-- Dynamic 节点和判定节点中的prepend属性,指明了本节点中定义的SQL子句在主体SQL中出现时的前缀。 相当于在之前的sql语句后加上 WHERE 语句 --> <dynamic prepend="WHERE"> <!-- isEmpty 节点,该节点属于一元节点,如果属性为Collection或者String,其size是否<1,如果非以上两种类型,则通过 String.valueOf(属性值)获得其String类型的值后,判断其size是否<1; isNotEmpty节点 和 isEmpty节点相反。 其他一元节点: <isPropertyAvailable> 参数类中是否提供了此属性 <isNotPropertyAvailable> 与<isPropertyAvailable>相反 <isNull> 属性值是否为NULL <isNotNull> 与<isNull>相反 --> <isNotEmpty prepend="AND" property="name"> (name like #name#) 【注意:】此句相当于:如果的name不为空,则在 WHERE 语句后面加上 name like ‘name’,ibatis会自动判断是否需要加上 and </isNotEmpty> 【注意:上面列出了一元节点,ibatis还提供了二元节点,具体清空可也查阅相关资料】 </dynamic> </select> </sqlMap>
3 Java类
3.1 SqlMapConfig.java 获得SqlMapClient的实例
public class SqlMapConfig {
private static final SqlMapClient sqlMap;
static {// static块中的语句只会在第一次加载这个类的时候执行
try {
String resource = "sqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
// 在这里将异常抛出来,是为了能在日志文件里更好的跟踪该异常
throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause:" + e);
}
}
public static SqlMapClient getSqlMapInstance() {
return sqlMap;
}
}