首页 > 学院 > 基础常识 > 正文

Hibernate上手指南

2019-11-01 00:50:47
字体:
来源:转载
供稿:网友

  本文着重讲述了为什么要使用Hibernate,此外也简单的介绍了如何使用Hibernate,以及Hibernate中的一些基本概念。借这篇文章来向还没有接触过Hibernate的开发者推荐款优秀的开源ORM产品。

  一、WhyHibernate?

  现在流行“测试驱动开发”,相似的我觉得“目的驱动学习”是一种比较好的接受新技术,新知识的途径。在学习一样新的技术之前,首先得明确到底有没有必要学习,已有的技术是否已经工作的很好,学习这个新的技术是为了解决什么问题。如果您明确了以上问题,那么寻找并学习新的技术将会事半功倍,并且能快速应用到实际的开发当中来提高效益。

  要说Hibernate,就得先介绍一下Object/RelationMapper(ORM),中文翻译为对象关系映射。之所以会产生这样的概念是源于目前软件开发中的一些不协调的思想。目前流行的编程模型是OOP(ObjectOrientedProgramming),面向对象的编程,而目前流行的数据库模型是RelationalDatabase,这两者思考的方式不一样,这必然产生了开发过程中的不协调。ORM框架(也称为持久层框架,)的出现就是为了解决这样的问题,屏蔽底层数据库的操作,以面向对象的方式提供给开发者操作数据库中数据的接口。目前流行的ORM框架有 ApachOJB,Hibernate,iBatis等等,当然最完善,最好用的是Hibernate,至少我这样认为。或许您对“持久层”感到迷惑,其实说白了很简单,把数据放到数据库中叫做持久化(内存种的数据当然不是持久的),那么负责这一操作的结构层面就叫做持久层。您以前应该听说过表现层,业务层,数据层,那么持久层是在业务层和数据层之间的一层,或者说持久层是数据层的一部分。

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

  1.菜鸟级

  代码片段1:

  publicListselectCourses(StringstudentId)

  {

  Connectioncon=null;

  Statementsta=null;

  try

  {

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

  con=DriverManager.getConnection(

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

  "test","test");

  Stringsql="select*fromcourse_selection";

  Stringsql2="selectnamefromcoursewhereid=";

  sta=con.createStatement();

  ResultSetrs=sta.executeQuery(sql);

  Listlist=newLinkedList();

  while(rs.next())

  {

  ResultSetrs2=sta.executeQuery(sql2+

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

  if(rs2.next())

  {

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

  }

  }

  returnlist;

  }

  catch(Exceptione)

  {

  e.printStackTrace();

  }

  returnnull;

  }

  这段程序您一定看的很晕吧,什么乱七八糟的都搞在一起,那么接下来看一段改进过的程序。

  2.改进后的代码

  代码片段2:

  classDBHelper

  {

  publicstaticConnectiongetConnection()

  {

  try

  {

  Class.forName(Constants.DB_DRIVER);

  returnDriverManager.getConnection(Constants.DB_URL,

  Constants.DB_USER,Constants.DB_PWD);

  }

  catch(Exceptione)

  {

  e.printStackTrace();

  }

  returnnull;

  }

  }

  publicListselectCourses(StringstudentId)

  {

  Connectioncon=null;

  Statementsta=null;

  try

  {

  con=DBHelper.getConnection();

  Stringsql="select*fromcourse_selection";

  Stringsql2="selectnamefromcoursewhereid=";

  sta=con.createStatement();

  ResultSetrs=sta.executeQuery(sql);

  Listlist=newLinkedList();

  while(rs.next())

  {

  ResultSetrs2=sta.executeQuery(sql2+rs.getString("course_id")+"");

  if(rs2.next())

  {

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

  }

  }

  returnlist;

  }

  catch(Exceptione)

  {

  e.printStackTrace();

  }

  returnnull;

  }

  这段代码的形式是一种被广泛采用的形式,相对第一段代码来说,应该已经有所进步,分离了数据库连接操作,并把数据库连接信息交给单独的类完成(一般放在配置文件里面),往往在开发中还会引入数据库连接池(ConnectionPool)来提高性能,我这里都尽量简化了。但这些并不能从根本上改善程序的结构,在业务代码中仍然混杂了很多数据库操作,结构不清晰。下面来看一段彻底分离数据库操作的代码:

  3.DAO模式

  代码片段3:

  publicListselectCourses(StringstudentId)

  {

  StudentDAOsd=newStudentDAO();

  Studentstudent=sd.findById(studentId);

  Setset=student.getCourseSelections();

  ListcourseNames=newLinkedList();

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

  {

  CourseSelectionelement=(CourseSelection)iter.next();

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

  }

  returncourseNames;

  }

  是不是感觉代码少了很多?或许您对这段代码有点迷惑,没关系,后文会详细解释。我想先解释一下DAO。其实DAO和Hibernate没有必然联系,只不过一般用Hibernate的程序都用DAO模式。DAO的全称是DataAccessObject,程序要访问数据库中的数据(包括获取,更新,删除)都通过DAO来访问,实际上DAO才是真正屏蔽了所有数据库操作的东西,这样在业务代码中就可以完全隔离数据层的代码。如果我告诉您,在真正用 Hibernate开发的时候,要完成上文提到的功能,需要手写的代码就是“代码片段3”这么多,甚至更少,您是不是有很大的动力去学习 Hibernate?那么好吧,让我们开始Hibernate之旅。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表