通过自定义注解区分数据源
有这样一种情况,只有一个持久层的mybatis包,包里的mapper接口所需要的数据源不同,这样就需要为不同的mapper接口注入不同的数据源。可以通过自定义注解区分。
此问题来源于公司项目采用的Oracle数据库,二期项目数据表在TPME用户下,会用到部分一期TPM用户下的部分数据表,而来自一期表的mapper接口和配置文件也放在了二期的mybatis包下。
下面通过MySQL数据库做一个演示。
数据库如下:
MySQL下有ssm和test数据库,ssm库里有book表,test库里有uesr表
mybaits包结构图:
其中BookMapper的数据源为ssm库中的book表,UserMapper的数据源为test库的user表
为了能够区分这两个Mapper的数据源,咱们需要扫描指定包。可以通过自定义注解扫描指定包。
自定义两个注解如下:
mapper接口和配置文件如下:
mysql.properties配置文件如下:
applicationContext-dao配置文件如下:
其中mapper扫描的时候需要指定自定义注解
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 9 <!-- 引入数据源配置文件 --> 10 <context:property-placeholder location="classpath:mysql.properties" /> 11 <!-- 配置数据源 --> 12 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 13 <property name="driverClass" value="${jdbc.driver}" /> 14 <property name="jdbcUrl" value="${jdbc.url}" /> 15 <property name="user" value="${jdbc.username}" /> 16 <property name="password" value="${jdbc.password}" /> 17 </bean> 18 19 <bean id="dataSource-test" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 20 <property name="driverClass" value="${test.jdbc.driver}" /> 21 <property name="jdbcUrl" value="${test.jdbc.url}" /> 22 <property name="user" value="${test.jdbc.username}" /> 23 <property name="password" value="${test.jdbc.password}" /> 24 </bean> 25 26 <!-- 配置mybatis会话工厂 --> 27 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 28 <property name="dataSource" ref="dataSource" /> 29 </bean> 30 31 <!-- 配置mybatis会话工厂 --> 32 <bean id="sqlSessionFactory-test" class="org.mybatis.spring.SqlSessionFactoryBean"> 33 <property name="dataSource" ref="dataSource-test" /> 34 </bean> 35 36 <!-- 配置包扫描 --> 37 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 38 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 39 <property name="basePackage" value="com.alphajuns.ssm.mybatis" /> 40 <property name="annotationClass" value="com.alphajuns.ssm.utils.BookRepository" /> 41 </bean> 42 43 <!-- 配置包扫描 --> 44 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 45 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory-test" /> 46 <property name="basePackage" value="com.alphajuns.ssm.mybatis" /> 47 <property name="annotationClass" value="com.alphajuns.ssm.utils.UserRepository" /> 48 </bean> 49 </beans>
对其进行测试,测试结果如下:
如果不采用注解区分,而只为mapper扫描包指定数据源,以上面的为例,只需要将来自同一数据库的表放在同一包下。