Hibernate 连接访问多个数据库(含访问不同数据库的相同表)(转)
利用hibernate访问不同数据库中的不同表或不同数据库中的相同表。
本人在开发过程中的解决方案,希望大家交流。
一般用myEclipse工具会自动生成Hibernate的相关文件,大致有下面几类:
(1)数据库配置文件:.cfg.xml
(2)映射文件.hbm.xml
(3)映射类:pojo
(4)会话工厂类:SessionFactory
(5)基础DAO接口:IBaseHibernateDAO
(6)DAO接口的实现基础类:BaseHibernateDAO
(7)数据访问对象:DAO。所有DAO默认继承BaseHibernateDAO
当然,不同的工具生成的文件也略有差异,但不影响实现思路。
一般工具生成的配置只针对一个数据库,所以都生成了一个数据库配置文件。
下面我以访问不同数据库中相同的表做例子,访问不同数据库的不同表原理类同。
假设有两个数据库db1和db2,两个库中都有user表,要实现对两个数据库中的表访问,操作如下:
(1)配置两个数据库配置文件:db1.cfg.xml和db2.cfg.xml,分别连接两个数据库。
(2)配置两个SessionFactory:SessionFactory_db1绑定db1.cfg.xml,SessionFactory_db2,绑定db2.cfg.xml。
(3)基础DAO接口:IBaseHibernateDAO保持不变,代码默认如下
public interface IBaseHibernateDAO {
public Session getSession( );
}
(4)DAO接口的实现基础类:BaseHibernateDAO改造后如下:
public class BaseHibernateDAO implementsIBaseHibernateDAO {
private String dbName;//要连接的数据库
// 为了保证每个DAO能够正确指定所操作的数据库,将无参构造设为私有
private BaseHibernateDAO() { }
// 指定目标数据库的DAO构造方法
public BaseHibernateDAO(StringdbName) {
this.dbName = dbName;
}
//重写getSession()方法,使之能够访问不同的数据库
public Session getSession() {
if (dbName == null) {
return null;
}else if (dbName.equals("db01")){
returnSessionFactory_db01.getSession();//连接db01库
} else if (dbName.equals("db02")) {
returnSessionFactory_db02.getSession();//连接db02库
} else {
return null;
}
}
}
(5)改造自动生成用户表对应的DAO——UserDAO类:即继承父类BaseHibernateDAO的有参构造。
public class UserDAOextends BaseHibernateDAO {
//因为父类将无参构造设置为了private,所以该类只能存在有参构造了。
public UserInfoTbDAO(StringdbName) {
super(dbName);
}
//以下是自动生成的代码:
public void save(UserTb transientInstance){
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
}
(6)应用层的测试
public voidtestSaveUser(UserTb user){
UserDAO userDao_1 = newUserDAO("db01");//得到db01库的DAO
UserDAO userDao_2 = new UserDAO("db02");//得到db02库的DAO
//假设两个库中的数据要同步更新(实际操作中应该加入事务控制)
userDao_1.save();//更新01库
userDao_2.save();//更新02库
}
(7)总结:
优点:
1.代码改动比较小,能充分利用工具生成的代码。
2.结构简单,访问灵活。
3.访问不同库的同一个表,只需一个DAO,一个pojo,无需写额外代码。
缺点:
1.每次连接数据库时都要指定访问的数据库。
2.为了有效指定数据库逻辑名,和利于维护,就得“db01”这样的字符串设置为全局的final变量,或者弄
一个DAO工厂来产生不同的DAO实例。
另一种方法:
上面的方法是改造了DAO的构造方法。也可以改造getSession()方法,这样透明度更高,但略欠灵活。
本人刚刚接触Hibernate,不知以上设计是否妥当,望高手指点一二。
Hibernate 连接访问多个数据库(含访问不同数据库的相同表)(转)的更多相关文章
- ADO.NET 连接方式和非链接方式访问数据库
一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...
- Spring框架中 配置c3p0连接池 完成对数据库的访问
开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...
- 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est
前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...
- 数据库访问优化漏斗法则- 四、减少数据库服务器CPU运算
数据库访问优化漏斗法则这个优化法则归纳为5个层次:1.减少数据访问次数(减少磁盘访问)2.返回更少数据(减少网络传输或磁盘访问)3.减少交互次数(减少网络传输)4.减少服务器CPU开销(减少CPU及内 ...
- SpringBoot 整合 hibernate 连接 Mysql 数据库
前一篇搭建了一个简易的 SpringBoot Web 项目,最重要的一步连接数据库执行增删改查命令! 经过了一天的摸爬滚打,终于成功返回数据! 因为原来项目使用的 SpringMVC + Hibern ...
- 【问题&解决】试用版SQL Server 2008 R2 提示评估期已过,数据库不能访问解决办法
因为以前一直是试用版,重启服务器之后,突然数据库不能访问,提示评估期已过,都快吓死了.还好找到了解决办法特copy解决步骤如下: (笔者用的是企业版: R88PF-GMCFT-KM2KR-4R7GB- ...
- 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下 我们来分享一下蔡老给我们 ...
- 访问内网中的sql server数据库的简便方法
前言: 有时候我们要访问局域网内的 sql server服务器,比如测试环境数据库在公司内网,回到家或在客户现场要连接内网中的数据库 第一步:假如可以连接局域网的数据库 192.168.150.129 ...
- 记一次MySQL数据库拒绝访问的解决过程
问题背景 用wordpress搭博客,数据库采用MySQL.为了调试方便,创建账户my_account ,允许它从任意主机访问数据库. CREATE USER `my_account`@'%' IDE ...
随机推荐
- 深度学习-Windows平台下的Caffe编译教程
一.安装CUDA7.5 Cuda是英伟达推出的GPU加速运算平台 我这里安装的是cuda7.5,已经安装过的忽略,还没有安装过的这里有安装教程.windows下面安装还是非常简单的. https:// ...
- Shell 字符串分割
入门级别 入门级别:类似1,2,3,4,5这样的字符串 #!/bin/bash var="1,2,3,4,5" var=${var//,/ } for i in $var; do ...
- bat脚本禁用和开启本地连接
netsh interface set interface name="本地连接" admin=disabled //禁用本地连接 netsh interface set inte ...
- SSH使用Log4j
1. 将Jar文件log4j-1.2.14.jar导入项目. 2. 在src文件夹下新建log4j.properties文件: log4j.rootLogger = debug,stdout,D,E ...
- anadroid环境搭建
近期配置android 开发环境时,在网上搜寻诸多资料.文字一大堆,最没有解决这个问题,以下我谈一下我的配置之路: 一.开发环境需求原始资源: 1. jdk(java api):因为如今android ...
- 开启mysql远程登录
开发过程中经常遇到远程访问mysql的问题,每次都需要搜索,感觉太麻烦,这里记录下,也方便我以后查阅. 首先访问本机的mysql(用ssh登录终端,输入如下命令): mysql -uroot -p 输 ...
- Python学习笔记七:pip
安装pip: 到github上下载pip:https://github.com/pypa/pip 解压后,在解压出来的文件夹中打开命令行,输入 python setup.py install 安装完毕 ...
- 【JDBC】Mysql海量数据插入——PreparedStatement加快数据插入
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5861959.html 使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢.此时,我 ...
- insert-interval 插入区间
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- python3 发送邮件功能
阿-_-涵的博客 #首先写一个模块功能,发邮件功能打包起来 from smtplib import SMTP from email.mime.text import MIMEText def send ...