今天开会讨论的时候. 项目中要用到通过Hibernate访问多个数据库..以为系统集成了其他子系统,所以几个不同数据库进行数据访问和存取..
在有限的时间内,做一个比较简单的例子..便于以后参考:有些地方,未考虑,请大家拍砖..
Hibernate访问多个数据库的设计思路:其实就是利用 Hibernate中config = new
Configuration().configure(configFile);
可以加载不同数据库配置信息的原理,编写一个通过的 数据库操作类,再编写一个数据库管理程序[map],
将加载的数据库连接实例put早数据库管
理程序中,
具体实现见下面:
在做测试之前,需要在oracle和mysql中建立表Student;
见表语句:
oracle:
Create table Student(
id varchar2(10) not null,
name varchar2(10)not null,
sex varchar2(4) not null,
age number
)
commit;
mySql:
create table `student` (
`id` varchar (30),
`name` varchar (30),
`sex` varchar (12),
`age` int (4)
);
commit;
这里针对于两个不同数据库..一个文件是对oracle数据库操作,取名叫oracle.cfg.xml
另外一个针对于MySql数据库操作..取名叫做mySql.cfg.xml
oracle.cfg.xml配置如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:ORCL
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource = "pack/java/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
mySql.cfg.xml配置如下:'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory name="">
<property name="connection.url">jdbc:mysql://127.0.0.1/mysql</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource = "pack/java/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
之后,建立一个Student VO对象.
package pack.java.model;
import java.io.Serializable;
/**
* Student VO * @author Administrator
*
*/
public class Student implements Serializable{
private static final long serialVersionUID = 1034231412171686357L;
private String id;
private String name;
private String sex;
private long age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public long getAge() {
return age;
}
public void setAge(long age) {
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String id, String name, String sex, long age) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
}
、建立 一个DataBaseManager 管理SessionManager;
package pack.java.basedao;
import java.util.HashMap;
/**
* 建立 一个DataBaseManager 管理SessionManager;
* 用于存放多个SessionFactory;
* @author Administrator
*
*/
public class DataBaseManager extends HashMap{
private static final long serialVersionUID = 2939313139367007154L;
private static DataBaseManager dbinstance = new DataBaseManager();
public static DataBaseManager getDbinstance() {
return dbinstance;
}
public static void setDbinstance(DataBaseManager dataBaseManager){
DataBaseManager.dbinstance = dataBaseManager;
}
public SessionManager get(Object key){
return (SessionManager) super.get(key);
}
@SuppressWarnings("unchecked")
@Override
public Object put(Object key, Object value) {
// TODO Auto-generated method stub
return super.put(key, value);
}
}
、 建立一个SessionManager;从SessionFactory中获取Session,以及定义一些,基本的CRUD的操作;
package pack.java.basedao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/**
* 建立一个SessionManager;从SessionFactory中
* 获取Session,以及定义一些,基本的CRUD的操作;
* @author Administrator
*
*/
public class SessionManager{
private Configuration configuration = null;
private SessionFactory sessionFactory = null;
private Session session = null;
public Criteria createCriteria(Class clazz){
return session.createCriteria(clazz);
}
public void buildSession(){
sessionFactory = configuration.buildSessionFactory();
session = sessionFactory.openSession();
}
public SessionManager(String configFile){
configuration = new Configuration().configure(configFile);
buildSession();
}
public Session getSession(){
return session;
}
public void save(Object obj){
Transaction transaction = session.beginTransaction();
session.save(obj);
transaction.commit();
}
public void update(Object obj){
Transaction transaction = session.beginTransaction();
session.update(obj);
transaction.commit();
}
@SuppressWarnings("unchecked")
public <T>List<T> queryAll(Class clazz){
return session.createQuery("from "+clazz.getName()).list();
}
@SuppressWarnings("unchecked")
public Object queryObjectById(Class clazz,Serializable id){
return session.load(clazz, id);
}
public void delete(Object obj){
Transaction transaction = session.beginTransaction();
session.delete(obj);
transaction.commit();
}
@SuppressWarnings("unchecked")
public void delete(Class clazz,Serializable id){
Transaction transaction = session.beginTransaction();
this.delete(this.queryObjectById(clazz, id));
transaction.commit();
}
@SuppressWarnings("unchecked")
public <T>List<T> queryObjectsByHql(String hql,Object...objects){
Query query = session.createQuery(hql);
if(objects!= null && objects.length>0){
for(int i = 0;i<objects.length;i++){
query.setParameter(i, objects[i]);
}
}
return query.list();
}
}
最后,就是测试针对多个数据库进行操作了,
具体代码如下:
package pack.java.test;
import pack.java.basedao.DataBaseManager;
import pack.java.basedao.SessionManager;
import pack.java.model.Student;
/**
* 测试多个数据源;
* @author ZhouHaiTao
*
*/
public class TestHibernateDataSource {
DataBaseManager baseManager = null;
public void testDataSource(){
setDatabase();
SessionManager mysqlSessionManager = baseManager.get("mysql");
//Session mysqlSession = mysqlSessionManager.getSession();
Student student1 = new Student();
student1.setId("100");
student1.setName("周海涛");
student1.setAge(22);
student1.setSex("男");
mysqlSessionManager.save(student1);
System.out.println("成功添加到MySql数据库中!");
SessionManager oracleSessionManager = baseManager.get("oracle");
//Session oracleSession = oracleSessionManager.getSession();
Student student2 = new Student();
student2.setId("101");
student2.setName("张三");
student2.setAge(20);
student2.setSex("女");
oracleSessionManager.save(student2);
System.out.println("成功添加到Oracle数据库中!");
}
public void setDatabase(){
SessionManager oracleSessionManager = new SessionManager("oracle.cfg.xml");
SessionManager mysqlSessionManager = new SessionManager("mysql.cfg.xml");
baseManager = DataBaseManager.getDbinstance();
baseManager.put("mysql", mysqlSessionManager);
baseManager.put("oracle", oracleSessionManager);
}
public static void main(String[] args) {
new TestHibernateDataSource().testDataSource();
}
}
运行之后,生成两条插入的sql语句..
Hibernate:
insert
into
STUDENT
(NAME, SEX, AGE, ID)
values
(?, ?, ?, ?)
成功添加到MySql数据库中!
Hibernate:
insert
into
STUDENT
(NAME, SEX, AGE, ID)
values
(?, ?, ?, ?)
成功添加到Oracle数据库中!
分别查询oracle和Mysql数据库,
发现数据都已经插入进来了,操作成功!