天天看點

Hibernate4 (面向對象的資料庫操作)

jpa,java persistance api,java持久層接口,即與資料庫打交道的一些接口。實作交給各個廠商去實作。

orm,object/relation mapping,對象/關系資料庫映射。面向對象的資料庫操作,底層仍是sql語句。

hibernate的maven依賴。

hibernate是一個優秀的orm實作。使用方法見下。

名為hibernate.cfg.xml,一般放在src目錄下。它使用c3p0作為資料庫連接配接池。

指定配置檔案位置

放在src/下面會打包進jar裡面,不便修改,是以可放在jar外面,我們指定配置檔案的位置。兩個常用函數為:

configuration org.hibernate.cfg.configuration.configure(file

configfile)

以檔案方式打開配置,預設目前路徑為所執行jar的目錄。當釋出web應用時,可以将hibernate.cfg.xml放到web-inf/目錄下,但在eclipse中調試時就不友善了。不過我們可以這麼寫:

configuration org.hibernate.cfg.configuration.configure(string

resource)

打進jar裡面時,被當做資源看待。

@ javax.persistence.entity

表明這個類對應着資料庫中某張表中的實體。

@javax.persistence.table

該注解的name屬性标明java類與哪張表相對應。

@javax.persistence.id

标明這個字段是資料庫表中的主鍵。

@ javax.persistence.generatedvalue

标明主鍵生成政策,與@id搭配使用。自增的話就是 @generatedvalue(strategy=generationtype.identity)。

@javax.persistence.column

該注解的name屬性指定該字段與表中的哪一列相對應。預設是同名的互相比對。若表中的列被不小心設成關鍵字,可以通過加雙引号解決,hibernate幫你最後轉換成 `desc`,見下:

@javax.persistence.temporal

資料庫中時間類型比較多,指派為temporaltype.timestamp表示時間戳。

@javax.persistence.transient

當某個pojo的字段不在表中的時候,可以加上這個注釋,避免錯誤。若表中有的字段不在pojo中,似乎會有警告,但是不會抛異常。

@elementcollection(targetclass=string.class)

list<string> list=new arraylist<>();

//同樣适用于map與數組。

@elementcollection(targetclass=float.class)

@mapkeycolumn(name="subject")

@mapkeyclass(string.class)

@column(name="grade")

map<string,float> scores=new hashmap<>();

@org.hibernate.annotations.generated

表明該字段是由資料庫生成的。一個使用場景見下:

@javax.persistence.mappedsuperclass

這是一個很實用的注解。讓子類繼承父類的字段與注解。

org.hibernate.sessionfactory

通過此類獲得session。一般地,一個程式隻有一個sessionfactory的執行個體,可以從它擷取多個session。session用過可關閉,sessionfactory不關閉,它的打開周期為整個程式生命周期。

void org.hibernate.sessionfactory.close() throws hibernateexception

銷毀這個sessionfactory,釋放一切連接配接池中的資源。

session org.hibernate.sessionfactory.opensession() 

打開一個org.hibernate.session,底層是jdbc connection。

connection org.hibernate.session.close()

用過後可以關閉session。

query  org.hibernate.sharedsessioncontract.createquery(string querystring)

用給定的hql語句建立一個query。

list org.hibernate.query.list()

将查詢結果以list的形式傳回。

int javax.persistence.query.executeupdate()

執行更新或删除操作,傳回受影響的行數。

query org.hibernate.query.setparameter(int position, object val)

查詢參數綁定,jdbc風格。

指pojo與表中的列的對應關系。

pojo字段不能多,若程式中實在要用就用@javax.persistence.temporal注解解決。

pojo字段少的話是不會報錯的。

sqlquery org.hibernate.sharedsessioncontract.createsqlquery(string querystring)

執行原生sql語句。

object org.hibernate.query.uniqueresult()

傳回執行結果的單一執行個體。當執行"select count(*) from table"時,就可以把此函數傳回的object轉換為int。

sqlquery org.hibernate.sqlquery.addscalar(string columnalias, type type)

指明所查的字段與類型。

org.hibernate.type.type

它是接口,實作類一般有org.hibernate.type.stringtype 等。由于傳的是一個對象,是以一般用 org.hibernate.type.standardbasictypes.string這些常量。

當應用增加、修改持久化實體時,session并不會立即把這種變化同步到資料庫,而是緩存到目前session的一級緩存中,除非顯式調用session.flush()方法。否則等到session.close()時才會把這些改變一次性地同步到資料庫中。這樣做通過減少互動提高性能。

當批量添加實體時,可是多次flush(),避免一級緩存溢出。(hibernate難道就不會在快溢出時自己flush()麼?)