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; } }
|