SpringMvc+Mybatis多数据源配置

业务场景:我们开发一个webService服务,这个服务,要对很多的数据库访问

                 对外提供数据接口~(一个项目连接多个数据库)

解决思路:一个项目对应多个数据库,就应该是一个项目有多个数据源,多个sqlSessionFactory,

                 多个事物,然后调用不同的controle或action访问

                不同的持久层达到访问不同数据库来解决问题!

 

上代码(一):基于配置实现

Java代码   收藏代码
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  2.     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>  
  3.     <property name="url" value="${center.connectionURL}"/>  
  4.     <property name="username"  value="${userName}"/>  
  5.     <property name="password" value="${password}"/>  
  6. </bean>  
  7. <!--  
  8. 或者基于jndi的数据源也OK   
  9. -->  
  10. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  11.     <property name="basePackage" value="com.xxx.dao.center"/>  
  12.     <property name="sqlSessionFactoryBeanName" value="cneterSqlSessionFactory"/>  
  13. </bean>  
  14.   
  15. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="cneterSqlSessionFactory">  
  16.     <property name="dataSource" ref="dataSource"></property>  
  17.     <property name="mapperLocations" value="classpath*:mapperConfig/center/*.xml"/>  
  18.     <property name="configLocation" value="classpath:mybatis-config.xml"/>  
  19. </bean>  
  20.   
  21. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  22.     <property name="dataSource" ref="dataSource"/>  
  23.     <span><span class="tag"><</span><span class="tag-name">qualifier</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"oracle"</span><span> </span><span class="tag">/></span><span>  </span></span>  
  24. </bean>  
  25. <tx:annotation-driven transaction-manager="transactionManager"/>  
  26. <!--center db end-->  
  27. <!--exdb-->  
  28. <bean id="dataSourceEx" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  29.     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>  
  30.     <property name="url" value="${ex.connectionURL}"/>  
  31.     <property name="username"  value="${userName}"/>  
  32.     <property name="password" value="${password}"/>  
  33. </bean>  
  34. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  35.     <property name="basePackage" value="com.xxx.dao.ex"/>  
  36.     <property name="sqlSessionFactoryBeanName" value="exSqlSessionFactory"/>  
  37. </bean>  
  38. <bean id="sqlSessionFactoryEx" class="org.mybatis.spring.SqlSessionFactoryBean" name="exSqlSessionFactory">  
  39.     <property name="dataSource" ref="dataSourceEx"></property>  
  40.     <property name="mapperLocations" value="classpath*:mapperConfig/ex/*.xml"/>  
  41.     <property name="configLocation" value="classpath:mybatis-config.xml"/>  
  42. </bean>  
  43. <bean id="transactionManagerEx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  44.     <property name="dataSource" ref="dataSourceEx"/>  
  45.     <span><span class="tag"><</span><span class="tag-name">qualifier</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"mysql"</span><span> </span><span class="tag">/></span><span>  </span></span>  
  46. </bean>  

 上代码(二):基于注解(参考,并未亲测)

Java代码   收藏代码
  1. import org.apache.ibatis.session.SqlSessionFactory;  
  2. import org.apache.ibatis.type.JdbcType;  
  3. import org.mybatis.spring.SqlSessionFactoryBean;  
  4. import org.mybatis.spring.mapper.MapperScannerConfigurer;  
  5. import org.springframework.context.annotation.Bean;  
  6. import org.springframework.context.annotation.ComponentScan;  
  7. import org.springframework.context.annotation.Configuration;  
  8. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
  9. import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;  
  10. import org.springframework.transaction.PlatformTransactionManager;  
  11. import org.springframework.transaction.annotation.EnableTransactionManagement;  
  12.   
  13. import javax.sql.DataSource;  
  14.   
  15. @Configuration  
  16. @ComponentScan(basePackages = "com.mycompany")  
  17. @EnableTransactionManagement(proxyTargetClass = true)  
  18. public class ApplicationConfig2 {  
  19.     public static final String DATA_SOURCE_NAME_1 = "jdbc/dataSource1";  
  20.     public static final String DATA_SOURCE_NAME_2 = "jdbc/dataSource2";  
  21.   
  22.     public static final String SQL_SESSION_FACTORY_NAME_1 = "sqlSessionFactory1";  
  23.     public static final String SQL_SESSION_FACTORY_NAME_2 = "sqlSessionFactory2";  
  24.   
  25.     public static final String MAPPERS_PACKAGE_NAME_1 = "com.mycompany.mappers.dao1";  
  26.     public static final String MAPPERS_PACKAGE_NAME_2 = "com.mycompany.mappers.dao2";  
  27.   
  28.     @Bean  
  29.     public DataSource dataSource1() {  
  30.         JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();  
  31.         return dsLookup.getDataSource(DATA_SOURCE_NAME_1);  
  32.     }  
  33.   
  34.     @Bean  
  35.     public DataSource dataSource2() {  
  36.         JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();  
  37.         return dsLookup.getDataSource(DATA_SOURCE_NAME_2);  
  38.     }  
  39.   
  40.     @Bean  
  41.     public PlatformTransactionManager transactionManager() {  
  42.         return new DataSourceTransactionManager(dataSource());  
  43.     }  
  44.   
  45.   
  46.     @Bean(name = SQL_SESSION_FACTORY_NAME_1)  
  47.     public SqlSessionFactory sqlSessionFactory1(DataSource dataSource1) throws Exception {  
  48.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();  
  49.         sqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName());  
  50.         sqlSessionFactoryBean.setDataSource(dataSource1);  
  51.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();  
  52.         sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);  
  53.         sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);  
  54.         return sqlSessionFactory;  
  55.     }  
  56.   
  57.     @Bean(name = SQL_SESSION_FACTORY_NAME_2)  
  58.     public SqlSessionFactory sqlSessionFactory2(DataSource dataSource2) throws Exception {  
  59.         SqlSessionFactoryBean diSqlSessionFactoryBean = new SqlSessionFactoryBean();  
  60.         diSqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName());  
  61.         diSqlSessionFactoryBean.setDataSource(dataSource2);  
  62.         SqlSessionFactory sqlSessionFactory = diSqlSessionFactoryBean.getObject();  
  63.         sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);  
  64.         sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);  
  65.         return sqlSessionFactory;  
  66.     }  
  67.   
  68.     @Bean  
  69.     public MapperScannerConfigurer mapperScannerConfigurer1() {  
  70.         MapperScannerConfigurer configurer = new MapperScannerConfigurer();  
  71.         configurer.setBasePackage(MAPPERS_PACKAGE_NAME_1);  
  72.         configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_1);  
  73.         return configurer;  
  74.     }  
  75.   
  76.     @Bean  
  77.     public MapperScannerConfigurer mapperScannerConfigurer2() {  
  78.         MapperScannerConfigurer configurer = new MapperScannerConfigurer();  
  79.         configurer.setBasePackage(MAPPERS_PACKAGE_NAME_2);  
  80.         configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_2);  
  81.         return configurer;  
  82.     }  
  83. }  

  上代码(三):基于注解(亲测实现,需要注意MapperScannerConfigurer防止死循环出现放到配置中)

Java代码   收藏代码
  1. // datasource1  
  2. @Configuration  
  3. @Profile("default")  
  4. @PropertySource("file:${xxx.config.path}/xxx.properties")  
  5. public class DataSourceConfig {  
  6.   
  7.     @Autowired  
  8.     private Environment env;  
  9.   
  10.     @Bean(name = "dataSource1")  
  11.     public DataSource dataSource1() {  
  12.         final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();  
  13.         dsLookup.setResourceRef(true);  
  14.         return dsLookup.getDataSource(env.getRequiredProperty("xxx.datasource.name1"));  
  15.     }  
  16. }  
  17.   
  18. @Configuration  
  19. @EnableTransactionManagement(proxyTargetClass = true)  
  20. public class IocMappingConfig {  
  21.       
  22.     @Autowired  
  23.     @Qualifier("dataSource1")  
  24.     private DataSource dataSource1;  
  25.   
  26.     @Bean(name="sqlSessionFactoryBean")  
  27.     public SqlSessionFactoryBean sqlSessionFactoryBean() throws SQLException, IOException {  
  28.         SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();  
  29.         sqlSessionFactory.setDataSource(dataSource1);  
  30.         PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();  
  31.         sqlSessionFactory.setMapperLocations(resolver.getResources("com/xxx/mapping1/*.xml"));  
  32.         return sqlSessionFactory;  
  33.     }  
  34.   
  35.     // 下面用配置替换,避免死循环(分割多spring-application-config可解决此问题)  
  36. //    @Bean  
  37. //    public MapperScannerConfigurer mappperConfigurer(){  
  38. //        MapperScannerConfigurer msc = new MapperScannerConfigurer();  
  39. //        msc.setBasePackage("com.xxx.mapping1");  
  40. //        msc.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");  
  41. //        // 对应的接口  
  42. //        return msc;  
  43. //    }  
  44.       
  45.     @Bean  
  46.     @Qualifier("utils"// 用于逻辑层事物的区分(@Transactional(value="utils",propagation=Propagation.REQUIRED,rollbackFor=Exception.class))  
  47.     public DataSourceTransactionManager transactionManager() throws SQLException{  
  48.         DataSourceTransactionManager txManager = new DataSourceTransactionManager();  
  49.         txManager.setDataSource(dataSource1);  
  50.         return txManager;  
  51.     }  
  52.       
  53. }  
  54.   
  55. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  56.         <property name="basePackage" value="com.xxx.mapping1" />  
  57.         <property name="SqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>  
  58.     </bean>  
  59.   
  60. // datasource2  
  61. @Configuration  
  62. @Profile("default")  
  63. @PropertySource("file:${xxx.config.path}/xxx.properties")  
  64. public class DataSourceConfig {  
  65.   
  66.     @Autowired  
  67.     private Environment env;  
  68.   
  69.     @Bean(name = "dataSource2")  
  70.     public DataSource dataSource2() {  
  71.         final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();  
  72.         dsLookup.setResourceRef(true);  
  73.         return dsLookup.getDataSource(env.getRequiredProperty("xxx.datasource.name2"));  
  74.     }  
  75. }  
  76.   
  77. @Configuration  
  78. @EnableTransactionManagement(proxyTargetClass = true)  
  79. public class IocMappingConfig {  
  80.       
  81.     @Autowired  
  82.     @Qualifier("dataSource2")  
  83.     private DataSource dataSource2;  
  84.   
  85.     @Bean(name="sqlSessionFactoryBean2")  
  86.     public SqlSessionFactoryBean sqlSessionFactoryBean2() throws SQLException, IOException {  
  87.         SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();  
  88.         sqlSessionFactory.setDataSource(dataSource2);  
  89.         PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();  
  90.         sqlSessionFactory.setMapperLocations(resolver.getResources("com/xxx/mapping2/*.xml"));  
  91.         return sqlSessionFactory;  
  92.     }  
  93.   
  94.     // 下面用配置替换,避免死循环(分割多spring-application-config可解决此问题)  
  95. //    @Bean  
  96. //    public MapperScannerConfigurer mappperConfigurer2(){  
  97. //        MapperScannerConfigurer msc = new MapperScannerConfigurer();  
  98. //        msc.setBasePackage("com.xxx.mapping2");  
  99. //        msc.setSqlSessionFactoryBeanName("sqlSessionFactoryBean2");  
  100. //        // 对应的接口  
  101. //        return msc;  
  102. //    }  
  103.       
  104.     @Bean  
  105.     @Qualifier("utils2"// 用于逻辑层事物的区分(@Transactional(value="utils2",propagation=Propagation.REQUIRED,rollbackFor=Exception.class))  
  106.     public DataSourceTransactionManager transactionManager2() throws SQLException{  
  107.         DataSourceTransactionManager txManager = new DataSourceTransactionManager();  
  108.         txManager.setDataSource(dataSource2);  
  109.         return txManager;  
  110.     }  
  111.       
  112. }  
  113.   
  114. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  115.         <property name="basePackage" value="com.xxx.mapping2" />  
  116.         <property name="SqlSessionFactoryBeanName" value="sqlSessionFactoryBean2"/>  
  117.     </bean>  

 单元测用H2数据库也是两套,数据源名字要对应,此处就不重复写了

 参考地址:http://zhuchengzzcc.iteye.com/blog/1827633

                   http://stackoverflow.com/questions/18201075/mybatis-spring-multiple-databases-java-configuration

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值