论坛首页 Java企业应用论坛

让iBATIS支持多个sql-map-config.xml配置文件

浏览 13974 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-11  
注: Spring2.5.5以上 已经开始支持多个configLocations 和 mappingLocations了.

文件:  sql-map-config.xml
<sqlMapConfig>
	<settings cacheModelsEnabled="true" enhancementEnabled="true"
		statementCachingEnabled="true" maxSessions="128" maxTransactions="128"
		maxRequests="128" />

	<sqlMap resource="cn/iwoo/demo/dao/maps/Article.xml" />
	<sqlMap resource="cn/iwoo/demo/dao/maps/CodeModel.xml"/>
</sqlMapConfig>


文件: applicationContext-hibernate.xml
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:sql-map-config.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
上面这两段大家应该都比较熟悉了.

上面这两段就是修改前的代码.

初衷: 当一个项目越来越大的时候,这个sql-map-config.xml中的sqlMap也随着迅速膨胀. 而且,将系统模块划分后,所有的模块都依旧往这一个sql-map-config.xml文件中写东西,总归是感觉不太爽.

期望: 可以将这个sql-map-config.xml的sqlMap能够拆分到多个子sql-map-config.xml, 每个模块一个子sql-map-config.xml, 不同模块间大家也不冲突,相安无事. 同时还要对已经存在的sql-map-config.xml文件提供兼容.

修改后的文件: applicationContext-hibernate.xml
	<bean id="sqlMapClient" class="cn.iwoo.demo.ibatis.CustomSqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:sql-map-config.xml"/>
		<property name="extendConfigLocation" value="classpath:extendConfig.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>

CustomSqlMapClientFactoryBean是继承自SqlMapClientFactoryBean的一个自定义的类.
中间额外多了一个这个属性: extendConfigLocation.

文件: extendConfig.xml (用来作为额外管理依赖的一个配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<sqlMapConfig>

	<!-- <sqlMapImport resource="" url=""/> -->
	
	<sqlMapImport resource="a.xml"/>
	
</sqlMapConfig>

表示, 现在配置了一个属于a模块的sqlMap的a.xml.

文件: a.xml (子模块a的所有sqlMap文件配置在这里)
<?xml version="1.0" encoding="UTF-8"?>

<sqlMapImport>
	<sqlMap resource="cn/iwoo/demo/dao/maps/CodeModel.xml"/>
</sqlMapImport>

这个配置文件的内容和原来的sql-map-config.xml几乎一样,都是sqlMap的集中堆放点. 只是DOCTYPE被我自定义成了sqlMapImport, 不再是sqlMapConfig了.

文件: sql-map-config.xml
<sqlMapConfig>
	<settings cacheModelsEnabled="true" enhancementEnabled="true"
		statementCachingEnabled="true" maxSessions="128" maxTransactions="128"
		maxRequests="128" />

	<sqlMap resource="cn/iwoo/demo/dao/maps/Article.xml" />
	
</sqlMapConfig>

看,修改后的sql-map-config.xml中原来归属于a模块的CodeModel.xml的sqlMap放到了该属于它自己的a模块的a.xml中去了.

原来只存在这两个文件:
  • applicationContext-hibernate.xml
  • sql-map-config.xml        系统中所有的sqlMap都注册在这里面


修改后:
  • applicationContext-hibernate.xml 
  • sql-map-config.xml    老系统中的sql-map-config.xml文件.
  • extendConfig.xml      额外的管理其他模块的配置文件,需要将下面的a.xml注册在这里面
  • a.xml                模块a的sqlMap都配置在这里面



这样修改后, 每个模块就可以有自己的sqlMap汇总的一个xml文件. 只是需要将这些汇总文件再注册在extendConfig.xml中即可.
  • cn.iwoo.rar (14.5 KB)
  • 描述: 修改后的应用,内有数据库脚本,测试代码.
  • 下载次数: 449
   发表时间:2008-08-11  
也就是原来需要将所有的sqlMap文件都配置在一个地方,就是sql-map-config.xml.

这样完全不便于模块化的管理.

现在每个模块都有一个自己的集中配置点, 比如:上面的a.xml, 可以将自己模块对应的sqlMap文件配置在里面.
还需要额外做的就是将各个模块的集中配置文件 再在extendConfig.xml中注册一下. 比如: 在extendConfig.xml声明a.xml.
0 请登录后投票
   发表时间:2008-08-14  
有用吗?只是把原来在sql-map-config.xml中集中管理换了个地方而已吧,其实在sql-map-config.xml中分块引入不也解决这个问题?
0 请登录后投票
   发表时间:2008-08-14  
bukebushuo 写道
有用吗?只是把原来在sql-map-config.xml中集中管理换了个地方而已吧,其实在sql-map-config.xml中分块引入不也解决这个问题?


什么是分块引入?
0 请登录后投票
   发表时间:2008-08-14  
为什么没用?

假如我告诉你,我的Eclipse的Package中有45的项目需要去写这个sql-map-config.xml文件,你还觉得没意义吗?  目前这个sql-map-config.xml文件已经被配置了397行sqlMap, 那这个意义就非常大了. 而且,未来2年还要继续往这里面写,带来的只会是不停的冲突, 臃肿和无意义的肥胖.

一个产品是划分模块来面对客户的,纵然在写这个sql-map-config.xml的时候已经依照规范让一个模块的sqlMap都写在一块,可是一次只注释掉10个模块对应的10行配置文件,总会比注释掉10个模块对应的100行配置文件要方便吧.

而且,当系统变得越来越庞大的时候,带来的就是调试程序时启动Tomcat的时间越来越长,程序员为了加速Tomcat的启动会将与自己无关的模块的sqlMap注释掉,这个时候这个小功能就会显得很有用了.
0 请登录后投票
   发表时间:2008-08-19  
你用的什么版本的spring?
我这里编译错误,说SqlMapClientFactoryBean的buildSqlMapClient方法有三个参数的~你给的类里是两个参数的buildSqlMapClient方法~在CustomSqlMapClientFactoryBean的第36行
0 请登录后投票
   发表时间:2008-08-20  
我用的是Spring2.5.0, 我也查了Spring2.0的代码, 发现都是2个参数.

你用的肯定是Spring2.5.5以上的版本, 那你就没必要再看这个文章了.  .

因为:
100 -        private Resource configLocation; 
91 +         private Resource[] configLocations; 
101 92    
93 +         private Resource[] mappingLocations; 


Spring2.5.5以上 已经开始支持多个configLocations 和 mappingLocations了.

具体可以看这个地址:
http://fisheye1.atlassian.com/browse/springframework/spring/src/org/springframework/orm/ibatis/SqlMapClientFactoryBean.java?r1=1.17&r2=1.18

没想到Spring2.5.0还没解决的问题,在2.5.5就已经解决了. 
0 请登录后投票
   发表时间:2008-11-09  
<!-- 默认的SqlMapClient -->
<bean id="defaultSqlMapClient"
	class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
	<property name="dataSource" ref="defaultDataSource" />
	<property name="configLocation"
		value="classpath:talent/ibatis/sql-map-config.xml" />
	<!-- 自动加载sql-mapping文件 -->
	<property name="mappingLocations">
		<value>classpath:/talent/ibatis/sqlmap/**/*.xml</value>
	</property>
	<property name="useTransactionAwareDataSource" value="true"></property>
</bean>

spring2.5.5提供了自动扫描加载功能,如上博主可以试试!

另想请教博主一个spring事务不能回滚的问题,具体见问题频道:http://www.iteye.com/problems/6314
提前谢谢!!
0 请登录后投票
   发表时间:2009-01-22  
好像不行,感觉启动的时候没有加载CustomSqlMapClientFactoryBean
0 请登录后投票
   发表时间:2009-01-22  
好像不行,感觉启动的时候没有加载CustomSqlMapClientFactoryBean
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics