通过自定义注解区分数据源

Posted alphajuns

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过自定义注解区分数据源相关的知识,希望对你有一定的参考价值。

有这样一种情况,只有一个持久层的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扫描包指定数据源,以上面的为例,只需要将来自同一数据库的表放在同一包下。

 

以上是关于通过自定义注解区分数据源的主要内容,如果未能解决你的问题,请参考以下文章

简单使用自定义注解

简单使用自定义注解

java注释的自定义

自定义注解,通过反射获得注解中的值(详细自定义注解解释)

自定义SpringBoot Starter 通过注解启动装配

Java如何自定义注解