Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx

上传人:b****1 文档编号:12518852 上传时间:2023-04-19 格式:DOCX 页数:32 大小:24.71KB
下载 相关 举报
Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx_第1页
第1页 / 共32页
Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx_第2页
第2页 / 共32页
Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx_第3页
第3页 / 共32页
Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx_第4页
第4页 / 共32页
Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx

《Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx》由会员分享,可在线阅读,更多相关《Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx(32页珍藏版)》请在冰豆网上搜索。

Spring33 整合 Hibernate3 MyBatis32 配置多数据源动态切换数据源 方法.docx

Spring33整合Hibernate3MyBatis32配置多数据源动态切换数据源方法

Spring3.3整合Hibernate3、MyBatis3.2配置多数据源/动态切换数据源方法

一、开篇

这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能。

所以在出来数据库方言的时候基本上没有什么问题,但唯一可能出现问题的就是在hibernate做添加操作生成主键策略的时候。

因为我们都知道hibernate的数据库本地方言会针对不同的数据库采用不同的主键生成策略。

所以针对这一问题不得不采用自定义的主键生成策略,自己写一个主键生成器的表来维护主键生成方式或以及使用其他的方式来生成主键,从而避开利用hibernate默认提供的主键生成方式。

所以存在问题有:

怎样动态的切换数据库方言?

这个问题还没有解决,没有更多时间来研究。

不过想想应该可以配置两个SessionFactory来实现,那又存在怎么样动态切换SessionFactory呢?

需要解决这个问题才行,而这里则演示怎么样动态切换DataSource数据源的方法。

 

二、代码演示

在演示开始之前你的项目已经成功的整合完成的情况下才行,如果你还不知道怎么使用Spring整合MyBatis和Spring整合Hibernate的话。

建议参考之前的文章:

MyBatis3整合Spring3、SpringMVC3、Struts2、Spring、Hibernate整合ExtJS这两篇文章结合起来就可以完成整合是几大框架了。

这里重点介绍动态切换DataSource数据源的方法!

1、datasource的配置applicationContext-datasource.xml

xmlversion="1.0"encoding="UTF-8"?

>

//www.springframework.org/schema/beans"

xmlns:

aop="http:

//www.springframework.org/schema/aop"

xmlns:

tx="http:

//www.springframework.org/schema/tx"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans-3.2.xsd

http:

//www.springframework.org/schema/aop

http:

//www.springframework.org/schema/aop/spring-aop-3.2.xsd

http:

//www.springframework.org/schema/tx

http:

//www.springframework.org/schema/tx/spring-tx-3.2.xsd">

--配置c3p0数据源-->

mysql:

//172.31.108.178:

3306/world?

useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>

 

--注意这里的value是和上面的DataSource的id对应,key要和下面的CustomerContextHolder中的常量对应-->

--Annotation配置sessionFactory,配置数据库连接,注入hibernate数据库配置-->

--propkey="hibernate.dialect">org.hibernate.dialect.OracleDialect

--链接释放策略on_close|after_transaction|after_statement|auto-->

after_transaction

true

true

--propkey="hibernate.hbm2ddl.auto">update

--propertyname="configLocation"value="classpath:

hibernate.cfg.xml"/-->

 

--事务管理器,注入sessionFactory-->

--配置事务的传播特性-->

adviceid="txAdvice"transaction-manager="transactionManager">

attributes>

methodname="add*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="edit*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="remove*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="insert*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="save*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="update*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="modify*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="delete*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="execute*"propagation="REQUIRED"rollback-for="java.lang.Exception"/>

methodname="*"read-only="true"/>

attributes>

advice>

--配置那些类、方法纳入到事务的管理-->

config>

pointcutexpression="execution(*com.hoo.**.service.impl.*.*(..))"id="transactionManagerMethod"/>

advisoradvice-ref="txAdvice"pointcut-ref="transactionManagerMethod"/>

config>

--配置SqlSessionFactoryBean-->

mybatis.xml"/>

--mapper和resultmap配置路径-->

--表示在com.hoo目录下的任意包下的resultmap包目录中,以-resultmap.xml或-mapper.xml结尾所有文件-->

classpath:

com/hoo/framework/mybatis/mybatis-common.xml

classpath:

com/hoo/**/resultmap/*-resultmap.xml

classpath:

com/hoo/**/mapper/*-mapper.xml

classpath:

com/hoo/**/mapper/**/*-mapper.xml

--通过扫描的模式,扫描目录在com/hoo/任意目录下的mapper目录下,所有的mapper都需要继承SqlMapper接口的接口-->

上面分配配置了Oracle和MySQL数据源,MultipleDataSource为自定义的DataSource,它是继承AbstractRoutingDataSource实现抽象方法即可。

 

2、MultipleDataSource实现AbstractRoutingDataSource抽象数据源中方法,定义CustomerContextHolder来动态切换数据源。

代码如下:

packagecom.hoo.framework.spring.support;

 

importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

 

/**

*function:

Spring多数据源实现

*@authorhoojo

*@createDate2013-9-27上午11:

24:

53

*@fileMultipleDataSource.java

*@packagecom.hoo.framework.spring.support

*@projectSHMB

*@blog

*@emailhoojo_@

*@version1.0

*/

publicclassMultipleDataSourceextendsAbstractRoutingDataSource{

 

@Override

protectedObjectdetermineCurrentLookupKey(){

returnCustomerContextHolder.getCustomerType();

}

}

 

CustomerContextHolder

packagecom.hoo.framework.spring.support;

 

/**

*function:

多数据源

*@authorhoojo

*@createDate2013-9-27上午11:

36:

57

*@fileCustomerContextHolder.java

*@packagecom.hoo.framework.spring.support

*@projectSHMB

*@blog

*@emailhoojo_@

*@version1.0

*/

publicabstractclassCustomerContextHolder{

 

publicfinalstaticStringDATA_SOURCE_ORACLE="oracleDataSource";

publicfinalstaticStringDATA_SOURCE_MYSQL="mySqlDataSource";

privatestaticfinalThreadLocalcontextHolder=newThreadLocal();

publicstaticvoidsetCustomerType(StringcustomerType){

contextHolder.set(customerType);

}

publicstaticStringgetCustomerType(){

returncontextHolder.get();

}

publicstaticvoidclearCustomerType(){

contextHolder.remove();

}

}

其中,常量对应的applicationContext-datasource.xml中的multipleDataSource中的targetDataSource的key,这个很关键不要搞错了。

 

3、测试看能否切换数据源

packagecom.hoo.framework.service.impl;

 

importorg.junit.Test;

importorg.junit.runner.RunWith;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.beans.factory.annotation.Qualifier;

importorg.springframework.test.context.ContextConfiguration;

importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

importcom.hoo.framework.dao.BaseDao;

importcom.hoo.framework.log.ApplicationLogging;

importcom.hoo.framework.spring.support.CustomerContextHolder;

 

 

/**

*function:

多数据源测试服务接口测试

*@authorhoojo

*@createDate2013-10-10上午11:

18:

18

*@fileMultipleDataSourceServiceImplTest.java

*@packagecom.hoo.framework.service.impl

*@projectSHMB

*@blog

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1