<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
hibernate的概念:
hibernate是一個ormapping框架(ORM框架,全自動ORM框架)
hibernate是一個資料庫的操作框架即持久層框架
Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫(SQL語句由Hibernate根據物件自動生成)。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的使用者端程式使用,也可以在Servlet/JSP的Web應用中使用.。
提示:以下是本篇文章正文內容,下面案例可供參考
1、Hibernate的程式碼是比較簡單的。
2、Hibernate是物件導向的操作。
3、Hibernate的資料庫移動植性很強。
4、Hibernate的快取是世界級的。
1、不能干預sql語句的生成所以如果一個專案中,如果對sql語句的優化要求比較高,那麼不適合用hibernate
2、如果一張表中有千萬級別的資料量,也不適合用hibernate(因為快取機制,它會將大量資料放入快取)
3、hibernate適合用中小型企業開發軟體
4、hibernate不適合處理複雜SQL。
專案目錄
1、第一步導包
2、第二步編寫Hibernate的組態檔
我用的是Mysql資料庫,你要是用別的把資料來源驅動資訊改一下即可。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!--建立資料來源--> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/MySql</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- SQL 方言 --> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <!-- 是否顯示SQL --> <property name="show_sql">true</property> <!-- 實現格式化的sql --> <property name="format_sql">true</property> <!-- 是否自動生成物件 create 表示每次都重新建立所需物件 update表示如果有就直接使用,如果修改則更新,如果沒有則建立 <property name="hbm2ddl.auto">update</property> --> <!--設定hibernate對映檔案 --> <!--設定對映檔案--> <mapping resource="com/zrrd/mapper/Dept.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
關於方言可以參考下面的圖片,根據專案需求設定即可。
3、第三步:編寫持久化類(pojo類)
package com.zrrd.vo; public class Dept { private Integer deptno; private String dname; private String loc; public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } //直接轉換,看著方便 @Override public String toString() { return "Dept{" + "deptno=" + deptno + ", dname='" + dname + ''' + ", loc='" + loc + ''' + '}'; } public Dept() { super(); } public Dept(Integer deptno, String dname, String loc) { this.deptno = deptno; this.dname = dname; this.loc = loc; } }
4、第四步:編寫Hibernate對映檔案(*.hbm.xml)
該檔案完成 持久化類和資料庫中指定表的對映。說白了就是說明持久化類對應資料庫中的哪張表,類中的每個屬性都對應資料庫中的那些欄位。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- package="com.javashidai.hibernate001.domain" 指明持久化類所在的包 --> <hibernate-mapping package="com.zrrd.vo"> <!-- name="Dept" 表示類名 table="dept" 對應的表名 --> <class name="Dept" table="dept" > <!-- 指明主鍵對應的屬性和欄位 name="deptno" 表示持久化類中的deptno對應主鍵欄位 column="deptno"表示是主鍵欄位 --> <id name="deptno" column="deptno"> <!-- 主鍵生成策略 :序列 --> <generator class="sequence"> <!-- 指明所需的序列名 --> <param name="sequence">SEQ_DEPT</param> </generator> </id> <!-- property指明非主鍵列 name="dname"表示持久化類中的屬性名 length="14"指明資料庫中對應欄位接收的長度 column="dname" 指明對應資料庫中的什麼欄位 type="string" 對應的資料型別 --> <property name="dname" length="14" column="dname" type="string"/> <property name="loc" length="13" column="loc" type="string"/> </class> </hibernate-mapping>
5、第五步:編寫測試類完成對資料庫的操作
package com.zrrd.text; import com.zrrd.vo.Dept; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Text { public static void main(String[] args){ //讀取Hibernate.cfg.xml組態檔 Configuration configuration=new Configuration(); configuration.configure("hibernate.cfg.xml"); //建立sessionfactory工程 SessionFactory sessionFactory=configuration.buildSessionFactory(); //建立Session物件 Session session=sessionFactory.openSession(); //建立實體物件(與資料庫中表對應的vo物件為實體物件,進而運算元據庫(由Hibernate自動建立SQL語句) Dept dept=session.get(Dept.class,1); System.out.println(dept); session.close(); sessionFactory.close(); } }
執行結果圖
資料庫存的資料
Hibernate的核心介面一共有6個,分別為:Session、SessionFactory、
Transaction、Query、Criteria和Configuration。這6個核心介面在任何開發中都會用到。通過這些介面,不僅可以對持久化物件進行存取,還能夠進行事務控制。
1.Session
Session介面負責執行被持久化物件的CRUD操作(CRUD的任務是完成與資料庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session物件是非執行緒安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裡當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSession物件稱為使用者session。
2.SessionFactory
SessionFactory介面負責初始化Hibernate。它充當資料儲存源的代理,並負責建立Session物件。這裡用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個專案通常只需要一個SessionFactory就夠,當需要操作多個資料庫時,可以為每個資料庫指定一個SessionFactory。
3.Transaction
Transaction 介面是一個可選的API,可以選擇不使用這個介面,取而代之的是Hibernate 的設計者自己寫的底層事務處理程式碼。 Transaction 介面是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作介面,使得自己的專案可以在不同的環境和容器之間方便地移植。
4.Query
Query介面讓你方便地對資料庫及持久物件進行查詢,它可以有兩種表達方式:HQL語言或本地資料庫的SQL語句。Query經常被用來繫結查詢引數、限制查詢記錄數量,並最終執行查詢操作。
5.Criteria
Criteria介面與Query介面非常類似,允許建立並執行物件導向的標準化查詢。值得注意的是Criteria介面也是輕量級的,它不能在Session之外使用。
6.Configuration
Configuration 介面的作用是對Hibernate 進行設定,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的範例首先定位對映檔案的位置,讀取這些設定,然後建立一個SessionFactory物件。雖然Configuration 介面在整個Hibernate 專案中只扮演著一個很小的角色,但它是啟動hibernate 時所遇到的第一個物件。
當然我們在實際開發的專案當中肯定不會CRUD的時候都去寫測試類裡面的程式碼,這樣會導致專案程式碼量巨大而且可移植性太差,所以我們要封裝一下寫一個工具類,用的時候直接呼叫即可。
public class HibernateUtil { //一個Hibernate容器中只需要一個SessionFactory private static SessionFactory sessionFactory; //利用靜態程式碼框建立SessionFactory物件 static { //建立Configuration物件 Configuration conf = new Configuration(); //載入Hibernate組態檔 conf.configure();//預設載入src下的hibernate.cfg.xml //建立SessionFactory物件 sessionFactory = conf.buildSessionFactory(); } //得到Session物件 public static Session getSession() { return sessionFactory.openSession(); } }
我都已經寫好啦相關執行的方法,你只要改改返回的型別就可以啦,就像Jpa框架那樣,直接在你的專案中使用就可以啦。不用太感謝我,為人民服務!
1.根據主鍵查詢物件
public Dept selectOne(int deptno) { Dept dept= null; //得到session物件 Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //根據主鍵得到對應的資訊 dept = (Dept) session.get(Dept.class, deptno); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } return dept; }
2.查詢全部的資訊
public static List<Dept> queryDept() { List<Dept> deptList = null; //宣告session Session session = null; try { //建立Session物件 session= HibernateUtil.getSession(); //宣告HQL :其中Dept為實體類 String hql="from Dept ";//from後寫的是類名 //得到Query物件 Query query = session.createQuery(hql); //執行查詢 deptList = query.list(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } return deptList; }
3.條件查詢
public List<Dept> queryDeptByLoc(String loc) { List<Dept> deptList = null; //宣告session Session session = null; try { //建立Session物件 session= HibernateUtil.getSession(); //宣告HQL :其中Dept為實體類 String hql="from com.zrrd.vo.Dept where loc=:loc ";//:loc表示是引數 //得到query物件 Query query = session.createQuery(hql); //給引數賦值 query.setString("loc", loc);//給指定引數賦值 //查詢返回List<Dept> deptList = query.list(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } return deptList; }
4.根據主鍵刪除
public void deleteDept(int deptno) { //宣告Session物件 Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //開啟事務保護 Transaction ta = session.beginTransaction(); //根據id得到對應的值 Dept deleteObj = (Dept) session.get(Dept.class, deptno); //刪除該對應 session.delete(deleteObj); //提交事務 ta.commit(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } }
5.根據指定條件刪除
/** * 利用Hql進行刪除 * 根據部門編號進行刪除 */ public int deleteDeptByLoc(String loc) { int result =0; //宣告Session物件 Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //開啟事務保護 Transaction ta = session.beginTransaction(); //編寫刪除使用的HQL 這裡的:loc表示引數名 String hql="delete com.zrrd.vo.Dept where loc=:loc"; //得到Query物件 Query query =session.createQuery(hql); //給引數賦值 query.setString("loc", loc); //執行DML語句 result = query.executeUpdate(); //提交事務 ta.commit(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } return result; }
6.修改單個物件
public static void updateDept(Dept dept) { //宣告Session物件 Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //開啟事務保護 Transaction ta = session.beginTransaction(); //根據持久化物件進行修改 session.update(dept); //提交事務 ta.commit(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } }
7.根據條件進行修改(HQL)
public static int updateDeptLoc(String oldLoc,String newLoc) { int result =0; //宣告Session物件 Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //開啟事務保護 Transaction ta = session.beginTransaction(); //編寫刪除使用的HQL 這裡的:loc表示引數名 String hql="update Dept set loc=:newLoc where loc=:oldLoc"; //得到Query物件 Query query =session.createQuery(hql); //給引數賦值 query.setString("newLoc", newLoc); query.setString("oldLoc", oldLoc); //執行DML語句 result = query.executeUpdate(); //提交事務 ta.commit(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } return result; }
8.將物件存入資料庫
public static void saveDept(Dept dept) { Session session = null; try { //得到Session物件 session = HibernateUtil.getSession(); //得到事務物件 Transaction ta = session.beginTransaction(); //將持久化物件存入 資料庫 session.save(dept); //提交事務 ta.commit(); } catch(Exception e) { e.printStackTrace(); } finally { if(session != null) { session.close(); } } }
1、increment:表示hibernate呼叫所連線的資料庫的加一機制為該欄位生成資訊(即生成主鍵)
2、identity:表示由所連線的資料本身呼叫自加一機制為該欄位生成資訊(即生成主鍵)
Increment 和identity的區別在於前者是由hibernate呼叫生成機制,後者是資料庫本身呼叫生成機制(即您在建表的時候就宣告該欄位是自動加一的)。但是以上兩種主鍵生成機制在連線Oracle時都不適用。因為Oracle沒有自動加一機制。如果Oracle要用自動加一機制就必須依靠。
3、sequence:表示該欄位由資料的序列生成,如果不想指定特定的序列則在Oracle中該序列名字必須叫HIBERNATE_SEQUENCE 用於預設選擇。
4、uuid:根據UUID演演算法生成生成32位元字元型別的主鍵資訊。
5、guid:利用資料庫提供的sys_guid 函數生成主鍵。但是要注意不是所有資料庫都有sys_guid函數的。所以首選還是uuid
6、native:根據具體連線的資料庫從identity, sequence或者hilo選擇一種來生成主鍵。適用的資料庫根據選擇的生成方式確定。(這個情況資料庫是可以跨越的,因為它能自動選擇生成方案),在Oracle中就必須有名字叫HIBERNATE_SEQUENCE的序列
assigned: 交給應用自己給主鍵賦值。要注意的是賦值必須在呼叫save()方法之前完成。適用的資料庫根據選擇的生成方式確定。
在Hibernate中可以使用純java型別和Hibernate指定型別。在Hibernate框架的內部可以自動對Java型別或者Hibernate型別完成對錶的對應。建議在開發中使用java型別,效率比較快
以上文章只是其中的一部分只是教你如何實現框架實現CRUD的操作,最重要的是後續我要寫的知識點:反向建立Hibernate工程、物件(DO物件)的三種狀態、一對多關係(在主物件設計從物件集合屬性)、多對多、懶載入(延遲載入)、抓取策略、Hibernate的一級快取(Session快取)、Hibernate的二級快取、HQL、Query.list和query.iterator等等,這些才是重中之重,任重而道遠。
到此這篇關於持久層ORM框架Hibernate框架的使用及搭建方式的文章就介紹到這了,更多相關ORM框架Hibernate框架使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45