Hibernate(一)
什麼是Hibernate?
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
我們從三個角度理解一下Hibernate:
一、Hibernate是對JDBC進一步封裝
原來沒有使用Hiberante做持久層開發時,存在很多冗餘,如:各種JDBC語句,connection的管理,所以出現了Hibernate把JDBC封裝了一下,我們不用操作數據,直接操作它就行了。
二、我們再從分層的角度來看
我們知道非常典型的三層架構:表示層,業務層,還有持久層。Hiberante也是持久層的框架,而且持久層的框架還有很多,比如:IBatis,Nhibernate,JDO,OJB,EJB等等。
三、Hibernate是開源的一個ORM(對象關係映射)框架。
ORM,即Object-Relational Mapping,它的作用就是在關係型數據庫和對象之間做了一個映射。從對象(Object)映射到關係(Relation),再從關係映射到對象。這樣,我們在操作數據庫的時候,不需要再去和複雜SQL打交道,只要像操作對象一樣操作它就可以了(把關係數據庫的字段在內存中映射成對象的屬性)。。
ORM(Object Relational Mapping)框架採用元數據在關係型數據庫和對象之間做了一個映射。元數據一般採用XML格式,並且存放在專門的對象一映射文件中。 ORM(Object Relational Mapping)框架:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。Hibernate就是典型的使用xml文件作爲描述實體對象的映射框架, 元數據: 是描述其它數據的數據 (data about other data),或者說是用於提供某種資源的有關信息的結構數據(structured data)。 |
語言特點
將對數據庫的操作轉換爲對Java對象的操作,從而簡化開發。通過修改一個“持久化”對象的屬性從而修改數據庫表中對應的記錄數據。
提供線程和進程兩個級別的緩存提升應用程序性能。
有豐富的映射方式將Java對象之間的關係轉換爲數據庫表之間的關係。
屏蔽不同數據庫實現之間的差異。在Hibernate中只需要通過“方言”的形式指定當前使用的數據庫,就可以根據底層數據庫的實際情況生成適合的SQL語句。
非侵入式:Hibernate不要求持久化類實現任何接口或繼承任何類,POJO即可。
//讀取配置文件
Configuration conf=new Configuration().configure();
//根據配置創建factory
SessionFactory sessionfactory=conf.buildSessionFactory();
//獲得操作數據庫的session對象
Session session=sessionfactory.openSession();
由圖可看到,Hibernate的API一共有6個,分別爲:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
Configuration類
Configuration類:用來加載默認文件路徑下的配置文件(hibernate.properties)。
調用configure()方法會加載默認文件路徑下的xml格式的配置文件(hibernate.cfg.xml)推薦使用。
如果配置文件在不默認文件路徑下或者配置文件名不符合默認規則可以使用
new Configuration().configure(file) 加載指定文件
new Configuration().configure(path) 加載指定路徑下的文件
如果使用properties格式的配置文件,可以使用addClass(實體類名.class)方法可以加載映射文件。
SessionFactory對象
SessionFactory對象:
SessionFactory代表數據庫存儲源。根據Hibernate配置文件創建對應的數據庫存儲源。
SessionFactory對象創建後,和Configuration對象再無關聯。修改Configuration包含的配置文件信息,不會對SessionFactory有任何影響。
獲取SessionFactory對象:
new Configuration().configure().buildSessionFactory();
對象的緩存很大,就稱爲重量級對象。SessionFactory存放了Hibernate配置信息,映射元數據信息等。是重量級對象。
Session對象
Session對象:
代表程序和數據庫的會話。Session提供了操作數據庫的各種方法。是輕量級對象。
獲取Session對象
factory.openSession(): 獲取新的Session實例。
factory.getCurrentSession():採用該方法創建的Session會取出當前線程中的Session,底層使用ThreadLocal進行存取
save()方法:把Java對象保存到數據庫中。
Transaction ts=session.beginTransaction(); User u=new User(); u.setName("趙六") u.setPassword("123456") //將對象保存到數據庫 session.save(u); ts.commit(); |
update()方法:更新數據庫的方法
Transaction ts=session.beginTransaction(); //先查出要修改的對象,根據主鍵值 User user=session.get(User.class, 1); user.setName("jery"); //將對象更新到數據庫,根據OID session.update(user); ts.commit(); |
delete()方法:刪除方法
底層根據OID進行刪除。有兩種方式 (1) Transaction ts=session.beginTransaction(); User user=session.get(User.class, 1); //刪除指定對象 session.delete(user); ts.commit(); (2) Transaction ts=session.beginTransaction(); User user=new User(); user.setId(2); session.delete(user); ts.commit(); |
load()或get()方法:從數據庫查找指定對象
session.get(實體類名.class,OID); 或session.load(實體類名.class,OID); |
load()和get()的區別:
我們使用get查詢時發現控制檯會立馬打出查詢語句。
使用load查詢時控制檯不會打印查詢語句。
get方法被調用時立刻發送sql語句到數據庫進行查詢。
load方法被調用時並沒有查詢數據庫,當我們需要使用查詢的對象時,纔去查詢,所以當我們打印對象時,纔會在控制檯打印sql語句。
get()的原理
程序調用get方法,Hibernate發送sql語句到數據庫
數據庫返回結果,Hibernate將結果封裝成對象,返回對象到程序。
load()的原理
程序調用load方法,Hibernate使用代理技術,創建一個代理對象,屬性只有ID值。
然後返回代理對象給程序,我們使用對象時,代理對象調用Hibernate查詢數據庫,初始化其他屬性。
load方法,返回一個代理對象,獲取其屬性時,會查詢數據庫,每次訪問屬性都會查詢數據庫麼?
答:不是。代理對象中有一個標識是否被初始化的boolean類型變量,記錄是否被初始化。
查詢所有對象的方法
使用HQL語言(後面會詳細介紹),HQL語言是面向對象的
Query query=session.createQuery("from User");
第二種方式
Criteria c=session.createCriteria(User.class);
List<User> l=c.list();
第三種方式,使用原生sql語句進行查詢
SQLQuery query=session.createSQLQuery("select * from user");
List l=query.list();
Transaction對象
封裝了事務的操作。我們做增刪改查等操作時,必須開啓事務.
因爲session是線程不安全的,這樣主要是爲了線程安全。保證數據的正確性。
開啓事務: Transaction ts=session.beginTransaction();
提交事務:ts.commit();
回滾事務:ts.rollback();
當通過getCurrentSession獲取當前線程綁定的Session時,事務關閉時,會自動把Session關閉並刪除。
Query對象
封裝HQL語句的對象。
返回一個對象的方法 query.uniqueResult();
分頁相關
query.setFirstResult(index):從第幾個取
query.setMaxResults(count):指定取幾行記錄
https://blog.csdn.net/Vpn_zc/article/details/82784003(hibernate緩存)
綜合自:https://blog.csdn.net/c99463904/article/details/72794787
https://blog.csdn.net/jiuqiyuliang/article/details/39078749