以下是对“spring基于通用Dao的多数据源配置详解”的完整攻略。
一、背景
在开发Java Web应用时,经常需要使用多个数据源来存储不同的业务数据。而Spring框架提供了多数据源的支持,通过配置多个数据源并使用通用Dao可以让我们更加方便和高效地实现多数据源的管理。
二、实现步骤
1. 导入依赖
在pom.xml文件中添加以下依赖:
<!--通用Dao的依赖-->
<dependency>
<groupId>com.github.dwadeleung</groupId>
<artifactId>universal-dao-spring</artifactId>
<version>1.0.0</version>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--Druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
2. 配置多数据源
在Spring的配置文件中定义多个数据源,并使用@ConfigurationProperties
注解将其配置信息注入到数据源配置类中。以下是一个包含两个数据源的示例:
<!--第一个数据源配置-->
<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</bean>
<!--第二个数据源配置-->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource2.driver-class-name}"/>
<property name="url" value="${spring.datasource2.url}"/>
<property name="username" value="${spring.datasource2.username}"/>
<property name="password" value="${spring.datasource2.password}"/>
</bean>
3. 配置JPA和通用Dao
接下来配置JPA和通用Dao,在配置JPA时需要指定数据源的名称,以便于后面进行多数据源的管理。以下是配置JPA的示例:
<!--JPA配置-->
<bean id="entityManagerFactory1"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource1"/>
<property name="packagesToScan" value="com.example.domain"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
</props>
</property>
</bean>
<!--第二个数据源的JPA配置-->
<bean id="entityManagerFactory2"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource2"/>
<property name="packagesToScan" value="com.example.domain"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
</props>
</property>
</bean>
<!--配置通用Dao-->
<bean id="dao1" class="com.github.dwadeleung.universal.dao.impl.UniversalDaoImpl">
<property name="entityManagerFactory" ref="entityManagerFactory1"/>
</bean>
<!--配置第二个数据源的通用Dao-->
<bean id="dao2" class="com.github.dwadeleung.universal.dao.impl.UniversalDaoImpl">
<property name="entityManagerFactory" ref="entityManagerFactory2"/>
</bean>
4. 测试数据源配置
最后,我们可以编写一个测试类对数据源的配置进行测试。以下是一个使用通用Dao查询多个数据源的示例:
@Repository
public class UserDao {
@Autowired
@Qualifier("dao1")
private UniversalDao dao1;
@Autowired
@Qualifier("dao2")
private UniversalDao dao2;
public void test(){
List<User> userList1 = dao1.findAll(User.class);
List<User> userList2 = dao2.findAll(User.class);
System.out.println(userList1);
System.out.println(userList2);
}
}
三、示例说明
为了更好地说明该配置流程,以下给出两个实际示例:
示例一
定义两个数据源dataSource1
和dataSource2
,其中dataSource1
是MySQL数据库,dataSource2
是Oracle数据库。
<!--MySQL数据源配置-->
<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource1.driver-class-name}"/>
<property name="url" value="${spring.datasource1.url}"/>
<property name="username" value="${spring.datasource1.username}"/>
<property name="password" value="${spring.datasource1.password}"/>
</bean>
<!--Oracle数据源配置-->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource2.driver-class-name}"/>
<property name="url" value="${spring.datasource2.url}"/>
<property name="username" value="${spring.datasource2.username}"/>
<property name="password" value="${spring.datasource2.password}"/>
</bean>
接下来是配置JPA和通用Dao的过程,这里不再赘述。最后我们编写一个测试类来验证数据源的配置是否正确。
@Repository
public class UserDao {
@Autowired
@Qualifier("dao1")
private UniversalDao dao1;
@Autowired
@Qualifier("dao2")
private UniversalDao dao2;
public void test(){
List<User> userList1 = dao1.findAll(User.class);
List<User> userList2 = dao2.findAll(User.class);
System.out.println(userList1);
System.out.println(userList2);
}
}
示例二
定义两个数据源dataSource1
和dataSource2
,其中dataSource1
是MySQL数据库,dataSource2
是SQL Server数据库。
<!--MySQL数据源配置-->
<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource1.driver-class-name}"/>
<property name="url" value="${spring.datasource1.url}"/>
<property name="username" value="${spring.datasource1.username}"/>
<property name="password" value="${spring.datasource1.password}"/>
</bean>
<!--SQL Server数据源配置-->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init">
<property name="driverClassName" value="${spring.datasource2.driver-class-name}"/>
<property name="url" value="${spring.datasource2.url}"/>
<property name="username" value="${spring.datasource2.username}"/>
<property name="password" value="${spring.datasource2.password}"/>
</bean>
接下来是配置JPA和通用Dao的过程,这里不再赘述。最后我们编写一个测试类来验证数据源的配置是否正确。
@Repository
public class UserDao {
@Autowired
@Qualifier("dao1")
private UniversalDao dao1;
@Autowired
@Qualifier("dao2")
private UniversalDao dao2;
public void test(){
List<User> userList1 = dao1.findAll(User.class);
List<User> userList2 = dao2.findAll(User.class);
System.out.println(userList1);
System.out.println(userList2);
}
}
四、总结
通过使用多数据源和通用Dao,我们可以更加方便和高效地实现多数据源的管理。在实际应用中,可以根据需要配置多个数据源,并且可以使用不同的数据库类型。同时,我们还可以通过编写测试程序来验证数据源的配置是否正确,以确保系统能够正常运行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring基于通用Dao的多数据源配置详解 - Python技术站