日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
使用Hibernate快速讀取數(shù)據(jù)庫(kù)數(shù)據(jù)(hibernate讀取數(shù)據(jù)庫(kù))

隨著信息量的爆炸性增長(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