本文着重讲述了为什么要使用Hibernate此外也简单的介绍了如何使用Hibernate以及Hibernate中的一些基本概念借这篇文章来向还没有接触过Hibernate的开发者推荐款优秀的开源ORM产品
一WhyHibernate?
现在流行“测试驱动开发”相似的我觉得“目的驱动学习”是一种比较好的接受新技术新知识的途径在学习一样新的技术之前首先得明确到底有没有必要学习已有的技术是否已经工作的很好学习这个新的技术是为了解决什么问题如果您明确了以上问题那么寻找并学习新的技术将会事半功倍并且能快速应用到实际的开发当中来提高效益
要说Hibernate就得先介绍一下Object/RelationMapper(ORM)中文翻译为对象关系映射之所以会产生这样的概念是源于目前软件开发中的一些不协调的思想目前流行的编程模型是OOP(ObjectOrientedProgramming)面向对象的编程而目前流行的数据库模型是RelationalDatabase这两者思考的方式不一样这必然产生了开发过程中的不协调ORM框架(也称为持久层框架)的出现就是为了解决这样的问题屏蔽底层数据库的操作以面向对象的方式提供给开发者操作数据库中数据的接口目前流行的ORM框架有 ApachOJBHibernateiBatis等等当然最完善最好用的是Hibernate至少我这样认为或许您对“持久层”感到迷惑其实说白了很简单把数据放到数据库中叫做持久化(内存种的数据当然不是持久的)那么负责这一操作的结构层面就叫做持久层您以前应该听说过表现层业务层数据层那么持久层是在业务层和数据层之间的一层或者说持久层是数据层的一部分
接下来我想通过一个实际开发中的例子来说明ORM带给我们的好处先来讲一下我们的需求数据库中有三张表一张student一张course另外一张course_slection其中student用来保存学生信息course用来表示课程信息course_selection用来表示学生的选课信息(表的详细结构这里我就省略了因为这并不重要)现在要求编写一个程序用来选出指定学号学生所选的课程名字那么可能会出现以下几种程序编写的方式
菜鸟级
代码片段
publicListselectCourses(StringstudentId)
{
Connectioncon=null;
Statementsta=null;
try
{
ClassforName("oraclejdbcdriverOracleDriver")
con=DriverManagergetConnection(
"jdbc:oracle:thin:@::glee"
"test""test")
Stringsql="select*fromcourse_selection";
Stringsql="selectnamefromcoursewhereid=";
sta=concreateStatement()
ResultSetrs=staexecuteQuery(sql)
Listlist=newLinkedList()
while(rsnext())
{
ResultSetrs=staexecuteQuery(sql+
rsgetString("course_id")+"")
if(rsnext())
{
listadd(rsgetString("name"))
}
}
returnlist;
}
catch(Exceptione)
{
eprintStackTrace()
}
returnnull;
}
这段程序您一定看的很晕吧什么乱七八糟的都搞在一起那么接下来看一段改进过的程序
改进后的代码
代码片段
classDBHelper
{
publicstaticConnectiongetConnection()
{
try
{
ClassforName(ConstantsDB_DRIVER)
returnDriverManagergetConnection(ConstantsDB_URL
ConstantsDB_USERConstantsDB_PWD)
}
catch(Exceptione)
{
eprintStackTrace()
}
returnnull;
}
}
publicListselectCourses(StringstudentId)
{
Connectioncon=null;
Statementsta=null;
try
{
con=DBHelpergetConnection()
Stringsql="select*fromcourse_selection";
Stringsql="selectnamefromcoursewhereid=";
sta=concreateStatement()
ResultSetrs=staexecuteQuery(sql)
Listlist=newLinkedList()
while(rsnext())
{
ResultSetrs=staexecuteQuery(sql+rsgetString("course_id")+"")
if(rsnext())
{
listadd(rsgetString("name"))
}
}
returnlist;
}
catch(Exceptione)
{
eprintStackTrace()
}
returnnull;
}
这段代码的形式是一种被广泛采用的形式相对第一段代码来说应该已经有所进步分离了数据库连接操作并把数据库连接信息交给单独的类完成(一般放在配置文件里面)往往在开发中还会引入数据库连接池(ConnectionPool)来提高性能我这里都尽量简化了但这些并不能从根本上改善程序的结构在业务代码中仍然混杂了很多数据库操作结构不清晰下面来看一段彻底分离数据库操作的代码
DAO模式
代码片段
publicListselectCourses(StringstudentId)
{
StudentDAOsd=newStudentDAO()
Studentstudent=sdfindById(studentId)
Setset=studentgetCourseSelections()
ListcourseNames=newLinkedList()
for(Iteratoriter=setiterator()iterhasNext())
{
CourseSelectionelement=(CourseSelection)iternext()
courseNamesadd(elementgetCourse()getName())
}
returncourseNames;
}
是不是感觉代码少了很多?或许您对这段代码有点迷惑没关系后文会详细解释我想先解释一下DAO其实DAO和Hibernate没有必然联系只不过一般用Hibernate的程序都用DAO模式DAO的全称是DataAccessObject程序要访问数据库中的数据(包括获取更新删除)都通过DAO来访问实际上DAO才是真正屏蔽了所有数据库操作的东西这样在业务代码中就可以完全隔离数据层的代码如果我告诉您在真正用 Hibernate开发的时候要完成上文提到的功能需要手写的代码就是“代码片段”这么多甚至更少您是不是有很大的动力去学习 Hibernate?那么好吧让我们开始Hibernate之旅