`

SpringMvc+Mybatis多数据源配置

阅读更多

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

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

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

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

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

 

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

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="${center.connectionURL}"/>
    <property name="username"  value="${userName}"/>
    <property name="password" value="${password}"/>
</bean>
<!--
或者基于jndi的数据源也OK 
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.xxx.dao.center"/>
    <property name="sqlSessionFactoryBeanName" value="cneterSqlSessionFactory"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="cneterSqlSessionFactory">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="classpath*:mapperConfig/center/*.xml"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    <qualifier value="oracle" />  
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--center db end-->
<!--exdb-->
<bean id="dataSourceEx" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="${ex.connectionURL}"/>
    <property name="username"  value="${userName}"/>
    <property name="password" value="${password}"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.xxx.dao.ex"/>
    <property name="sqlSessionFactoryBeanName" value="exSqlSessionFactory"/>
</bean>
<bean id="sqlSessionFactoryEx" class="org.mybatis.spring.SqlSessionFactoryBean" name="exSqlSessionFactory">
    <property name="dataSource" ref="dataSourceEx"></property>
    <property name="mapperLocations" value="classpath*:mapperConfig/ex/*.xml"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="transactionManagerEx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceEx"/>
    <qualifier value="mysql" />  
</bean>

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

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@ComponentScan(basePackages = "com.mycompany")
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfig2 {
    public static final String DATA_SOURCE_NAME_1 = "jdbc/dataSource1";
    public static final String DATA_SOURCE_NAME_2 = "jdbc/dataSource2";

    public static final String SQL_SESSION_FACTORY_NAME_1 = "sqlSessionFactory1";
    public static final String SQL_SESSION_FACTORY_NAME_2 = "sqlSessionFactory2";

    public static final String MAPPERS_PACKAGE_NAME_1 = "com.mycompany.mappers.dao1";
    public static final String MAPPERS_PACKAGE_NAME_2 = "com.mycompany.mappers.dao2";

    @Bean
    public DataSource dataSource1() {
        JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        return dsLookup.getDataSource(DATA_SOURCE_NAME_1);
    }

    @Bean
    public DataSource dataSource2() {
        JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        return dsLookup.getDataSource(DATA_SOURCE_NAME_2);
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }


    @Bean(name = SQL_SESSION_FACTORY_NAME_1)
    public SqlSessionFactory sqlSessionFactory1(DataSource dataSource1) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName());
        sqlSessionFactoryBean.setDataSource(dataSource1);
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
        sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
        sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);
        return sqlSessionFactory;
    }

    @Bean(name = SQL_SESSION_FACTORY_NAME_2)
    public SqlSessionFactory sqlSessionFactory2(DataSource dataSource2) throws Exception {
        SqlSessionFactoryBean diSqlSessionFactoryBean = new SqlSessionFactoryBean();
        diSqlSessionFactoryBean.setTypeHandlersPackage(DateTimeTypeHandler.class.getPackage().getName());
        diSqlSessionFactoryBean.setDataSource(dataSource2);
        SqlSessionFactory sqlSessionFactory = diSqlSessionFactoryBean.getObject();
        sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
        sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);
        return sqlSessionFactory;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer1() {
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setBasePackage(MAPPERS_PACKAGE_NAME_1);
        configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_1);
        return configurer;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer2() {
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setBasePackage(MAPPERS_PACKAGE_NAME_2);
        configurer.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_NAME_2);
        return configurer;
    }
}

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

// datasource1
@Configuration
@Profile("default")
@PropertySource("file:${xxx.config.path}/xxx.properties")
public class DataSourceConfig {

    @Autowired
    private Environment env;

    @Bean(name = "dataSource1")
    public DataSource dataSource1() {
        final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        dsLookup.setResourceRef(true);
        return dsLookup.getDataSource(env.getRequiredProperty("xxx.datasource.name1"));
    }
}

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class IocMappingConfig {
	
    @Autowired
    @Qualifier("dataSource1")
    private DataSource dataSource1;

    @Bean(name="sqlSessionFactoryBean")
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws SQLException, IOException {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource1);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactory.setMapperLocations(resolver.getResources("com/xxx/mapping1/*.xml"));
        return sqlSessionFactory;
    }

    // 下面用配置替换,避免死循环(分割多spring-application-config可解决此问题)
//    @Bean
//    public MapperScannerConfigurer mappperConfigurer(){
//        MapperScannerConfigurer msc = new MapperScannerConfigurer();
//        msc.setBasePackage("com.xxx.mapping1");
//        msc.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
//        // 对应的接口
//        return msc;
//    }
    
	@Bean
	@Qualifier("utils") // 用于逻辑层事物的区分(@Transactional(value="utils",propagation=Propagation.REQUIRED,rollbackFor=Exception.class))
	public DataSourceTransactionManager transactionManager() throws SQLException{
		DataSourceTransactionManager txManager = new DataSourceTransactionManager();
		txManager.setDataSource(dataSource1);
		return txManager;
	}
	
}

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.xxx.mapping1" />
		<property name="SqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
	</bean>

// datasource2
@Configuration
@Profile("default")
@PropertySource("file:${xxx.config.path}/xxx.properties")
public class DataSourceConfig {

    @Autowired
    private Environment env;

    @Bean(name = "dataSource2")
    public DataSource dataSource2() {
        final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        dsLookup.setResourceRef(true);
        return dsLookup.getDataSource(env.getRequiredProperty("xxx.datasource.name2"));
    }
}

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class IocMappingConfig {
	
    @Autowired
    @Qualifier("dataSource2")
    private DataSource dataSource2;

    @Bean(name="sqlSessionFactoryBean2")
    public SqlSessionFactoryBean sqlSessionFactoryBean2() throws SQLException, IOException {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource2);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactory.setMapperLocations(resolver.getResources("com/xxx/mapping2/*.xml"));
        return sqlSessionFactory;
    }

    // 下面用配置替换,避免死循环(分割多spring-application-config可解决此问题)
//    @Bean
//    public MapperScannerConfigurer mappperConfigurer2(){
//        MapperScannerConfigurer msc = new MapperScannerConfigurer();
//        msc.setBasePackage("com.xxx.mapping2");
//        msc.setSqlSessionFactoryBeanName("sqlSessionFactoryBean2");
//        // 对应的接口
//        return msc;
//    }
    
	@Bean
	@Qualifier("utils2") // 用于逻辑层事物的区分(@Transactional(value="utils2",propagation=Propagation.REQUIRED,rollbackFor=Exception.class))
	public DataSourceTransactionManager transactionManager2() throws SQLException{
		DataSourceTransactionManager txManager = new DataSourceTransactionManager();
		txManager.setDataSource(dataSource2);
		return txManager;
	}
	
}

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.xxx.mapping2" />
		<property name="SqlSessionFactoryBeanName" value="sqlSessionFactoryBean2"/>
	</bean>

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

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

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

 

4
0
分享到:
评论

相关推荐

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载

    4. 配置Mybatis:创建mybatis的全局配置文件,mybatis-config.xml,配置数据源、SqlSessionFactory等,以及Mapper的XML配置文件。 5. 编写DAO层:定义Mapper接口,编写对应的Mapper XML文件,实现SQL语句。 6. 业务...

    Spring+SpringMVC+Mybatis多数据源

    总结来说,"Spring+SpringMVC+Mybatis多数据源"的整合涉及了Spring的数据源管理、SpringMVC的请求路由、Mybatis的数据源配置以及事务管理。具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化...

    图书管理系统SpringMvc+mybatis

    《图书管理系统SpringMvc+Mybatis实现详解》 在IT领域,构建高效、稳定的软件系统是至关重要的。本项目“图书管理系统”就是这样一个实例,它利用了SpringMvc和Mybatis两大主流框架,为图书管理提供了全面的解决...

    SpringMVC+Mybatis,CRM系统教程和源代码(SSM项目)

    **SpringMVC+Mybatis,CRM系统教程与源代码详解** 在现代企业信息化管理中,客户关系管理系统(CRM)扮演着至关重要的角色。本教程将深入讲解如何利用SpringMVC和Mybatis两大主流技术框架构建一个完整的CRM系统,...

    spring+springmvc+mybatis

    在实际项目中,开发者通常会创建一个配置文件(如:`springmvc_mybatis1208`可能包含的`spring-config.xml`),在其中配置Spring和MyBatis的相关设置,包括数据源、事务管理器、SqlSessionFactory等。同时,还需要...

    spring + springmvc + mybatis 整合 及 mybatis-pagehelper分页

    3. **配置MyBatis**:在MyBatis的配置文件`mybatis-config.xml`中,配置数据源、事务工厂和映射文件的位置。同时,每个Mapper接口需要与对应的XML映射文件关联。 4. **PageHelper分页插件**:MyBatis-PageHelper是...

    spring+springMVC+Mybatis demo参考

    2. 配置Spring:创建Spring的配置文件,定义Bean、数据源、事务管理器等,以及Spring与Mybatis的整合配置。 3. 配置SpringMVC:配置DispatcherServlet,定义视图解析器,处理拦截器,以及Controller的映射。 4. 配置...

    Spring+SpringMVC+Mybatis动态链接多数据源

    在企业级应用开发中,数据源管理是至关重要的部分,特别...通过这个项目,你可以学习到如何在Spring、SpringMVC和Mybatis的环境下实现动态多数据源的配置和管理,这对于大型分布式系统的设计和开发具有很高的实践价值。

    使用intellij idea搭建MAVEN+SSM(Spring+SpringMVC+MyBatis

    - 创建Spring的配置文件如`applicationContext.xml`,配置Bean,包括数据源、SqlSessionFactory、MyBatis的MapperScannerConfigurer等。 5. **配置SpringMVC** - 创建`web.xml`文件,配置DispatcherServlet、...

    springmvc+mybatis+shiro jar包

    Spring MVC、MyBatis 和 ...在实际项目中,还需要配置相应的XML或Java配置文件,定义bean、数据源、事务管理器等,以实现各组件间的协同工作。同时,根据项目需求,可能还需集成其他工具,如日志、缓存、定时任务等。

    springmvc+mybatis+redis

    在MyBatis中,可以配置数据源、事务管理器以及Mapper接口,以便与SpringMVC进行交互。对于Redis,可以设置连接池,定义键值策略,并在需要缓存数据的地方调用RedisTemplate的方法。 例如,在处理用户登录请求时,...

    Spring+SpringMVC+Mybatis+Velocity+Maven demo

    4. **配置Mybatis**:配置mybatis-config.xml,指定mapper文件的位置,以及数据源和SqlSessionFactory的配置。 5. **创建Velocity模板**:在src/main/webapp/WEB-INF/velocity目录下创建Velocity模板文件,用于渲染...

    基于springMVC+mybatis+easyui的留言板源码

    《构建基于SpringMVC+MyBatis+EasyUI的留言板系统》 在现代Web开发中,构建一个功能完善的留言板系统是常见的需求。本资源提供了一个简单的实现案例,它基于SpringMVC、MyBatis和EasyUI这三个流行的技术框架,旨在...

    Spring+SpringMVC+Mybatis框架整合例子(SSM)

    4. **配置Mybatis**:编写mybatis的配置文件,包含数据源、事务管理器、SqlSessionFactory的配置,以及Mapper XML文件的路径。 5. **编写Mapper接口和XML文件**:定义数据库操作的方法,并在对应的XML文件中编写SQL...

    Spring+SpringMVC+Mybatis框架项目整合

    2. **配置Spring**:创建Spring的配置文件(如`applicationContext.xml`),配置Bean定义,包括数据源、SqlSessionFactoryBean、MapperScannerConfigurer等。这些配置用于初始化Spring容器并管理各个组件。 3. **...

    Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统.rar

    项目描述 在上家公司自己集成的一套系统,用了两个多月的时间完成的:Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级开发系统 Springboot作为容器,使用mybatis作为持久层框架 使用官方推荐的thymeleaf做为...

    SSM(Spring+springmvc+mybatis)项目实例.zip

    SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,它将Spring的核心容器、Spring MVC作为视图控制器以及MyBatis作为持久层框架集成在一起,为开发者提供了一种高效且灵活的开发方式。...

    Spring+SpringMVC+Mybatis框架整合例子——亲测可用.zip

    1. 引入依赖:在项目中添加Spring、SpringMVC和Mybatis的相应库,并配置pom.xml或build.gradle文件。 2. 配置Spring:创建Spring的配置文件(如applicationContext.xml),定义Bean,包括DataSource、...

    ssm(Spring+SpringMVC+MyBatis)整合框架

    4. **配置MyBatis**:编写MyBatis的全局配置文件`mybatis-config.xml`,设置数据源、事务管理器等,同时为每个Mapper接口创建对应的XML映射文件。 5. **编写业务代码**:实现Service层接口,处理业务逻辑;编写...

Global site tag (gtag.js) - Google Analytics