MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。
不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
每个数据库对应一个 SqlSessionFactory 实例
所以在使用mybatis + spring时,应配置两个数据源(datasource),每个数据源对应一个SqlSessionFactory,然后为不同的SqlSessionFactory配置不同的
<mybatis:scan base-package ../>
即可,要注意的的是,base-package
范围小的需要放在配置文件前面
例子:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- 配置数据源 -->
<bean id="dataSourceChain" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${ac.jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${ac.chain.jdbc.url}"/>
<property name="user" value="${ac.chain.jdbc.username}"/>
<property name="password" value="${ac.chain.jdbc.password}"/>
<property name="minPoolSize" value="${ac.jdbc.miniPoolSize}"/>
<property name="maxPoolSize" value="${ac.jdbc.maxPoolSize}"/>
<property name="initialPoolSize" value="${ac.jdbc.initialPoolSize}"/>
<property name="maxIdleTime" value="${ac.jdbc.maxIdleTime}"/>
<property name="acquireIncrement" value="${ac.jdbc.acquireIncrement}"/>
<property name="acquireRetryAttempts" value="${ac.jdbc.acquireRetryAttempts}"/>
<property name="acquireRetryDelay" value="${ac.jdbc.acquireRetryDelay}"/>
<property name="testConnectionOnCheckin" value="${ac.jdbc.testConnectionOnCheckin}"/>
<property name="automaticTestTable" value="${ac.jdbc.automaticTestTable}"/>
<property name="idleConnectionTestPeriod" value="${ac.jdbc.idleConnectionTestPeriod}"/>
<property name="checkoutTimeout" value="${ac.jdbc.checkoutTimeout}"/>
</bean>
<!--- 第二个数据源 -->
<bean id="dataSourceApp" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${ac.jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${ac.app.jdbc.url}"/>
<property name="user" value="${ac.app.jdbc.username}"/>
<property name="password" value="${ac.app.jdbc.password}"/>
<property name="minPoolSize" value="${ac.jdbc.miniPoolSize}"/>
<property name="maxPoolSize" value="${ac.jdbc.slave.maxPoolSize}"/>
<property name="initialPoolSize" value="${ac.jdbc.initialPoolSize}"/>
<property name="maxIdleTime" value="${ac.jdbc.maxIdleTime}"/>
<property name="acquireIncrement" value="${ac.jdbc.acquireIncrement}"/>
<property name="acquireRetryAttempts" value="${ac.jdbc.acquireRetryAttempts}"/>
<property name="acquireRetryDelay" value="${ac.jdbc.acquireRetryDelay}"/>
<property name="testConnectionOnCheckin" value="${ac.jdbc.testConnectionOnCheckin}"/>
<property name="automaticTestTable" value="${ac.jdbc.automaticTestTable}"/>
<property name="idleConnectionTestPeriod" value="${ac.jdbc.idleConnectionTestPeriod}"/>
<property name="checkoutTimeout" value="${ac.jdbc.checkoutTimeout}"/>
</bean>
<mybatis:scan base-package="com.petkit.ac.adaptor.mapper.chain" factory-ref="mybatisSqlSessionFactoryChain" />
<bean id="mybatisSqlSessionFactoryChain" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceChain"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:/config/mapper/chain/*.xml"/>
</bean>
<mybatis:scan base-package="com.petkit.ac.adaptor.mapper.app" factory-ref="mybatisSqlSessionFactoryApp" />
<bean id="mybatisSqlSessionFactoryApp" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceApp"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:/config/mapper/app/*.xml"/>
</bean>
</beans>