您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Hibernate的重要技術指的是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Hibernate技術有很多值得學習的地方,這里我們主要介紹Hibernate技術的一些強大功能,包括Hibernate技術技術開發流程等方面。
Hibernate技術開發流程:
1.配置文件:
@.properties格式的
@.xml格式的(常用hibernate.cfg.xml)(放在src下面或者是wen-inf\classes下面)
SessionFactory sf=new Configuration().configure().buildSessionFactory(); 或者SessionFactory sf=new Configuration().configure("db.cfg.xml").buildSessionFactory();
2.編寫映射文件:
例如:User.hbm.xml 映射文件的編寫有很多內容,可以采用相關的根據自動生成映射文件,在這里就不介紹了
3.寫持久化類:
例如:User.java
4.在編寫DAO之前先寫HibernateSessionFactory類
package com.wuxiaoxiao.hibernate; import org.hibernate.Session; import org.hibernate.HibernateException; import org.hibernate.cfg.Configuration; public class HibernateSessionFactory{ private static final String CONFIG_FILE_LOCATION="/hibernate.cfg.xml"; private static final ThreadLocal threadLocal=new ThreadLocal(); private static final Configuration cfg=new Configuration(); private static org.hibernate.SessionFactory sessionFactory; //取得session public static Session currentSession()throws HibernateException{ Session session=threadLocal.get(); if(session==null){ if(sessionFactory==null){ try{ cfg.configuration(CONFIG_FILE_LOCATION); sessionFactory=cfg.buildSessionFactory(); }catch(Exception e){ System.err.println("%%%Error Creating SessionFactory %%%%"); e.printStackTrace(); } } session=sessionFactory.openSession(); threadLocal.set(session); } return session; } //關閉session public static void closeSession()throws HibernateException{ Session session=(Session)threadLocal.get(); threadLocal.set(null); if(session!=null) session.close(); } }
threadLocal是thread local variable,為每一個訪問它的線程都提供一個變量值的副本,是每一個線程都可以獨立的改變自己的副本,而不會和其他線程的副本沖突。ThreadLocal有三個主要的方法:initValue()初始化變量值,get(),set(Object)例子:
public class ConnectionFactory{ private fianl String URL="jdbc:mysql://localhsot/mysatabase"; private static ThreadLocal<Connection> connectionHolder=new ThreadLocal<Connection>(){ public COnnection initValue(){ try{ return DriverManager.getConnection(URL);}catch(Exception e){} } }; public Connection getConnection(){ return connectionHolder.get(); } }
5.編寫DAO例如:
public User getUser(String username)throws HibernateException{ Session session=null; Transaction tx=null; User user=null; try{ session=HibernateSessionFactory.currentSession(); tx=session.beginTransaction(); Query query=session.createQuery("from User where username=?"); query.setString(0,username.trim()); user=(User)query.uniqueResult(); query=null; tx.commit(); }catch(HibernateException e){throw e; }finally{ if(tx!=null) tx.rollback(); HibernateSessionFactory.closeSession(); } return user; }
6.編寫service類
public boolean valid(String username,String password){}
下面主要介紹session操縱數據庫@對象的狀態:
Hibernate定義并支持下列對象狀態(state):
瞬時(Transient) - 由new操作符創建,且尚未與Hibernate Session 關聯的對象被認定為瞬時(Transient)的。瞬時(Transient)對象不會被持久化到數據庫中,也不會被賦予持久化標識(identifier)。 如果瞬時(Transient)對象在程序中沒有被引用,它會被垃圾回收器(garbage collector)銷毀。 使用Hibernate Session可以將其變為持久(Persistent)狀態。(Hibernate會自動執行必要的SQL語句)
持久(Persistent) - 持久(Persistent)的實例在數據庫中有對應的記錄,并擁有一個持久化標識(identifier)。 持久(Persistent)的實例可能是剛被保存的,或剛被加載的,無論哪一種,按定義,它存在于相關聯的Session作用范圍內。 Hibernate會檢測到處于持久(Persistent)狀態的對象的任何改動,在當前操作單元(unit of work)執行完畢時將對象數據(state)與數據庫同步(synchronize)。 開發者不需要手動執行UPDATE。將對象從持久(Persistent)狀態變成瞬時(Transient)狀態同樣也不需要手動執行DELETE語句。
脫管(Detached) - 在數據庫中存在記錄,但不與session關聯!與持久(Persistent)對象關聯的Session被關閉后,對象就變為脫管(Detached)的。 對脫管(Detached)對象的引用依然有效,對象可繼續被修改。脫管(Detached)對象如果重新關聯到某個新的Session上, 會再次轉變為持久(Persistent)的(在Detached其間的改動將被持久化到數據庫)。 這個功能使得一種編程模型,即中間會給用戶思考時間(user think-time)的長時間運行的操作單元(unit of work)的編程模型成為可能。 我們稱之為應用程序事務,即從用戶觀點看是一個操作單元(unit of work)
@使用sve()保存對象,使之成為持久化
Session session=HibernateSessionFactory.currentSession(); User user=new User(); user.setName("wuxiaoxiao"); user.setPassword(123456); session.save(user);
@使用load()裝在對象
User user=(User)session.load(User.class,new Integer(1));
若對象不存在就會拋出無法修復的異常
@使用get()裝在對象
User user=(User)session.get(User.class,new Integer(4));
若對象不存在的話,就返回null @使用flush()強制提交刷新
User user=(User)session.get(User.class,new Integer(4)); user.setUsername("ranran"); user.setPassword("123456"); session.flush();
對user的更新是在同一個session中,不需要用update()或者saveOrUpdate()
@使用delete()移除持久化對象
User user=(User)session.get(User.class,new Integer(4)); session.delete(user); session.flush();
@使用update()方法提交托管狀態的對象
update()用于根據給定的托管對象實例的標示更新對應的持久化實例!如果傳入一個持久化對象,那么update()方法就是多余的。如果傳入臨時狀態的對象就會出錯,除非認為的給臨時地給對象指定一個id。不管傳入的是什么狀態的對象,數據庫中必須要有一條記錄與這個對象的id相對應,否則拋出異常!
@saveOrUpdate()傳遞的對象在數據庫中若存在就更新,否則就插入!他和update()主要是處理托管狀態的對象!
@使用refresh()強制裝在對象,如果數據庫中使用了觸發器來處理對象的而某些屬性,這個方法就更有用了!
session.save(user); session.flush(); session.refresh(user);
使用Transaction管理事務
例子:如上面編寫DAO的例子 使用Query進行HQL查詢 @不帶參數的查詢
Query query=session.createQuery("from User");
@帶參數的查詢
Query query=session.createQuery("from User where username=:username"); query.setString("username","wuxiaoxiao"); 或者 List names=new ArrayList(); names.add("wuxiaoxiao"); names.add("ranran"); Query query=session.createQuery("from User where username in (:namelist)"); query.setParameterList("namelist",names); 或者 Query query=session.createQuery("from User where username=?"); query.setSrting(0,"wuxiaoxiao");
@取得list結果集
List list=query.list();
@取得迭代列表結果集
Iterator iterator1=query.iterator(); 或者 Iterator iterator2=query.list().iterator(); while(iterator.hasNext()) User user=(User)iterator2.next();
@取得一個對象
Query query=session.createQuery("from User where username=?"); query.setString(0,"wuxiaoxiao"); User user=(User)query.uniqueResult();
@標量查詢
Iterator results = sess.createQuery( "select user.name,count(user.email) from User user " + "group by user.name") .list() .iterator(); while ( results.hasNext() ) { Object[] row = (Object[]) results.next(); String type = (String) row[0]; Integer count = (Integer) row[1]; ..... }
@分頁查詢
Query q = sess.createQuery("from DomesticCat cat"); q.setFirstResult(20); q.setMaxResults(10); List cats = q.list();
@創建sql查詢
使用Criteria進行條件查詢
以上就是Hibernate的重要技術指的是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。