本文著重講述了為什麼要使用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之旅
From:http://tw.wingwit.com/Article/Common/201311/7791.html