正常的逻辑高设多个dataSource,并注入相应的dao,dao注入相应的mapping.
jdbc.properties
mypt.url=jdbc:mysql://192.168.1.42:3306/epi_ningxia_utf8_test?useUnicode=true&allowMultiQueries=true&characterEncoding=utf8&characterSetResults=utf8&useOldAliasMetadataBehavior=true mypt.username=sa mypt.password=123456 qzj.url=jdbc:mysql://192.168.1.42:3306/epi_ningxia_qzj?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useOldAliasMetadataBehavior=true qzj.username=sa qzj.password=123456 jdbc.driver=com.mysql.jdbc.Driver jdbc.initialSize=10 jdbc.maxActive=30 jdbc.maxIdle=5 jdbc.minIdle=1 jdbc.maxWait=2000
spring-mybatis.xml
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> <!-- ------------免疫平台 start-------------------------- --> <bean id="qzjdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${mypt.url}" /> <property name="username" value="${mypt.username}" /> <property name="password" value="${mypt.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="${jdbc.initialSize}"></property> <!-- 连接池最大数量 --> <property name="maxActive" value="${jdbc.maxActive}"></property> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${jdbc.maxIdle}"></property> <!-- 连接池最小空闲 --> <property name="minIdle" value="${jdbc.minIdle}"></property> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${jdbc.maxWait}"></property> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="qzj_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="qzjdataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:com/shensu/mapping/qzj/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="qzj_sqlSessionFactory1"> <property name="basePackage" value="com.shensu.dao.qzj" /> <property name="sqlSessionFactoryBeanName" value="qzj_sqlSessionFactory"></property> </bean> <!-- --------------免疫平台 end------------------- --> <!-- ------前置机start------ --> <bean id="myptdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${qzj.url}" /> <property name="username" value="${qzj.username}" /> <property name="password" value="${qzj.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="${jdbc.initialSize}"></property> <!-- 连接池最大数量 --> <property name="maxActive" value="${jdbc.maxActive}"></property> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${jdbc.maxIdle}"></property> <!-- 连接池最小空闲 --> <property name="minIdle" value="${jdbc.minIdle}"></property> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${jdbc.maxWait}"></property> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="mypt_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="myptdataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:com/shensu/mapping/mypt/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mypt_sqlSessionFactory1"> <property name="basePackage" value="com.shensu.dao.mypt" /> <property name="sqlSessionFactoryBeanName" value="mypt_sqlSessionFactory"></property> </bean> <!-- ----前置机 end---- --> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="myptdataSource" /> </bean>
我觉得这样已经差不多,网上大部分的资料也是这么配置的,但这边会有一直报一个错,
严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException:
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.shensu.common.connect.sql.SqlMapSupport.setSqlSessionFactory(org.apache.ibatis.session.SqlSessionFactory);
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined: expected single matching bean but found 2: [qzj_sqlSessionFactory, mypt_sqlSessionFactory]
意思是
SqlSessionFactory应该只有一个,但有两个所以报错。
后来查看了资料,我们的dao会继承DaoSupport,但DaoSupport只能配一个SqlSessionFactory,所以这边我们要分重写,各自的数据源拥有各自的DaoSupport。
重写如下:
package com.shensu.common.connect.sql; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.dao.support.DaoSupport; public class QZJSqlSessionDaoSupport extends DaoSupport{ private SqlSession sqlSession; private boolean externalSqlSession; @Autowired(required = false) public final void setSqlSessionFactory(@Qualifier("qzj_sqlSessionFactory") SqlSessionFactory sqlSessionFactory) { if (!this.externalSqlSession) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } } @Autowired(required = false) public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSession = sqlSessionTemplate; this.externalSqlSession = true; } /** * Users should use this method to get a SqlSession to call its statement methods * This is SqlSession is managed by spring. Users should not commit/rollback/close it * because it will be automatically done. * * @return Spring managed thread safe SqlSession */ public final SqlSession getSqlSession() { return this.sqlSession; } @Override protected void checkDaoConfig() throws IllegalArgumentException { System.out.println("Property ‘qzj_sqlSessionFactory’ or ‘qzj_sqlSessionFactory’ are required"); //notNull(this.sqlSession, "Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required"); } }
然后dao继承这个QZJSqlSessionDaoSupport,其它的数据源类似。
然后就不会报错了。。。。。