让iBATIS支持多个sql-map-config.xml配置文件注: Spring2.5.5以上 已经开始支持多个configLocations 和 ma
让iBATIS支持多个sql-map-config.xml配置文件
注: 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" 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" 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.xmlsql-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中即可. .
因为:
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就已经解决了.

<!-- 默认的SqlMapClient --><bean id="defaultSqlMapClient"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
提前谢谢!! 8 楼 xuyiooo 2009-01-22 好像不行,感觉启动的时候没有加载CustomSqlMapClientFactoryBean 9 楼 xuyiooo 2009-01-22 好像不行,感觉启动的时候没有加载CustomSqlMapClientFactoryBean