新聞中心
隨著信息量的爆炸性增長(zhǎng),數(shù)據(jù)管理和處理變得越來(lái)越重要。而對(duì)于企業(yè)系統(tǒng)開(kāi)發(fā)而言,與數(shù)據(jù)相關(guān)的問(wèn)題集中在數(shù)據(jù)庫(kù)操作上。因此,如何快速讀取數(shù)據(jù)庫(kù)數(shù)據(jù)是每個(gè)企業(yè)系統(tǒng)開(kāi)發(fā)人員需要掌握的重要技能。而Hibernate作為一種開(kāi)源的對(duì)象關(guān)系映射(ORM)工具,可以幫助開(kāi)發(fā)人員與數(shù)據(jù)庫(kù)交互,減少編寫(xiě)數(shù)據(jù)庫(kù)操作代碼和提高開(kāi)發(fā)效率。在這篇文章中,我們將介紹如何。

概述
Hibernate與傳統(tǒng)的數(shù)據(jù)庫(kù)操作不同,它是基于面向?qū)ο蟮拈_(kāi)發(fā)理念,將數(shù)據(jù)的增刪查改都轉(zhuǎn)化為對(duì)Object的操作,從而減少一大堆SQL語(yǔ)句的編寫(xiě),提高開(kāi)發(fā)效率。使用Hibernate,可以將Entity的定義與表結(jié)構(gòu)的定義一一對(duì)應(yīng),使得開(kāi)發(fā)者無(wú)需關(guān)心表的創(chuàng)建、維護(hù)以及數(shù)據(jù)的操作,從而簡(jiǎn)化了開(kāi)發(fā)流程,并且方便了以后的維護(hù)。同時(shí),Hibernate也能在一定程度上提高數(shù)據(jù)庫(kù)讀寫(xiě)的效率。
在開(kāi)始之前,我們需要先了解Hibernate的幾個(gè)重要概念:
1. Entity
Entity體現(xiàn)了一張表的結(jié)構(gòu),其成員變量對(duì)應(yīng)表的屬性,同時(shí)也定義了表與表之間的關(guān)系。比如一個(gè)User的Entity就可能擁有username和password的屬性,并且與訂單之間就可能存在一對(duì)多的關(guān)系。
2. Session
Session提供了對(duì)數(shù)據(jù)庫(kù)的操作,包括增刪查改等等;同時(shí)還提供了事務(wù)管理等其他的服務(wù)。
3. Criteria
Criteria提供了對(duì)查詢(xún)的重要支持,并且能夠解決對(duì)多個(gè)關(guān)聯(lián)表的查詢(xún)操作。當(dāng)然也支持類(lèi)似group by或是order by的操作。
4. HQL
HQL即Hibernate Query Language,是一種類(lèi)SQL的Hibernate特有查詢(xún)語(yǔ)句。
Hibernate配置
在開(kāi)始使用Hibernate之前,我們需要先配置Hibernate,以便于正確地讀取數(shù)據(jù)庫(kù)數(shù)據(jù)。
在本地電腦上新建一個(gè)maven工程,在pom.xml文件中添加如下配置信息:
“`
log4j
log4j
1.2.16
org.hibernate
hibernate-core
5.0.7.Final
com.alibaba
druid
1.0.29
mysql
mysql-connector-java
5.1.40
“`
這些依賴(lài)包分別提供了log4j、Hibernate、MySQL、數(shù)據(jù)庫(kù)連接池Druid等必要的支持。
在完成依賴(lài)包的引入之后,我們需要在src/mn/resources目錄下(創(chuàng)建一個(gè)“resources”目錄即可)新建一個(gè)Hibernate配置文件,文件名為hibernate.cfg.xml。我們將在這里配置Hibernate所需要的基本信息。
“`
org.hibernate.dialect.MySQL5InnoDBDialect
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
root
YourPassword
3
60
10
100
true
true
update
“`
在這段xml配置文件中,主要包括了數(shù)據(jù)庫(kù)連接,數(shù)據(jù)庫(kù)連接池,方言以及HQL語(yǔ)句的打印等等信息。
Hibernate配置完成之后,我們就可以開(kāi)始使用Hibernate進(jìn)行查詢(xún)操作了。
Hibernate讀取數(shù)據(jù)庫(kù)數(shù)據(jù)
在Hibernate中,我們可以使用Session來(lái)讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。Session是一個(gè)與Hibernate或Java的線程綁定的事務(wù)級(jí)別的緩存,這意味著你可以從一次數(shù)據(jù)庫(kù)查詢(xún)中檢索大量數(shù)據(jù),并且在查詢(xún)期間快速建立一個(gè)緩存,以便在后續(xù)的查詢(xún)中被重復(fù)使用。同時(shí),這個(gè)緩存是事務(wù)級(jí)別的,所以你只能在這個(gè)事務(wù)中使用這個(gè)緩存。
在開(kāi)始使用Hibernate Session進(jìn)行數(shù)據(jù)庫(kù)讀取之前,需要先獲得SessionFactory對(duì)象,SessionFactory是一個(gè)線程安全的用于創(chuàng)建Session的工廠,我們可以將它看做是一個(gè)與數(shù)據(jù)庫(kù)之間的鏈接。
在一個(gè)完整的Hibernate查詢(xún)過(guò)程中,我們需要完成以下三個(gè)步驟:
1. 初始化SessionFactory,在這里我們使用一個(gè)靜態(tài)方法獲取SessionFactory:
“`
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration().configure(“hibernate.cfg.xml”);
sessionFactory = cfg.buildSessionFactory();
}
“`
2. 創(chuàng)建Session進(jìn)行數(shù)據(jù)讀?。?/p>
“`
Session session = sessionFactory.openSession();
“`
在這里,我們創(chuàng)建一個(gè)Session對(duì)象,通過(guò)調(diào)用SessionFactory的openSession方法即可。
3. 關(guān)閉Session對(duì)象:
“`
session.close();
“`
在完成查詢(xún)操作之后,我們需要關(guān)閉Session對(duì)象以釋放資源。
接下來(lái),我們將以一個(gè)簡(jiǎn)單的查詢(xún)?yōu)槔齺?lái)介紹Hibernate的查詢(xún)操作。
我們需要定義一個(gè)Student的Entity:
“`
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
//學(xué)生的id,自增類(lèi)型
private Long id;
@Column
//學(xué)生姓名
private String name;
@Column
//學(xué)生性別
private String sex;
@Column
//學(xué)生班級(jí)
private String cls;
//年齡
private Integer age;
//備注
private String comments;
//省略了get和set方法
}
“`
在這里,我們使用了@Entity注解來(lái)告訴Hibernate這是一個(gè)實(shí)體類(lèi),同時(shí)使用@Id來(lái)標(biāo)識(shí)該屬性是表的主鍵。
接下來(lái),我們可以使用Hibernate條件查詢(xún)來(lái)讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù),如下:
“`
Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq(“name”, “Tom”));
List students0 = criteria.list();
session.close();
“`
在這里,我們首先創(chuàng)建了一個(gè)Criteria對(duì)象,指定了要查詢(xún)的實(shí)體類(lèi)Student.class,并調(diào)用了Restrictions.eq方法來(lái)限定查詢(xún)條件(等于“Tom”)。最后使用list方法來(lái)獲取查詢(xún)結(jié)果。
除了Criteria外,Hibernate還提供了HQL和SQL查詢(xún)方式,如下:
1. HQL查詢(xún)方式:
“`
Session session = sessionFactory.openSession();
Query query = session.createQuery(“select student from Student student where student.name=:name”);
query.setParameter(“name”, “Tom”);
List students1 = query.list();
session.close();
“`
在這里,我們使用了一個(gè)HQL語(yǔ)句來(lái)查詢(xún)列表,注意:student.name、student.id是類(lèi)屬性,而“:name”是一個(gè)舌尖式的參數(shù),而且參數(shù)類(lèi)型也不用定義。我們給這個(gè)HQL查詢(xún)?nèi)×艘粋€(gè)名字“select user from Student user where user.name=:name”,使用時(shí)可以這么來(lái):
“`
Query query = session.getNamedQuery(“select user from Student user where user.name=:name”);
“`
2. SQL查詢(xún)方式:
“`
Session session = sessionFactory.openSession();
SQLQuery sqlQuery = session.createSQLQuery(“select * from student where name = ?”);
sqlQuery.setString(0, “Tom”);
List students2 = sqlQuery.addEntity(Student.class).list();
session.close();
“`
在這里,我們使用了一個(gè)SQL查詢(xún)來(lái)查詢(xún)列表,使用時(shí)也是可以進(jìn)行參數(shù)限定的,同時(shí)注意:在使用SQL查詢(xún)方式的時(shí)候,需要添加一個(gè)addEntity()的方法,來(lái)將查詢(xún)的結(jié)果映射到類(lèi)中,否則將會(huì)出錯(cuò)。
Hibernate作為一個(gè)強(qiáng)大的ORM框架,在讀取數(shù)據(jù)庫(kù)數(shù)據(jù)方面發(fā)揮了重要作用。同時(shí),Hibernate通過(guò)Session對(duì)象的緩存也提升了數(shù)據(jù)庫(kù)讀取的效率。當(dāng)然,雖然使用Hibernate可以簡(jiǎn)化數(shù)據(jù)庫(kù)操作并提高開(kāi)發(fā)效率,但使用Hibernate并非萬(wàn)能,有時(shí)候出于某些原因,我們還是需要使用傳統(tǒng)的SQL方式來(lái)進(jìn)行數(shù)據(jù)讀寫(xiě),所以需要開(kāi)發(fā)人員根據(jù)實(shí)際情況選擇不同的解決方案來(lái)完成項(xiàng)目開(kāi)發(fā)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
hibernate從數(shù)據(jù)庫(kù)取不出數(shù)據(jù)問(wèn)題
你那個(gè)hql沒(méi)問(wèn)題?? 試試直接 FROM Files 看看
拿不到數(shù)據(jù)分析3個(gè)問(wèn)題:1數(shù)據(jù)庫(kù)問(wèn)題;2程輪大序連接數(shù)據(jù)蘆臘庫(kù)問(wèn)題;3程序問(wèn)題。
能插入數(shù)據(jù),說(shuō)明1和2應(yīng)該是沒(méi)問(wèn)題。
剩下3號(hào)問(wèn)題了。
你的問(wèn)題描述太少,我不知道該怎么詳細(xì)的分析。建議你debug模式調(diào)試看看各個(gè)變量的值!
session確定是你要的數(shù)據(jù)庫(kù)的連接陪桐滑嗎?
list.size() = 0 嗎?
重啟服務(wù)器試過(guò)了嗎?
查詢(xún)之前試試清緩存?
hql = “from Files”
select f from Files as f 執(zhí)行的HQL語(yǔ)句,將類(lèi)名Files變成files再試下。
session.createQuery(“from Files);
List ilst = query.list();
//另外團(tuán)乎,看書(shū)上查詢(xún)也在臘或絕事務(wù)中,更好輪姿好在事務(wù)中。
首先查看數(shù)據(jù)庫(kù)的路徑
Hibernate上手指南
Hibernate上手
Hibernate,很久以前我就聽(tīng)說(shuō)過(guò)這個(gè)名詞,但是似乎沒(méi)什么動(dòng)力讓我去接近它,感覺(jué)它是一個(gè)很復(fù)雜的東西,一直沒(méi)搞明白它到底是用來(lái)做什么的。直到接手了一個(gè)項(xiàng)目在技術(shù)選型的時(shí)候我再一次的看到了Hibernate。我嘗試著去使用它,發(fā)現(xiàn)它并不是我想像中的那么深?yuàn)W,它很易用。你并不需要了解它的內(nèi)部結(jié)構(gòu),它一樣能為你工作的很好,如果你理解了它到底能為你做什么的話
本文著重講述了為什么要使用Hibernate,此外也簡(jiǎn)單的介紹了如何使用Hibernate,以及Hibernate中的一些基本概念。我想借這篇文章來(lái)向還沒(méi)有接觸過(guò)Hibernate的開(kāi)發(fā)者推薦款優(yōu)秀的開(kāi)源ORM產(chǎn)品,如果你已經(jīng)實(shí)踐過(guò)Hibernate,那么我想你沒(méi)有必要再看下去。
一、Why Hibernate?
現(xiàn)在流行“測(cè)試驅(qū)動(dòng)開(kāi)發(fā)”,相似的我覺(jué)得“目的驅(qū)動(dòng)學(xué)習(xí)”是一種比較好的接受新技術(shù),新知識(shí)的途徑。在學(xué)習(xí)一樣新的技術(shù)之前,首先得明確到底有沒(méi)有必要學(xué)習(xí),已有的技術(shù)是否已經(jīng)工作的很好,學(xué)習(xí)這個(gè)新的技術(shù)是為了解決什么問(wèn)題。如果你明確了以上問(wèn)題,那么尋找并學(xué)習(xí)新的技術(shù)將會(huì)事半功倍,并且能快速應(yīng)用到實(shí)際的開(kāi)發(fā)當(dāng)中來(lái)提高效益。
要說(shuō)Hibernate,就得先介紹一下Object/Relation Mapper(ORM),中文翻譯為對(duì)象關(guān)系映射。之所以會(huì)產(chǎn)生這樣的概念是源于目前軟件開(kāi)發(fā)中的一些不協(xié)調(diào)的思想。目前流行的編程模型是OOP(Object Oriented Programming),面向?qū)ο蟮木幊蹋壳傲餍械臄?shù)據(jù)庫(kù)模型是Relational Database,這兩者思考的方式不一樣,這必然產(chǎn)生了開(kāi)發(fā)過(guò)程中的不協(xié)調(diào)。ORM框架(也稱(chēng)為持久層框架梁祥,盯指)的出現(xiàn)就是為了解決這樣的問(wèn)題,屏蔽底層數(shù)據(jù)庫(kù)的操作,以面向?qū)ο蟮姆绞教峁┙o開(kāi)發(fā)者操作數(shù)據(jù)庫(kù)中數(shù)據(jù)的接口。目前流行的ORM框架有Apach OJB,Hibernate,iBatis等等,當(dāng)然最完善,更好用的是Hibernate,至少我這樣認(rèn)為?;蛟S你對(duì)“持久層”感到迷惑,其實(shí)說(shuō)白了很簡(jiǎn)單,把數(shù)據(jù)放到數(shù)據(jù)庫(kù)中叫做持久化(內(nèi)存種的數(shù)據(jù)當(dāng)然不是持久的),那么負(fù)責(zé)這一操作的結(jié)構(gòu)層面就叫做持久層。你以前應(yīng)該聽(tīng)說(shuō)過(guò)表現(xiàn)層,業(yè)務(wù)層,數(shù)據(jù)層,那么持久層是在業(yè)務(wù)層和數(shù)據(jù)層之間的一層,或者說(shuō)持久層是數(shù)據(jù)層的一部分。
接下來(lái),我想通過(guò)一個(gè)實(shí)際開(kāi)發(fā)中的例子來(lái)說(shuō)明ORM帶給我們的好處。先來(lái)講一下我們的需求,數(shù)據(jù)庫(kù)中有三張表,一張student,一張course,另外一張course_slection。其中student用來(lái)保存學(xué)生信橡則搏息,course用來(lái)表示課程信息,course_selection用來(lái)表示學(xué)生的選課信息。(表的詳細(xì)結(jié)構(gòu)這里我就省略了,因?yàn)檫@并不重要)現(xiàn)在要求編寫(xiě)一個(gè)程序,用來(lái)選出指定學(xué)號(hào)學(xué)生所選的課程名字,那么可能會(huì)出現(xiàn)以下幾種程序編寫(xiě)的方式:
1. 菜鳥(niǎo)級(jí)
代碼片段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;
}
這段程序你一定看的很暈吧,什么亂七八糟的都搞在一起,那么接下來(lái)看一段改進(jìn)過(guò)的程序。
2. 改進(jìn)后的代碼
代碼片段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;
}
這段代碼的形式是一種被廣泛采用的形式,相對(duì)之一段代碼來(lái)說(shuō),應(yīng)該已經(jīng)有所進(jìn)步,分離了數(shù)據(jù)庫(kù)連接操作,并把數(shù)據(jù)庫(kù)連接信息交給單獨(dú)的類(lèi)完成(一般放在配置文件里面),往往在開(kāi)發(fā)中還會(huì)引入數(shù)據(jù)庫(kù)連接池(Connection Pool)來(lái)提高性能,我這里都盡量簡(jiǎn)化了。但這些并不能從根本上改善程序的結(jié)構(gòu),在業(yè)務(wù)代碼中仍然混雜了很多數(shù)據(jù)庫(kù)操作,結(jié)構(gòu)不清晰。下面來(lái)看一段徹底分離數(shù)據(jù)庫(kù)操作的代碼:
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;
}
是不是感覺(jué)代碼少了很多?或許你對(duì)這段代碼有點(diǎn)迷惑,沒(méi)關(guān)系,后文會(huì)詳細(xì)解釋。我想先解釋一下DAO。其實(shí)DAO和Hibernate沒(méi)有必然聯(lián)系,只不過(guò)一般用Hibernate的程序都用DAO模式。DAO的全稱(chēng)是Data Access Object,程序要訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)(包括獲取,更新,刪除)都通過(guò)DAO來(lái)訪問(wèn),實(shí)際上DAO才是真正屏蔽了所有數(shù)據(jù)庫(kù)操作的東西,這樣在業(yè)務(wù)代碼中就可以完全隔離數(shù)據(jù)層的代碼。如果我告訴你,在真正用Hibernate開(kāi)發(fā)的時(shí)候,要完成上文提到的功能,需要手寫(xiě)的代碼就是“代碼片段3”這么多,甚至更少,你是不是有很大的動(dòng)力去學(xué)習(xí)Hibernate?那么好吧,讓我們開(kāi)始Hibernate之旅。
二、持久層的組成
這一節(jié)的名字應(yīng)該換成“基于Hibernate的持久層的組成”更合適一點(diǎn),可是它太長(zhǎng)了。既然Hibernate是用來(lái)開(kāi)發(fā)持久層,那么我先介紹一下這個(gè)持久層中的各個(gè)元素。
1. POJO:Plain Old Java Object,你可以把它看作是簡(jiǎn)單的JavaBean。一般說(shuō)來(lái),一張數(shù)據(jù)庫(kù)表對(duì)應(yīng)一個(gè)POJO,也就是對(duì)象/關(guān)系的一一映射。
2. DAO:對(duì)于每一個(gè)POJO,一般都有一個(gè)DAO與之對(duì)應(yīng),承擔(dān)所有關(guān)于該P(yáng)OJO的訪問(wèn)控制。實(shí)際上也就是控制了對(duì)數(shù)據(jù)庫(kù)中一張表的訪問(wèn)控制。
3. *.hbm.xml文件:這個(gè)文件定義了POJO和數(shù)據(jù)庫(kù)中的表是如何映射的,比如POJO中的字段對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的哪個(gè)字段等等。一般每個(gè)映射都用單獨(dú)的文件來(lái)描述,也就是有一個(gè)POJO就有一個(gè)*.hbm.xml文件。
4. *.cfg.xml文件:這個(gè)文件定義了Hibernate的基本信息,比如數(shù)據(jù)庫(kù)驅(qū)動(dòng),用戶(hù)名,密碼等等連接信息,也包括了所有要用的*.hbm.xml文件,在初始化的時(shí)候,Hibernate會(huì)讀取這個(gè)文件來(lái)找相應(yīng)的映射文件完成對(duì)象/關(guān)系。
我們還是以上文的例子來(lái)詳細(xì)描述一下這里提到的各個(gè)元素的內(nèi)容。
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;
}
}
#p#副標(biāo)題#e#
這個(gè)類(lèi)就是一個(gè)POJO,你可以很明顯的看出來(lái)它就是一個(gè)JavaBean。我想解釋它的courseSelection字段。很顯然,在數(shù)據(jù)庫(kù)表student中,沒(méi)有這個(gè)字段。這里的這個(gè)字段是因?yàn)橐粋€(gè)外鍵引用,course_selection的student_id是一個(gè)外鍵,引用了student表中的id字段。那么在Student類(lèi)中courseSelection來(lái)記錄這樣的外鍵關(guān)系,也就是說(shuō),當(dāng)我們獲取了Student對(duì)象以后,就可以直接獲取他的選課記錄,這樣就為上層的調(diào)用提供了很大的方便。這里有點(diǎn)模糊沒(méi)關(guān)系,我在介紹映射定義文件(*.hbm.xml)的時(shí)候還會(huì)提到這個(gè)問(wèn)題。
2. StudentDAO.java
代碼片段5:
public class StudentDAO
{
Session session;
public StudentDAO()
{
Configuration cfg = new Configuration();
cfg.configure(”/hibernate.cfg.xml”);
SessionFactory sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
}
public void save(Student transientInstance)
{
session.save(transientInstance);
}
public void delete(Student persistentInstance)
{
session.delete(persistentInstance);
}
public Student findById(java.lang.String id)
{
List list = session.createCriteria(Student.class)。add(Expression.eq(”id”, id))。list();
if (list.size()
0)
{
return (Student)list.get(0);
}
return null;
}
}
這里的構(gòu)造函數(shù)是用來(lái)啟動(dòng)Hibernate,并獲取session。打開(kāi)一個(gè)session就相當(dāng)于打開(kāi)了一個(gè)數(shù)據(jù)庫(kù)連接,然后我們就可以對(duì)這個(gè)session進(jìn)行操作,完成數(shù)據(jù)庫(kù)操作,完全不用寫(xiě)SQL語(yǔ)句。我這里Hibernate的啟動(dòng)方式寫(xiě)的很不規(guī)范,系統(tǒng)應(yīng)該只需要完成一次Hibernate啟動(dòng)就可以在不同的DAO中使用,我把它寫(xiě)在構(gòu)造函數(shù)里面純粹是為了簡(jiǎn)化演示代碼。
你可以看到save和delete方法都很簡(jiǎn)單直接對(duì)對(duì)象操作,而findById就有些麻煩,因?yàn)檫@里有一個(gè)查詢(xún)過(guò)程在里面。Hibernate里面查詢(xún)可以用Criteria這個(gè)類(lèi)來(lái)完成,我們也常用Hibernate獨(dú)有的HQL(Hibernate Query Language)來(lái)完成查詢(xún)。當(dāng)然Hibernate也是支持原生SQL的。關(guān)于查詢(xún)的詳細(xì)信息請(qǐng)參考其他文章或書(shū)籍,我只是演示一個(gè)流程,介紹一些概念。
3. Student.hbm.xml
代碼片段6:
hibernate-mapping
class name=”Student” table=”STUDENT”
id name=”id” type=”string”
column name=”ID” length=”10″ /
generator class=”assigned” /
/id
property name=”name” type=”string”
column name=”NAME” not-null=”true” /
/property
set name=”courseSelections” inverse=”true”
key
column name=”STUDENT_ID” length=”10″
not-null=”true” /
/key
one-to-many class=”CourseSelection” /
/set
/class
/hibernate-mapping
這個(gè)文件定義了Student類(lèi)和Student表是如何映射的。class元素定義了Sudent類(lèi)和STUDENT表映射,然后就定義了各個(gè)屬性是如何映射的。如果一個(gè)屬性是數(shù)據(jù)庫(kù)的key,那么會(huì)用id標(biāo)簽來(lái)定義,column定義了當(dāng)前類(lèi)的屬性和數(shù)據(jù)庫(kù)中的哪個(gè)字段對(duì)應(yīng),generator是id特有的。一般來(lái)說(shuō)id是自增的,由于我的數(shù)據(jù)庫(kù)是用的Oracle,它沒(méi)有自增字段,要實(shí)現(xiàn)自增必須用Sequence,這超出了本文的范圍,所以我就用assigned來(lái)簡(jiǎn)化示例代碼。assigned表示id是用戶(hù)給定的。
有一個(gè)比較特別的標(biāo)簽是set,它對(duì)應(yīng)著數(shù)據(jù)庫(kù)中的外鍵關(guān)系,上文我提到的通過(guò)Student對(duì)象可以獲得所有相關(guān)的選課記錄就是通過(guò)這里的定義實(shí)現(xiàn)的。name屬性對(duì)應(yīng)了Student類(lèi)中的字段名,key表示哪個(gè)字段是外鍵,one-to-many表示Student和CourseSelection是一對(duì)多關(guān)系,這和事實(shí)相符。類(lèi)似的還有many-to-one,many-to-many,不過(guò)這些都不常用,我不介紹了。Hibernate根據(jù)這個(gè)映射定義文件,在實(shí)例化一個(gè)POJO(比如Student)的時(shí)候,會(huì)自動(dòng)的把定義過(guò)映射的屬性用數(shù)據(jù)庫(kù)中的數(shù)據(jù)填充,set也包括在內(nèi)。
4. hibernate.cfg.xml
代碼片段7:
hibernate-configuration
session-factory
property name=”connection.username”test/property
property name=”connection.url”
jdbc:oracle:thin:@10.85.33.199:1521:glee/property
property name=”dialect”
org.hibernate.dialect.Oracle9Dialect/property
property name=”connection.password”test/property
property name=”connection.driver_class”
oracle.jdbc.OracleDriver/property
mapping resource=”Student.hbm.xml”/mapping
mapping resource=”CourseSelection.hbm.xml”/mapping
mapping resource=”Course.hbm.xml”/mapping
/session-factory
/hibernate-configuration
這個(gè)文件我不解釋了,自己看吧。結(jié)合上文StudentDAO的例子,我想你應(yīng)該能看明白。
看了這么多,或許你會(huì)有點(diǎn)頭皮發(fā)麻,POJO,DAO,配置文件好像要寫(xiě)的東西還是很多。值得慶幸的是現(xiàn)在Hibernate已經(jīng)發(fā)展的比較成熟了,有很多工具來(lái)幫助我們完成這些工作,比如MiddleGen,Hibernate Synchronizer等等。我使用的開(kāi)發(fā)工具是Eclipse+MyEclipse,我所要做的只是把數(shù)據(jù)庫(kù)表建好,然后MyEclipse提供的工具會(huì)自動(dòng)根據(jù)數(shù)據(jù)庫(kù)表生成POJO,DAO,*.hbm.xml,甚至hibernate.cfg.xml都是自動(dòng)完成的(前提是MyEclipse知道你的數(shù)據(jù)庫(kù)連接信息)。我并不打算介紹如何用IDE來(lái)開(kāi)發(fā)Hibernate,你可以參考IDE的幫助文檔。
到這里為止,使用Hibernate進(jìn)行開(kāi)發(fā)的基本組成元素我都介紹好了,強(qiáng)烈建議你馬上實(shí)踐一遍,即使有些不理解,也先依葫蘆畫(huà)瓢一個(gè)。對(duì)了,別忘了把Hibernate的包down下來(lái)放到classpath里面。
三、Session與SessionFactory
Session可以說(shuō)是Hibernate的核心,Hibernate對(duì)外暴露的接口就是Session。所以我這里講一下有關(guān)Session的常用函數(shù)和特性。
在講Session之前,我想先提一下SessionFactory,這個(gè)東西不復(fù)雜,只要配置好就行了。顧名思義,SessionFactory就是用來(lái)創(chuàng)建Session的。SessionFactory是線程安全的,也就是說(shuō)對(duì)于同一個(gè)數(shù)據(jù)庫(kù)的所有操作共享一個(gè)SessionFactory就行了。回頭看代碼片段5,我們可以看到SessionFactory的常用配置方式。
代碼片段8:
Configuration cfg = new Configuration();
cfg.configure(”/hibernate.cfg.xml”);
SessionFactory sessionFactory = cfg.buildSessionFactory();
我們通過(guò)Configuration來(lái)讀取配置文件,然后就可以創(chuàng)建SessionFactory,這段代碼在 所有系統(tǒng)中都大同小異,一般就是xml配置文件的名字不一樣,所以也沒(méi)什么好說(shuō)的。
當(dāng)我們有了SessionFactory以后就可以獲取Session了。調(diào)用SessionFactory.openSession()就會(huì)返回一個(gè)Session實(shí)例,然后我們操作這個(gè)Session來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。值得一提的是Session并不是線程安全的,也就是每一個(gè)線程都必須有自己的Session。所以我們一般通過(guò)以下方法來(lái)獲取和關(guān)閉Session:
代碼片段9:
public static Session currentSession() throws HibernateException
{
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen())
{
if (sessionFactory == null)
{
try
{
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
}
catch (Exception e)
{
e.printStackTrace();
}
}
session = (sessionFactory != null) ?
sessionFactory.openSession(): null;
threadLocal.set(session);
}
return session;
}
public static void closeSession() throws HibernateException
{
hibernate 讀取數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于hibernate 讀取數(shù)據(jù)庫(kù),使用Hibernate快速讀取數(shù)據(jù)庫(kù)數(shù)據(jù),hibernate從數(shù)據(jù)庫(kù)取不出數(shù)據(jù)問(wèn)題,Hibernate上手指南的信息別忘了在本站進(jìn)行查找喔。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢(xún):13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)、開(kāi)啟建站+互聯(lián)網(wǎng)銷(xiāo)售服務(wù),與企業(yè)客戶(hù)共同成長(zhǎng),共創(chuàng)價(jià)值。
分享題目:使用Hibernate快速讀取數(shù)據(jù)庫(kù)數(shù)據(jù)(hibernate讀取數(shù)據(jù)庫(kù))
URL分享:http://www.5511xx.com/article/cdscoii.html


咨詢(xún)
建站咨詢(xún)
