【Hibernate】Hibernate的层次划分,Hibernate4.3的初始化的新写法(一)

2015-07-24 08:52:42 · 作者: · 浏览: 3

在《【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查》(点击打开链接)介绍了Hibernate的配置与基本结构,其作用就是数据库与Java文件的交互媒介。但是,上文的程序写得非常乱,也用很多Hibernate3的过时写法。主要是没有划分好层次所致。其实,虽然Hibernate的初始化越搞越复杂,首先要载入配置文件、建立一个Session的抽象工厂、最后则根据Session工厂建立Session,这样何必呢?为何Hibernate就不能封装好一个方法呢?而且改来改去,Hibernate3一种写法Hibernate4.2一种写法,Hibernate4.3又一种写法。它不给我们封装,我们自己封装。

一、基本目标

还是上次那张在Mysql数据库的Testtable表,这次先插入一个数据dddd,bbbb,再删除这个数据

\

二、基本准备

Java工程,配置好Hibernate包等,这里就不多说了。在上文已经介绍得很详细了。

\

但这次与上文不同的是不再于一个Java文件里面做完所有事情。目录结构如下,dbDAO.java,TestTable.java,hibernate.cfg.xml其实就是M层,HQL就是C层。有点《【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统》(点击打开链接)的意味。

1、hibernate.cfg.xml如下,与《【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查》(点击打开链接)完全一样,一个字都没有改。这个文件与TestTable.java完成数据库中的Testtable表到Java工程的映射。

?




	
		
		com.mysql.jdbc.Driver
		
		root
		
		jdbc:mysql://localhost:3306/test
		
		root
		
		org.hibernate.dialect.MySQLInnoDBDialect
		true
		
		
		update
		
		
	

2、Testtable.java则在里面重写了 系统固有的toString方法,这样就能够在System.out.println();根据我们重写好的toString方法直接输出这个对象了。

?

?

import javax.persistence.*;

@Entity
@Table(name = "testtable")
public class Testtable {
	private int id;
	private String username;
	private String number;

	// 表示主键与自动生成项
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(name = "username")
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Column(name = "number")
	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String toString() {
		return id + "," + username + "," + number;
	}

}


三、制作过程

?

1、这次主要是根据Hibernate的基本结构封装好一个数据库业务类方法。Hibernate关键就是靠一个Session做完所有事,但是每次初始化Session都要搞一大轮,那何不直接把它封装起来。以后要用直接调用就可以呢?我向你传递过来HQL语句与对象,则此类给我传回查询结果或者完成数据库的操作。以后这个文件就能随便使用了。

?

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;

public class dbDAO {
	private Session session;

	// 构造函数,初始化Session,相当于连接数据库
	public dbDAO() {
		//这里使用了Hibernate4.3.8的写法,这里Hibernate又把初始化的方法修改了,非常蛋疼
		Configuration cfg = new Configuration().configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(cfg.getProperties()).build();
		SessionFactory sessionFactory = cfg
				.buildSessionFactory(serviceRegistry);
		this.session = sessionFactory.openSession();
	}
	
	// 执行查询
	public Query query(String hql){
		return session.createQuery(hql);
	}
	
	// 执行插入、修改
	public void save(Object object){
		Transaction transaction=session.beginTransaction();  
		session.save(object);
		transaction.commit(); 
	}
	
	// 执行删除
	public void delete(Object object){
		Transaction transaction=session.beginTransaction(); 
		session.delete(object);
		transaction.commit(); 
	}

	// 析构函数,中断Session,相当于中断数据库的连接
	protected void finalize() throws Exception {
		if (session.isConnected() || session != null) {
			session