Hibernate上手指南


  Hibernate上手

Hibernate,很久以往我就据说过这个名词,然而 仿佛没什么动力让我去接近它,觉得它是一个很复杂的东西,向来没搞清楚它到底是用来做什么的 。直到接手了一个 名目在技术选型的时候我重新的看到了Hibernate 。我尝试着去 使用它,发现它并不是我想像中的那么深奥,它很易用 。你并不需要了解它的内部 构造,它一样能为你工作的很好,假如你 了解了它到底能为你做什么的话

本文着重讲述了为何要 使用Hibernate,此外也 方便的介绍了如何 使用Hibernate,以及Hibernate中的一些 根本概念 。我想借这篇文章来向还没有接触过Hibernate的开发者推举款优异的开源ORM产品,假如你已经 实际过Hibernate,那么我想你没有必要再看下去 。

  一、Why Hibernate?

现在 风行“测试驱动开发”, 类似的我觉得“ 目标驱动学习”是一种 比较好的 承受新技术,新 常识的 路径 。在学习一样新的技术之前,首先得明确到底有没有必要学习,已有的技术是否已经工作的很好,学习这个新的技术是为了解决什么问题 。假如你明确了以上问题,那么寻觅并学习新的技术将会事半功倍,而且能 快捷 利用到实际的开发当中来 普及效益 。

要说Hibernate,就得先介绍一下Object/Relation Mapper(ORM),中文翻译为对象关系映射 。之所以会产生这样的概念是源于当前软件开发中的一些不协调的 思维 。当前 风行的编程模型是OOP(Object Oriented Programming),面向对象的编程,而当前 风行的数据库模型是Relational Database,这两者思量的 模式不一样,这必定产生了开发过程中的不协调 。ORM框架(也称为 长久层框架,)的浮现便是为了解决这样的问题,屏蔽底层数据库的操作,以面向对象的 模式提供应开发者操作数据库中数据的接口 。当前 风行的ORM框架有Apach OJB,Hibernate,iBatis等等,固然最完善,最好用的是Hibernate,至少我这样认为 。兴许你对“ 长久层”感到 困惑,其实说白了很 方便,把数据放到数据库中叫做 长久化(内存种的数据固然不是 长久的),那么负责这一操作的 构造层面就叫做 长久层 。你以往应该据说过 体现层,业务层,数据层,那么 长久层是在业务层和数据层中间的一层,或者说 长久层是数据层的一 部分 。

接下来,我想通过一个实际开发中的例子来 注明ORM带给我们的 好处 。先来讲一下我们的需要,数据库中有三张表,一张student,一张course,另外一张course_slection 。其中student用来 保留学生信息,course用来 示意课程信息,course_selection用来 示意学生的选课信息 。(表的 详尽 构造这里我就省略了,由于这并不主要)现在要求编写一个程序,用来选出指定学号学生所选的课程名字,那么可能会浮现以下几种程序编写的 模式:

  1. 菜鸟级

代码片段1:

public List selectCourses(String studentId)

{

Connection con = null;

Statement sta = null;

try

{

Class.forName("oracle.jdbc.driver.OracleDriver");

con = DriverManager.getConnection(

"jdbc:oracle:thin:@10.85.33.199:1521:glee",

"test", "test");

String sql = "select * from course_selection";

String sql2 = "select name from course where id='";

sta = con.createStatement();

ResultSet rs = sta.executeQuery(sql);

List list = new LinkedList();

while (rs.next())

{

ResultSet rs2 = sta.executeQuery(sql2 +

rs.getString("course_id") + "'");

if (rs2.next())

{

list.add(rs2.getString("name"));

}

}

return list;

}

catch (Exception e)

{

e.printStackTrace();

}

return null;

}

这段程序你 定然看的很晕吧,什么 错杂无章的都搞在一同,那么接下来看一段改良过的程序 。

  2. 改良后的代码

代码片段2:

class DBHelper

{

public static Connection getConnection()

{

try

{

Class.forName(Constants.DB_DRIVER);

return DriverManager.getConnection(Constants.DB_URL,

Constants.DB_USER, Constants.DB_PWD);

}

catch (Exception e)

{

e.printStackTrace();

}

return null;

}

}

public List selectCourses(String studentId)

{

Connection con = null;

Statement sta = null;

try

{

con = DBHelper.getConnection();

String sql = "select * from course_selection";

String sql2 = "select name from course where id='";

sta = con.createStatement();

ResultSet rs = sta.executeQuery(sql);

List list = new LinkedList();

while (rs.next())

{

ResultSet rs2 = sta.executeQuery(sql2 + rs.getString("course_id") + "'");

if (rs2.next())

{

list.add(rs2.getString("name"));

}

}

return list;

}

catch (Exception e)

{

e.printStackTrace();

}

return null;

}

  这段代码的 模式是一种被 宽泛采纳的 模式, 绝对第一段代码来说,应该已经有所 普及, 拆散了数据库衔接操作,并把数据库衔接信息交给 径自的类 实现(一般放在配置文件里面),一般在开发中还会引入数据库衔接池(Connection Pool)来 普及性能,我这里都尽量简化了 。但这些并不能从 根本上改善程序的 构造,在业务代码中 依旧 混淆了众多数据库操作, 构造不清楚 。下面来看一段彻底 拆散数据库操作的代码:

3. DAO模式

代码片段3:

public List selectCourses(String studentId)

{

StudentDAO sd = new StudentDAO();

Student student = sd.findById(studentId);

Set set = student.getCourseSelections();

List courseNames = new LinkedList();

for (Iterator iter = set.iterator(); iter.hasNext();)

{

CourseSelection element = (CourseSelection) iter.next();

courseNames.add(element.getCourse() 。getName());

}

return courseNames;

}

  是否觉得代码少了众多?兴许你对这段代码有点 困惑,没关系,后文会 详尽解释 。我想先解释一下DAO 。其实DAO和Hibernate没有必定 联络,只是一般用Hibernate的程序都用DAO模式 。DAO的全称是Data Access Object,程序要 拜访数据库中的数据(包含猎取,更新,删除)都通过DAO来 拜访,实际上DAO才是真正屏蔽了全部数据库操作的东西,这样在业务代码中就 可以 彻底隔离数据层的代码 。假如我告诉你,在真正用Hibernate开发的时候,要 实现上文提到的 性能,需要手写的代码便是“代码片段3”这么多,甚至更少,你是否有很大的动力去学习Hibernate?那么好吧,让我们开始Hibernate之旅 。

  二、 长久层的构成

这一节的名字应该换成“基于Hibernate的 长久层的构成”更 合适丝毫,可是它太长了 。既然Hibernate是用来开发 长久层,那么我先介绍一下这个 长久层中的各个元素 。

1. POJO:Plain Old Java Object,你 可以把它看作是 方便的JavaBean 。一般说来,一张数据库表对应一个POJO,也便是对象/关系的逐个映射 。

2. DAO:关于每一个POJO,一般都有一个DAO与之对应,负担全部关于该POJO的 拜访操纵 。实际上也便是操纵了对数据库中一张表的 拜访操纵 。

3. *.hbm.xml文件:这个文件定义了POJO和数据库中的表是如何映射的, 比方POJO中的字段对应数据库表中的哪个字段等等 。一般每个映射都用 径自的文件来 形容,也便是有一个POJO就有一个*.hbm.xml文件 。

4. *.cfg.xml文件:这个文件定义了Hibernate的 根本信息, 比方数据库驱动,消费者名,密码等等衔接信息,也包含了全部要用的*.hbm.xml文件,在初始化的时候,Hibernate会读取这个文件来找相应的映射文件 实现对象/关系 。

我们还是以上文的例子来 详尽 形容一下这里提到的各个元素的内容 。

1. Student.java:

代码片段4:

public class Student implements java.io.Serializable

{

private String id;

private String name;

private Set courseSelections = new HashSet(0);

public Student()

{

}

public String getId()

{

return this.id;

}

public void setId(String id)

{

this.id = id;

}

public String getName()

{

return this.name;

}

public void setName(String name)

{

this.name = name;

}

public Set getCourseSelections()

{

return this.courseSelections;

}

public void setCourseSelections(Set courseSelections)

{

this.courseSelections = courseSelections;

}

}