思路如下:
1、修改SqlMapClientBuilder,增加一个新的方法buildSqlMapClient(String locationPath)
2、分析此locationPath,获取到n个配置文件
3、把这些n个配置文件都以xml的方式读取,然后合并其中的各个节点,得到一个合并后的xml文件
4、以合并后的xml文件初始化SqlMapClient
可以如下初始化
SqlMapClientBuilder.buildSqlMapClient("sqlmap-iw-config.xml,sqlmap-dc.config.xml");
SqlMapClientBuilder.buildSqlMapClient("sqlmap-*-config.xml");
或者使用spring配置
<bean id="configBean"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:com/liwj/example/ibatis/SqlMapConfigExample.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${driver}</value>
</property>
<property name="url">
<value>${url}</value>
</property>
<property name="username">
<value>${username}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:conf/ibatis/sqlmap-*-config.xml</value>
<!--
<property name="configLocation">
<value>classpath:conf/ibatis/sqlmap-iw-config.xml,conf/ibatis/sqlmap-dc-config.xml</value>
-->
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
想法是这样子的,还有没有具体去写,有时间了补充完整……
现在终于补充完毕了,修改com.ibatis.sqlmap.client.SqlMapClientBuilder
增加全局变量
private static final String PROPERTIES="properties";
private static final String SETTINGS="settings";
private static final String RESULTOBJECTFACTORY="resultObjectFactory";
private static final String TYPEALIAS="typeAlias";
private static final String TYPEALIAS_ALIAS="alias";
private static final String TYPEHANDLER="typeHandler";
private static final String TRANSACTIONMANAGER="transactionManager";
private static final String SQLMAP="sqlMap";
private static final String SQLMAP_RESOURCE="resource";
private static final String SQLMAPCONFIG_ROOT="sqlMapConfig";
增加方法如下:
public static SqlMapClient buildSqlMapClient(String locationPath){
ResourceLoader resourceLoader=new PathMatchingResourcePatternResolver();
Document d_doc=null;
try{
Resource[] a_resource=((ResourcePatternResolver) resourceLoader).getResources(locationPath);
SAXReader reader=new SAXReader();
for(int i=0;i<a_resource.length;i++){
Reader fileReader=new FileReader(a_resource[i].getFile());
if(i==0) d_doc=reader.read(fileReader);
else{
Document r_doc=reader.read(fileReader);
new SqlMapClientBuilder().combinationAll(r_doc, d_doc);
}
}
}catch(Exception e){
e.printStackTrace();
}
d_doc.addDocType("sqlMapConfig", "-//iBatis.com//DTD SQL Map Config 2.0//EN", "http://www.iBatis.com/dtd/sql-map-config-2.dtd");
return new SqlMapClientBuilder().buildSqlMapClient(new ByteArrayInputStream(d_doc.asXML().getBytes()));
}
public void combinationAll(Document resource,Document destination){
combinationGlobalPropNodelets(resource, destination);
combinationSettingsNodelets(resource, destination);
combinationSqlMapNodelets(resource, destination);
combinationTypeAliasNodelets(resource, destination);
combinationResultObjectFactoryNodeltes(resource, destination);
combinationTransactionManagerNodeltes(resource, destination);
combinationTypeHandlerNodeltes(resource, destination);
}
private void combinationSqlMapNodelets(Document resource,Document destination){
combination(this.SQLMAP, resource, destination);
}
private void combinationTypeAliasNodelets(Document resource,Document destination){
combination(this.TYPEALIAS, resource, destination);
}
private void combinationSettingsNodelets(Document resource,Document destination){
combination(this.SETTINGS, resource, destination);
}
private void combinationGlobalPropNodelets(Document resource,Document destination){
combination(this.PROPERTIES, resource, destination);
}
private void combinationTransactionManagerNodeltes(Document resource,Document destination){
combination(this.TRANSACTIONMANAGER, resource, destination);
}
private void combinationResultObjectFactoryNodeltes(Document resource,Document destination){
combination(this.RESULTOBJECTFACTORY, resource, destination);
}
private void combinationTypeHandlerNodeltes(Document resource,Document destination){
combination(this.TYPEHANDLER, resource, destination);
}
private void combination(String nodePath,Document resource,Document destination){
/*只允许一个节点*/
StringBuffer onePro=new StringBuffer();
onePro.append(PROPERTIES).append(",").append(SETTINGS);
StringBuffer zeroPro=new StringBuffer();
zeroPro.append(TYPEALIAS).append(",").append(",").append(SQLMAP);
String nodeXpath="/sqlMapConfig/"+nodePath;
List L_R_element=resource.selectNodes(nodeXpath);
List L_D_element=destination.selectNodes(nodeXpath);
/*源节点,判断目的节点是否有此节点,无则添加,有则比较*/
if(L_R_element!=null&&L_R_element.size()>0){
/*如目的节点为null,则把源节点全部加入到目的节点中*/
if(L_D_element==null||L_D_element.size()==0){
for(int i=0;i<L_R_element.size();i++){
Element element=(Element)L_R_element.get(i);
destination.add(element);
}
}else{
if(onePro.toString().indexOf(nodePath)>=0){
/*只有一个节点,则合并两个节点的属性*/
Element r_element=(Element)L_R_element.get(0);
Element d_element=(Element)L_D_element.get(0);
/*比较所有属性*/
List r_attribute=r_element.attributes();
if(r_attribute!=null&&!r_attribute.isEmpty()){
List d_attribute=d_element.attributes();
/*如果目的节点没有任何属性,则将原属性全部加入目的节点*/
if(d_attribute==null||d_attribute.isEmpty()){
d_element.setAttributes(r_attribute);
}else{
List list_temp=new ArrayList();
for(int i=0;i<d_attribute.size();i++){
list_temp.add(((Attribute)d_attribute.get(i)).getName());
}
/*循环源节点的所有属性,如目的节点中没有此属性,则添加*/
for(int i=0;i<r_attribute.size();i++){
Attribute temp_attr=(Attribute)r_attribute.get(i);
if(!list_temp.contains(temp_attr.getName())){
d_element.add((Attribute)temp_attr.clone());
//d_element.addAttribute(temp_attr.getName(), temp_attr.getValue());
}
}
}
}
}else if(zeroPro.toString().indexOf(nodePath)>=0){
String comp="";
if(nodePath.equals(TYPEALIAS)) comp=TYPEALIAS_ALIAS;
else if(nodePath.equals(SQLMAP)) comp=SQLMAP_RESOURCE;
List d_temp=new ArrayList();
for(int i=0;i<L_D_element.size();i++){
Element element=(Element)L_D_element.get(i);
d_temp.add(element.attribute(comp).getValue());
}
/*循环源节点,如果目的节点由此节点,则忽略,否则添加*/
Element ele_root=destination.getRootElement();
for(int i=0;i<L_R_element.size();i++){
Element element=(Element)L_R_element.get(i);
if(!d_temp.contains(element.attribute(comp).getValue()))
ele_root.add((Element)element.clone());
}
}else{
}
}
}
使用了dom4j来操作xml
分享到:
- 2008-03-26 20:52
- 浏览 2608
- 评论(1)
- 论坛回复 / 浏览 (1 / 2788)
- 查看更多
相关推荐
### ibatis配置文件详解 #### 一、ibatis概述 ibatis,又称MyBatis,是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。ibatis可以...
通过对ibatis配置文件的解析,我们可以看到ibatis的强大之处在于它能够灵活地配置各种参数,并通过简洁的XML配置文件实现对数据库的高效操作。通过上述三个配置文件的设置,ibatis能够自动完成对数据库的操作,包括...
配置文件中的`<settings>`标签包含了多个关键参数,它们控制着ibatis的行为特性: - `cacheModelsEnabled`: 控制是否启用缓存模型。设置为`true`表示启用缓存。 - `enhancementEnabled`: 控制是否对POJO进行增强,...
在传统的XML配置文件中,Ibatis允许我们定义SQL语句、参数映射以及结果集映射。然而,随着Java注解的普及,Ibatis也支持使用注解来进行配置,使得代码更加简洁易读。 1. **@Select**: 这个注解用于标记一个方法,该...
本文将深入探讨iBATIS的核心配置文件——`sqlMapConfig.xml`,以及映射文件的详细内容。 `sqlMapConfig.xml`是iBATIS的全局配置文件,它包含了所有iBATIS运行时的设置,如数据源、事务管理器、缓存配置等。让我们...
总结,IBatis.net通过XML配置文件和.NET接口,实现了数据库操作的灵活性和可维护性。其强大的数据库适配能力,使得开发者能够专注于业务逻辑,而不是繁琐的数据库操作代码。通过熟练掌握这些配置和使用方法,开发者...
2. 动态SQL:Ibatis支持动态SQL,可以在XML映射文件中编写条件语句,实现灵活的查询逻辑,比如根据条件选择性地包含或排除某些WHERE子句。 3. 缓存机制:Ibatis内置了缓存功能,可以在一定程度上提高数据访问效率,...
这个自己编写的Ibatis框架实现,虽然可能在功能上与官方版本有所差异,但基本原理和核心思想是一致的,即通过XML配置文件解耦SQL和Java代码,提供灵活的SQL映射和参数映射,以及方便的结果集映射,以此简化数据库...
要实现MySQL数据库到Java实体类和iBatis配置文件的自动化生成,可以使用一些工具或插件,例如MyBatis Generator(MBG)。MBG是一个强大的工具,能够根据数据库表生成Java模型类、Mapper接口和XML配置文件。以下是...
iBATIS并没有直接支持多对多映射,但可以通过一对多的组合实现。你可以为每个实体创建一对多映射,并在业务逻辑中处理关联关系。 例如,对于用户和角色的关系,可以先配置用户和中间表的映射,再配置角色和中间表...
本文将深入解析iBatis的核心配置文件`sqlMapConfig.xml`,以及映射文件的使用方法,帮助初学者更好地理解和掌握iBatis的配置与映射。 首先,`sqlMapConfig.xml`是iBatis系统的主配置文件,它定义了整个系统的行为,...
Ibatis支持多种参数绑定方式,如#{param}(预编译参数)、${param}(字符串替换)等。结果映射可以自动将数据库结果转换为Java对象。 7. **缓存机制** Ibatis提供了一级和二级缓存,一级缓存默认开启,存在于...
9. **事务管理**: Ibatis支持手动和自动两种事务管理模式。手动模式下,开发者需要自己控制事务的开启、提交和回滚;自动模式下,可以通过Spring等框架进行集成,实现声明式事务管理。 10. **日志配置**: Ibatis...
6. **配置文件**:在 iBatis 的配置文件中,定义数据库连接参数,如用户名、密码、URL 等,并根据运行环境动态加载。 7. **适配器模式**:通过适配器模式,将数据库特有的操作封装起来,使业务代码与具体数据库解耦...
5. **参数映射**:Ibatis支持多种方式传递参数,如Map、POJO对象、注解等。例如,使用`@Param`注解可以指定参数名,或者在XML中使用`#{paramName}`来引用参数。 6. **结果映射**:结果映射允许我们将查询结果自动...
iBatis支持JDBC和Spring两种事务管理方式。在源码中,`org.apache.ibatis.transaction.jdbc.JdbcTransaction`和`org.apache.ibatis.transaction.managed.ManagedTransaction`分别对应JDBC和Spring的事务管理。 十、...