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()麼?)