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

ibatis支持多配置文件实现

阅读更多
思路如下:
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
分享到:
评论
1 楼 ddandyy 2008-03-27  
您说的是这个么.........

<sqlMapConfig>
    <settings enhancementEnabled="true" maxTransactions="50" maxRequests="100" maxSessions="50" useStatementNamespaces="true"/>
    <!-- Identify all SQL Map XML files to be loaded by this SQL map. Relative to classpath -->
	<sqlMap resource="com/cn/dao/ibatis/testASQL.xml" />
	<sqlMap resource="com/cn/dao/ibatis/testBSQL.xml" />
</sqlMapConfig>

相关推荐

    ibatis 配置文件详解

    ### ibatis配置文件详解 #### 一、ibatis概述 ibatis,又称MyBatis,是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。ibatis可以...

    ibatis配置文件信息

    通过对ibatis配置文件的解析,我们可以看到ibatis的强大之处在于它能够灵活地配置各种参数,并通过简洁的XML配置文件实现对数据库的高效操作。通过上述三个配置文件的设置,ibatis能够自动完成对数据库的操作,包括...

    ibatis配置文件

    配置文件中的`&lt;settings&gt;`标签包含了多个关键参数,它们控制着ibatis的行为特性: - `cacheModelsEnabled`: 控制是否启用缓存模型。设置为`true`表示启用缓存。 - `enhancementEnabled`: 控制是否对POJO进行增强,...

    ibatis 注解配置文件

    在传统的XML配置文件中,Ibatis允许我们定义SQL语句、参数映射以及结果集映射。然而,随着Java注解的普及,Ibatis也支持使用注解来进行配置,使得代码更加简洁易读。 1. **@Select**: 这个注解用于标记一个方法,该...

    \ibatis配置文件、映射文件详解

    本文将深入探讨iBATIS的核心配置文件——`sqlMapConfig.xml`,以及映射文件的详细内容。 `sqlMapConfig.xml`是iBATIS的全局配置文件,它包含了所有iBATIS运行时的设置,如数据源、事务管理器、缓存配置等。让我们...

    IBatis.net 配置各种数据库

    总结,IBatis.net通过XML配置文件和.NET接口,实现了数据库操作的灵活性和可维护性。其强大的数据库适配能力,使得开发者能够专注于业务逻辑,而不是繁琐的数据库操作代码。通过熟练掌握这些配置和使用方法,开发者...

    Ibatis的应用和配置

    2. 动态SQL:Ibatis支持动态SQL,可以在XML映射文件中编写条件语句,实现灵活的查询逻辑,比如根据条件选择性地包含或排除某些WHERE子句。 3. 缓存机制:Ibatis内置了缓存功能,可以在一定程度上提高数据访问效率,...

    ibatis 框架原理实现

    这个自己编写的Ibatis框架实现,虽然可能在功能上与官方版本有所差异,但基本原理和核心思想是一致的,即通过XML配置文件解耦SQL和Java代码,提供灵活的SQL映射和参数映射,以及方便的结果集映射,以此简化数据库...

    mysql数据库自动生成对应的java实体类和ibatis配置文件

    要实现MySQL数据库到Java实体类和iBatis配置文件的自动化生成,可以使用一些工具或插件,例如MyBatis Generator(MBG)。MBG是一个强大的工具,能够根据数据库表生成Java模型类、Mapper接口和XML配置文件。以下是...

    ibatis 一对多 多对多完整映射

    iBATIS并没有直接支持多对多映射,但可以通过一对多的组合实现。你可以为每个实体创建一对多映射,并在业务逻辑中处理关联关系。 例如,对于用户和角色的关系,可以先配置用户和中间表的映射,再配置角色和中间表...

    ibatis配置、映射文件详解.doc

    本文将深入解析iBatis的核心配置文件`sqlMapConfig.xml`,以及映射文件的使用方法,帮助初学者更好地理解和掌握iBatis的配置与映射。 首先,`sqlMapConfig.xml`是iBatis系统的主配置文件,它定义了整个系统的行为,...

    ibatis相关配置

    Ibatis支持多种参数绑定方式,如#{param}(预编译参数)、${param}(字符串替换)等。结果映射可以自动将数据库结果转换为Java对象。 7. **缓存机制** Ibatis提供了一级和二级缓存,一级缓存默认开启,存在于...

    ibatis配置

    9. **事务管理**: Ibatis支持手动和自动两种事务管理模式。手动模式下,开发者需要自己控制事务的开启、提交和回滚;自动模式下,可以通过Spring等框架进行集成,实现声明式事务管理。 10. **日志配置**: Ibatis...

    扩展 iBatis 以透明支持多种数据库

    6. **配置文件**:在 iBatis 的配置文件中,定义数据库连接参数,如用户名、密码、URL 等,并根据运行环境动态加载。 7. **适配器模式**:通过适配器模式,将数据库特有的操作封装起来,使业务代码与具体数据库解耦...

    ibatis demo,ibatis例子,ibatis示例

    5. **参数映射**:Ibatis支持多种方式传递参数,如Map、POJO对象、注解等。例如,使用`@Param`注解可以指定参数名,或者在XML中使用`#{paramName}`来引用参数。 6. **结果映射**:结果映射允许我们将查询结果自动...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    iBatis支持JDBC和Spring两种事务管理方式。在源码中,`org.apache.ibatis.transaction.jdbc.JdbcTransaction`和`org.apache.ibatis.transaction.managed.ManagedTransaction`分别对应JDBC和Spring的事务管理。 十、...

Global site tag (gtag.js) - Google Analytics