sqlMapClient这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作。这个类是我们使用iBATIS的最主要的类。它是线程安全的。通常,将它定义为单例。
<bean id="sqlMapClient"
class="com.paic.pafa.app.lwc.service.persistence.dao.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<description>iBATIS SQL Mapping配置文件名,系统要能够在CLASSPATH中找到该文件</description>
<value>sqlmap-config.xml</value>
</property>
<property name="maxRowCount">
<description>iBATIS 查询数据库的最大数据库记录行数. 默认为5000 </description>
<value>${ibatis.query.maxrowcount}</value>
</property>
<property name="excludeStatements">
<description>不使用系统统一配置的结果集的语句</description>
<list>
</list>
</property>
<property name="maxRowCount4Excludes">
<description>excludeStatements中的sql查询数据库的最大记录行数.默认为5000</description>
<value>${ibatis.query.maxRowCount4Excludes}</value>
</property>
<property name="isThrowExcept">
<description>
配置当结果集超过限制值后,系统是抛出异常还是返回限制范围内的数据。
true:抛出异常
false:返回限制范围内的数据
默认为true.
</description>
<value>TRUE</value>
</property>
</bean>
sqlmap-config.xml
<sqlMapConfig>
<!--
参数说明:
cacheModelsEnabled:
启用或禁用SqlMapClient的所有缓存model。调试程序时使用。
enhancementEnabled:
启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能,同时优化延迟加载
的性能。
lazyLoadingEnabled:
启用或禁用SqlMapClient的所有延迟加载。调试程序时使用。
maxRequests:
同时执行SQL语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。
不同的DBMS有不同的限制值,但任何数据库都有这些限制。通常这个值应该至少是
maxTransactions的10倍,并且总是大于maxSessions和maxTranactions。减小这个参数值通常能提高性能。
maxSessions:
同一时间内活动的最大session数。一个session可以是代码请求的显式session,
也可以是当线程使用SqlMapClient实例(即执行一条语句)自动获得的session。
它应该总是大于或等于maxTransactions并小于maxRequests。减小这个参数值通常能
减少内存使用。
maxTransactions:
同时进入SqlMapClient.startTransaction()的最大线程数。大于这个值的线程将阻塞
直到另一个线程退出。不同的DBMS有不同的限制值,但任何数据库都有这些限制。这个
参数值应该总是小于或等于maxSessions并总是远远小于maxRequests。减小这个参数值
通常能提高性能。
useStatementNamespaces:
如果启用本属性,必须使用全限定名来引用mapped statement。Mapped statement的
全限定名由sql-map的名称和mapped-statement的名称合成,例如
queryForObject(“sqlMapName.statementName”)
-->
<settings cacheModelsEnabled="true"
enhancementEnabled="false"
lazyLoadingEnabled="false"
maxRequests="3000"
maxSessions="3000"
maxTransactions="3000"
useStatementNamespaces="false"/>
<!--
添加sql map文件。当一个SQL Map文件太大的时候,可以拆分成若干个小的文件。
建议按照模块拆分sql map文件,比如sqlmap-mapping-module-a.xml,
sqlmap-mapping-module-a.xml。<property name="Driver.SetBigStringTryClob" value="true"/>
命名规范为:sqlmap-mapping-模块名.xml(全部小写)
<sqlMap resource="sqlmap-mapping-bankvirement.xml"/>
-->
<sqlMap resource="sqlmap-mapping-privilege.xml"/>
<sqlMap resource="sqlmap-mapping-worktable.xml"/>
<sqlMap resource="sqlmap-mapping-workflow.xml"/>
<sqlMap resource="sqlmap-mapping-print.xml"/>
<sqlMap resource="sqlmap-mapping-newbusiness.xml"/>
</sqlMapConfig>
DAO对SqlMapClient的引用
<bean id="idGeneratorDAO"
class="com.palic.egis.common.integration.dao.impl.IdGeneratorIbatisDAO">
<description>用于生成Sequence ID的DAO</description>
<property name="dataSource">
<ref local="dsFactory"/>
</property>
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
<property name="useRandomSequence">
<description>
如果为true将随机产生序号,而不通过Oracle的package来得到。
作为演示使用。添加这个配置的作用是演示可以通过在context配置文件
中添加自己的配置。
</description>
<value>false</value>
</property>
</bean>
DAO的实现:
public class IdGeneratorIbatisDAO extends SqlMapClientDaoSupport implements IdGeneratorDAO
获取SQLMap模板
SqlMapClientTemplate sqlMap = getSqlMapClientTemplate();
sqlMap.queryForObject("generateSequence", map);
附上数据原配置
<bean id="dsFactory"
class="com.paic.pafa.app.lwc.service.persistence.datasource.DataSourceFactoryBean" >
<property name="defaultDSKey">
<description>缺省的数据源,必须指定为下面map中的entry key之一</description>
<value>GBSDS</value>
</property>
<property name="dataSources">
<description>可以在map属性里面添加多个数据源</description>
<map>
<entry key="GBSDS">
<ref local="defaultDS"/>
</entry>
<entry key="GBSDS_XA">
<ref local="gbsDS_XA"/>
</entry>
</map>
</property>
</bean>
<bean id="defaultDS"
class="com.paic.pafa.app.lwc.core.naming.JndiObjectFactoryBean">
<property name="jndiName">
<value>${defaultDS}</value>
</property>
<property name="jndiTemplate">
<ref local="jndiTemplate"/>
</property>
</bean>
context-egis-nbu.properties
defaultDS=jdbc/egis/gbsds
biz-context.xml
<!-- JNDI定义 -->
<bean id="jndiTemplate"
class="com.paic.pafa.app.lwc.core.naming.JndiTemplate">
<description>定义一个用作模板的JNDI,可以被其它bean引用</description>
<property name="environment">
<props>
<prop key="java.naming.provider.url">${egis.txnActionBean.jndi.url}</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
</props>
</property>
</bean>
context-egis-nbu.properties
#egis的TxnActionBean JNDI配置,肯定是localhost ,但是需要指定端口
egis.txnActionBean.jndi.url=t3://localhost:43962