最近做项目要将读取到的数据同时插入到MySQL数据库和Oracle数据库当中,以前都是使用一个数据库,没有用过多数据源的情况,现在把这个问题搞定了,写下来希望对大家有点帮助,可能我所使用的方法不是最好的,希望多多指教。

首先是applicationContext.xml的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="com.ydcn.csv.dao"></context:component-scan>
<context:component-scan base-package="com.ydcn.csv.service"></context:component-scan>
<context:component-scan base-package="com.ydcn.csv.task"></context:component-scan>
<context:annotation-config></context:annotation-config> <!-- 管理MySQL的事务 -->
<tx:annotation-driven transaction-manager="mysqlTransactionManager" />
<!-- 管理Oracle的事务 -->
<tx:annotation-driven transaction-manager="oracleTransactionManager" /> <!-- MySQL的JNDI数据源 -->
<bean id="mysqlDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:MySQLTEST"></property>
</bean> <!-- MySQL的sessionFactory -->
<bean id="mysqlSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="mysqlDataSource"></property>
<!-- 注解的方式定义实体类 -->
<property name="annotatedClasses">
<list>
<value>com.ydcn.csv.entity.MerchantCateOne</value>
<value>com.ydcn.csv.entity.MerchantCateTwo</value>
<value>com.ydcn.csv.entity.MerchantCateThree</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>
<!-- <prop key="hibernate.show_sql">true</prop> -->
<!-- <prop key="hibernate.format_sql">true</prop> -->
</props>
</property>
</bean>
<!-- MySQL数据库事务管理 -->
<bean id="mysqlTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为MySQL的实现类注入SessionFactory -->
<bean id="mysqlMechantCateOneDao" class="com.ydcn.csv.dao.mysql.impl.MysqlMechantCateOneDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为操作MySQL数据库的实现类注入SessionFactory -->
<bean id="mysqlMerchantCateTwoDao" class="com.ydcn.csv.dao.mysql.impl.MysqlMerchantCateTwoDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- 为操作MySQL数据库的实现类注入SessionFactory -->
<bean id="mysqlMerchantCateThreeDao"
class="com.ydcn.csv.dao.mysql.impl.MysqlMerchantCateThreeDaoImpl">
<property name="sessionFactory" ref="mysqlSessionFactory"></property>
</bean> <!-- ####################### 配置Oracle数据信息 ################### --> <!-- Oracle 的JNDI数据源 -->
<bean id="oracleDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:ORACLETEST"></property>
</bean> <!-- Oracle 的SessionFactory -->
<bean id="oracleSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="oracleDataSource"></property>
<!-- 使用注解的方式定义实体类 -->
<property name="annotatedClasses">
<list>
<value>com.ydcn.csv.entity.TransCategoryData</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.jdbc.batch_size">50</prop>
<!-- <prop key="hibernate.show_sql">true</prop> -->
<!-- <prop key="hibernate.format_sql">true</prop> -->
</props>
</property>
</bean> <!-- Oracle事务管理配置 -->
<bean id="oracleTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="oracleSessionFactory"></property>
</bean> <!-- 为操作Oracle数据库的实现类注入SessionFactory -->
<bean id="oracleTransCategoryDataDao"
class="com.ydcn.csv.dao.oracle.impl.OracleTransCategoryDataDaoImpl">
<property name="sessionFactory" ref="oracleSessionFactory"></property>
</bean> <!-- #################################### 配置定时任务信息 ############################### -->
<!-- 读取 Transaction 和 Category CSV文件 -->
<bean id="readCSVTask" class="com.ydcn.csv.task.ReadCSVTask"></bean> <!-- 下载 CSV 文档 -->
<bean id="executeDownLoadCSVFileJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="readCSVTask"></property>
<property name="targetMethod" value="downLoadCSV"></property>
</bean>
<!-- 读取 CSV 文件 -->
<bean id="executeReadCSVFileJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="readCSVTask"></property>
<property name="targetMethod" value="readCSVFile"></property>
</bean> <!-- 定义下载CSV文档的时间 -->
<bean id="executeDownLoadCSVFileCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="executeDownLoadCSVFileJob"></property>
<property name="cronExpression" value="0 58 7 * * ?"></property>
</bean> <!-- 定义读取CSV文件的时间 -->
<bean id="executeReadCSVFileCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="executeReadCSVFileJob"></property>
<property name="cronExpression" value="0 0 8 * * ?"></property>
</bean> <!-- 总的管理类 将lazy-init="false" 那么容器启动的时候就会执行任务调度 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="executeDownLoadCSVFileCron"/>
<ref bean="executeReadCSVFileCron"/>
</list>
</property>
</bean> </beans>

我所使用的是泛型的方式去写:首先来看一下我的BaseDao吧!

package com.ydcn.csv.dao.base;

import java.util.List;

/**
* 基础的接口信息
* @author allen.tang
*
* @param <T>
*/
public interface BaseDao<T> { /**
* 保存实体的信息
* @param user
*/
public void save(T entity); /**
* 删除实体信息
* @param id
*/
public void delete(T entity); /**
* 更新实体信息
* @param user
*/
public void update(T entity); /**
* 根据id查询
* @param id
* @return
*/
public T queryById(int id); /**
* 查询出所有的信息
* @return
*/
public List<T> queryAll(); /**
* 根据特约商的代码查询出大类码的相关信息
* @param merchantGroupID
* @return
*/
public List<T> queryByMerchantGroupID(String merchantGroupID); }

这样所有的接口就可以继承这个BaseDao不用再一个一个的添加相同的方法,只要是相同的方法都可以写到BaseDao中,然后我们再来看看BaseDaoImpl

package com.ydcn.csv.dao.base;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /**
* 基础的接口实现
* @author allen.tang
*
* @param <T>
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport { private Class<T> entityClass; /**
* 通过反射获取子类的确定的泛型类
*/
public BaseDaoImpl() {
// Type genType = this.getClass().getGenericSuperclass();
// Type[] params =
// ((ParameterizedType)getClass()).getActualTypeArguments();
// entityClass = (Class<T>) params[0];
this.entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
} public BaseDaoImpl(Class clazz) {
this.entityClass = clazz;
} // @Autowired
// @Qualifier("mysqlDataSource")
// public void anyMethodName(SessionFactory sessionFactory) {
// setSessionFactory(sessionFactory);
// } public Session getCurrentSession() {
return this.getHibernateTemplate().getSessionFactory()
.getCurrentSession();
} /**
* 根据ID加载PO实例
*
* @param id
* @return 返回相应的PO实例
*/
public T get(Serializable id) {
return this.getHibernateTemplate().get(entityClass, id);
} /**
* 保存PO
*
* @param entity
*/
public void save(T entity) {
this.getHibernateTemplate().save(entity);
} /**
* 删除PO
*
* @param entity
*/
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
} /**
* 修改PO
*
* @param entity
*/
public void update(T entity) {
this.getHibernateTemplate().update(entity);
} /**
* 执行hql查询
*
* @param hql
* hql查询语句
* @return 返回查询结果
*/
public List<T> find(String hql) {
return this.getHibernateTemplate().find(hql);
} /**
* 执行带参的hql查询
*
* @param hql
* hql查询语句
* @param params
* 参数
* @return 返回查询的集合
*/
public List<T> find(String hql, Object... params) {
return this.getHibernateTemplate().find(hql, params);
} /**
* 返回Query对象
*
* @param hql
* hql查询语句
* @param params
* 查询参数
* @return 返回的Query对象
*/
public Query createQuery(String hql, Object... params) {
Query query = this.getSession().createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return query;
} /**
* 获取该类数据的总条数
*
* @return
*/
public int getCount() {
String hql = "select count(e) from " + entityClass.getSimpleName()
+ " e ";
Query query = this.createQuery(hql, null);
Long count = (Long) query.uniqueResult();
return count.intValue();
} /**
* 根据传入对象的编号获取对象的详细信息
*
* @param id
* 传入对象的id
* @return 返回正个对象
*/
public T queryById(int id) {
return this.get(id);
} /**
* 不进行分页的查询查询出所有的对象信息
*/
public List<T> queryAll() {
String hql = "from " + entityClass.getSimpleName();
List<T> list = find(hql);
return list;
} /**
* 根据特约商的代码查询出大类码的信息
*/
public List<T> queryByMerchantGroupID(String merchantGroupID) {
String hql = "from " + entityClass.getSimpleName() + " where merchantGroupID = ?";
List<T> list = find(hql, merchantGroupID);
return list;
} }

注释已经很详细了,这里我就不细说了,下面来看一下我的接口和实现类是怎么写的吧!

首先接口,只需要继承BaseDao,接口里就有了BaseDao的所有的方法,并加入了传入的类型

public interface TransCategoryDataDao extends BaseDao<TransCategoryData> {

}

然后实现类,这里使用注解的方式定义Dao层,之所以不仅继承了BaseDaoImpl类也实现了TransCateGoryDataDao接口是因为,有些方法可能是这个类独有的方法,需要这个类去单独实现,而不是放在公共的BaseDaoImp里面。

@Repository("oracleTransCategoryDataDao")
public class OracleTransCategoryDataDaoImpl extends BaseDaoImpl<TransCategoryData> implements TransCategoryDataDao{ }

然后其他的Service业务层的编写就和其他的项目的编写一样了。

可能考虑的有不全面的地方,希望各位高手多多指点

使用hibernate配置多数据源链接MySQL和Oracle数据库的更多相关文章

  1. ArcGIS 10.2 链接64位Oracle数据库

    https://my.oschina.net/zctzl/blog/909541 来自:https://blog.csdn.net/LoveCarpenter/article/details/5954 ...

  2. Spring+Hibernate配置多数据源

    配置说明 在实际应用中,经常会用到读写分离,这里就这种情况进行Spring+Hibernate的多数据源配置.此处的配置只是让读的方法操作一个数据库,写的方法操作另外一个数据库. 注:我这里的配置JD ...

  3. Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件

    用Hibernate配置连接数据库可以方便我们对POJO的操作,节省了很多时间和代码.下面就分别说明连接不同数据库需要在hibernate.cfg.xml做的配置. 需要数据库驱动包可以点击这里下载: ...

  4. sql server中使用链接服务器访问oracle数据库

    一.  安装配置oracle客户端 要访问orcale数据,必须在访问的客户端机器上安装oracle客户端. Orcale有两种形式的客户端: l         完整的客户端 包括访问服务器端数据库 ...

  5. SQL Server 2014 64位版本链接32位Oracle数据库

    问题背景: 刚进入公司不久的BI新手,最近接部门的一个交接项目,需要在SQL Server上通过openquery来获取Oracle数据库的数据.各种配置,各种设置折腾了一周之久.在此,将自己的问题解 ...

  6. 使用Oracle SQL Developer迁移MySQL至Oracle数据库

    Oracle SQL Developer是Oracle官方出品的数据库管理工具.本文使用Oracle SQL Developer执行从MySQL迁移至Oracle数据库的操作. 2017年3月6日 操 ...

  7. Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)

    Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没必要把 Tomcat 与 IIS 或 Apache 集成起来.在 Tomcat 自带的 ...

  8. MySql和Oracle数据库区别

    Oracle与mysql区别: 1.Oracle有表空间,mysql没有表空间. 2.mysql的char类型取值范围0-255字节,varchar为0-65535字节 3.oracle的char类型 ...

  9. JDBC连接各种数据库的方法,连接MySql,Oracle数据库

    JDBC连接各种数据库的方法: JDBC编程步骤: 1.导入jar包 2.注册驱动 3.获取数据库连接对象 4.定义SQL语句 5.获得执行SQL语句对象statemnet 6.执行SQL语句 7.处 ...

随机推荐

  1. [置顶] 如何在浏览器中打开PDF文件并实现预览的思路与代码

    编写项目遇到一个需要在浏览器中打开PDF文件的问题.最终实现效果如下: 其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框. 其实在网上经常见到类似的页面,在浏览器中打开pdf文 ...

  2. Elasticsearch template configuration

    Index templates allow defining templates thatwill automatically be applied to new indices created. T ...

  3. Linux下的Shell编程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  4. 集成Jenkins Notifier for Chrome到Jenkins CI

    Jenkins也算是现在最流行的CI工具了,我们team也使用它来做持续化集成的工作.最近需要增加弹出式窗口来提醒相关人员job的状态,故选择Jenkins Notifier for Chrome这个 ...

  5. iOS开发-HTTP请求

    什么是URL?URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URLURL的基本格式: URL中常见的协议 (1)HTTP 超文本传输协议,访问的是远程的网络资源,格式是http:// h ...

  6. :app:transformResourcesWithMergeJavaResForDebug FAILED

    资源xml有错误,应该排查每一处xml. 如果提示gradle相关错误,需要修改系统级的build.gradle和程序级的build.gradle,比如后者不能缺少:dependencies {    ...

  7. 数据结构复习:交换排序原理及C++实现

    1. 交换排序的基本思想 两两比较key值,如果发生逆序(排列的顺序与期望的顺序相反)就交换,知道所有对象都排序完毕!常见的3种交换排序算法:冒泡排序,shaker排序和快速排序. 2. 冒泡排序 设 ...

  8. iframe自适应高度的多种方法小结

    转自:http://www.jb51.net/article/15780.htm 不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的大小 ...

  9. .net 调用C++类库

    事实上这一直是个非常无解的问题.最好的办法是将C++类库写成COM. 可是有时候往往不能这个做.那就仅仅有两种办法:转成C函数形式或者Manage C++封装. 下文就介绍了这两种方法. 原帖:htt ...

  10. iOS开发——动画总结OC篇&所有常用动画总结

    所有常用动画总结 先来装下B,看不懂没关系,其实我也看不懂-