本文是我和同事陈为、徐进共同完成,主要的配置和说明借鉴夏昕的《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;
}
}
分享到:
相关推荐
数据持久层基于iBatis框架,通过SQLMap配置进行数据库读写,有利于数据库的优化。为了提高效率,系统还引入了缓存处理机制,降低数据库交互次数。 总体来看,这份文档详尽地描述了JAVA技术架构的各个层面,从前端的...
- Struts2:基于MVC的Web应用框架。 - Hibernate:对象关系映射(ORM)框架,简化数据库操作。 - JPA:Java持久化API,标准的ORM规范。 - Spring:提供全面的企业级应用开发框架,包括依赖注入、AOP、事务管理等。 -...
J2EE提供了企业级应用开发的标准化环境,而Struts2、Spring和iBatis则分别负责表现层、业务逻辑层和数据访问层的实现,构建松耦合的架构。 2. **数据库设计**:选用MySql5.1作为数据库,存储和管理办公数据,支持...
技术架构包括展示层、控制层、业务展现页面、平台控制器、业务逻辑组件、平台标准逻辑组件、平台服务、Ibatis、JDBC、逻辑层、持久层、MongDB、HDFS、RDBM、MongDB、HDFS、异常处理、缓存工具、页面框架、平台控件和...
这表明AppFuse提供了简化Web开发流程、提高开发效率的多种特性,如模板化代码生成、预配置框架集成等,减少了常见的开发任务负担,让开发者能够专注于业务逻辑的实现。 ### AppFuse 2.0 RC1文档概览 文档由mraible...
总的来说,Activiti是一个强大且灵活的BPM解决方案,它简化了企业级工作流程的管理和实施,通过自动化和标准化工作流程,提升了企业的运营效率。通过深入理解和熟练运用Activiti,开发者可以构建出高效、可扩展的...
4. **iBATIS框架**:iBATIS 2.3 - 这是一个SQL映射框架,它将SQL语句与Java代码分离,实现了持久层操作的简单化。iBATIS允许开发者直接在XML配置文件中编写SQL,提高了代码的可读性和维护性。 5. **ExtJS库**:...
基于原生的iBATIS API的DAO实现 12.6. JPA 12.6.1. 在Spring环境中建立JPA 12.6.1.1. LocalEntityManagerFactoryBean 12.6.1.2. LocalContainerEntityManagerFactoryBean 12.6.1.3. 处理多个持久化单元 12.6.2. ...
- **MyBatis (原Ibatis)**:半ORM框架,提供动态SQL支持。 - **JDBC**:直接与数据库交互,灵活性高但编码繁琐。 ##### Hibernate的运行原理 - **Session**:负责持久化操作。 - **SessionFactory**:创建Session...