`
angkorpeach
  • 浏览: 119863 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于IBATIS框架发布包、标准化开发安装实施

阅读更多

本文是我和同事陈为徐进共同完成,主要的配置和说明借鉴夏昕的《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;
 }
}
  • lib.rar (1.7 MB)
  • 下载次数: 25
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics