现在的位置: 首页 > 综合 > 正文

撩开面纱看Hibernate,正点!

2013年10月17日 ⁄ 综合 ⁄ 共 4504字 ⁄ 字号 评论关闭

从四月份开始SSH的总结,其中五月份穿插着准备了一个月的软件设计师考试,总结完Struts和一部分Hibernate后,就中断了,Struts在上几篇博客中根据自己的理解已做了小结,Hibernate没有及时归仓,因此这两天做了一些必要的回顾,Hibernate在用dotNet开发项目的时候就接触过,当时理解Hibernate是为了不用手动写SQL语句而出现的,是SQLHelper的加强版。

那Hibernate到底为何物呢?随着学习的不断深入,我也在一层层的揭开Hibernate神秘的面纱,其实,Hibernate并没有让人喜爱的长相,巴掌大的脸蛋,以及和脸比例相称的大眼睛。但她让序员童鞋从大量相同的数据持久层相关编程工作中解放出来,随心所欲的使用对象编程思维来操纵数据库,极大地缩短了手动处理SQL和JDBC上的开发时间,并且她封装的足够彻底,平台的移植性足够的强大,最最最主要是她Free 和 OpenSource,是居家旅行,升职加薪的必备框架,不管你信不信,反正我已是不淡定了。

好了,废话一筐,进入正题。不管是看美女还是学习知识首先要从整体入手,那么我们先把Hibernate放到整体架构中去理解消化,Java中最经典的架构莫过于MVC了,Model层中又可以分为业务逻辑层和持久化逻辑层,Hibernate处在持久化逻辑层,主要负责和底层数据库打交道,持久化数据。如下图:

类似Hibernate的框架还有很多,比如IBatis,Spring JDBC template,Apache DBUtils等,他们各自的侧重点不同,但道理相通,先透过一个小例子从应用方面来了解Hibernate,开始由表及里的学习,步骤如下:

第0步:创建数据库(MySQL),名称为Hibernate_first;创建Java项目,加入依赖包;具体过程略。

第1步:创建一个User实体类,代码如下:

package com.snail.hibernate;

import java.util.Date;

public class User {

	private String id;
	
	private String name;
	
	private String password;
	
	private Date createTime;
	
	private Date expireTime;

	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 getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public Date getExpireTime() {
		return expireTime;
	}

	public void setExpireTime(Date expireTime) {
		this.expireTime = expireTime;
	}	
}

此类不用过多的解释。

第2步:根据User对象创建并配置User.hbm.xml映射文件,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!--name属性关联实体类-->
	<class name="com.snail.hibernate.User">
		<!--主键 -->
		<id name="id">
			<!-- 自动生成id -->
			<generator class="uuid"/>
		</id>
		<property name="name" column="user_name"/>
		<property name="password"/>
		<property name="createTime"/>
		<property name="expireTime"/>
	</class>
</hibernate-mapping>

此配置文件映射实体类属性和数据库表字段,如果想重命名数据库字段名,可用column属性,如第二个属性name,实体类中它叫name,在数据库表中则叫user_name。

第3步:创建并配置Hibernate.cfg.xml映射文件,把User.hbm.xml文件加入到Hibernate.cfg.xml文件,代码如下:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">1</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<mapping resource="com/snail/hibernate/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

此配置文件为Hibernate的核心配置文件,首先需要配置数据库(包括数据库驱动、数据库名称密码等),然后把User.hbm.xml文件加入到Hibernate.cfg.xml文件,目的是把实体类真正的关联到Hibernate_first数据库中。

第4步:创建一个工具类ExportDB,导出数据库表,代码如下:

package com.snail.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class ExportDB {

	public static void main(String[] args) {
		
		//默认读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		
		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}

}

数据库我们已在第0步创建好,编写这个工具类的目的就是为了根据hibernate.cfg.xml文件创建数据库表,编写一次后可以经常用。

第5步:创建Client类,为User对象添加数据,完成数据的持久化,代码如下:

package com.snail.hibernate;

import java.util.Date;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		
		//建立SessionFaction
		SessionFactory factory = cfg.buildSessionFactory();
		
		//取得session
		Session session = null;
		try{
			session = factory.openSession();
			//开启事务
			session.beginTransaction();
			User user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//保存User对象
			session.save(user);
			
			//提交事务
			session.getTransaction().commit();
		}catch (Exception e) {
			e.printStackTrace();
			//回滚事务
			session.getTransaction().rollback();
		}finally{
			if(session != null){
				if(session.isOpen()){
					//关闭session
					session.close();
				}
			}
		}
	}
}

此类实现了往数据库中填充数据,让数据数据完成了持久化。

从上面的小例子基本上体现出了Hibernate的优缺点,文章开头已经谈了优点,那她的缺点还是不少的,比如使用数据库特性的语句,将很难调优;对大批量数据更新存在问题;系统中存在大量的统计查询功能等,因此在实际开发项目过程中,一般是Hibernate和JDBC结合使用,对一些数据库特性或复杂的查询使用JDBC语句,其他情况一般使用Hibernate。

世间没有完美的东西,当优点大于缺点时我们要学习,或者说要善于看到别人优秀的一面,善于发现世间的美好,不仅提高幸福指数,而且会让我们大幅度进步。

抱歉!评论已关闭.