Hibernate操作數據庫總結

初次使用Hibernate框架的時候,只知道用HQL和原生SQL操作數據庫,後來發現竟然還有幾種更方便的方法,在此做個總結。
1、使用HQL語句和Query接口,HQL語句語法是:select c from Cat c where …
其中Cat是一個實體類,c是實體類對象,查詢類對象屬性,用“.”。如果存在不同包中有同名類,則必須指明包,如com.hibernate.entity.Cat,HQL大小寫不敏感。

Session session = null;  
Query query = null;  
String hql = null;  
try {  
     session = HibernateSessionFactory.getSession();  
     hql="From TUser user where user.suser='admin'";  
     query = session.createQuery(hql);  
     List list = query.list();
     //使用參數  
     //hql="From TUser user where user.suser=:name";  
     //query = session.createQuery(hql);  
     //List list = query.setParameter("name","admin").list();
     for (Iterator iter = list.iterator(); iter.hasNext();) {  
         TUser user = (TUser) iter.next();  
         System.out.println("----Query---");  
         System.out.println("-Suser-="+user.getSuser());  
         System.out.println("-Name--="+user.getName());  
         System.out.println("-Email-="+user.getEmail());  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    }finally{  
        HibernateSessionFactory.closeSession();  
    }  

2、使用原生SQL語句和SQLQuery接口
原生SQL語句和HQL語句操作幾乎是完全一樣,原生SQL語句彌補了HQL語句的不足,SQLQuery返回的結果類型爲Object的list,如果需要返回實體類對象,採用addEntity方法,如query.addEntity(Cat.class)。
3、使用Criteria接口()**
Criteria 本身只是一個查詢容器,具體的查詢條件需要通過Criteria.add方法加到Criteria實例中。createCriteria方法的參數是待查詢的實體類

Criteria criteria =
session.createCriteria(TPerson.class);  
criteria.add(Restrictions.eq("name", "oham"));  
criteria.add(Restrictions.eq("address", "earth"));    
criteria.list(); 

當查詢條件不止一個時,可使用多個add方法。如:

 Criteria criteria =  session.createCriteria(User1.class);
 criteria.add(Restrictions.like("name", "%張%"));
 criteria.add(Restrictions.eq("password", "123"));
 List<User1> list = criteria.list(); 

也可以採用組合查詢。如:

 Criteria criteria =  session.createCriteria(User1.class);
criteria.add(Restrictions.or(Restrictions.eq("password", "123"), 
Restrictions.eq("password", "234")));
List<User1> list = criteria.list();

對查詢結果進行排序:criteria.addOrder(Order.asc(“name”));
此外,Criteria接口也支持類似HQL的分頁

 Criteria criteria =  session.createCriteria(User1.class);
criteria.setFirstResult(1);
criteria.setMaxResults(3);
List<User1> list = criteria.list();

表示從第1條記錄開始,查詢3條記錄,與HQL中分頁意義一樣。
**Criteria接口中常用的方法:
Restrictions.eq 等於
Restrictions.allEq 使用Map,使用key/value進行多個等於的比對
  Restrictions.gt 大於 >
  Restrictions.ge 大於等於 >=
  Restrictions.lt 小於 <
  Restrictions.le 小於等於 <=
  Restrictions.between 對應SQL的BETWEEN子句
  Restrictions.like 對應SQL的LIKE子句
  Restrictions.in 對應SQL的in子句
  Restrictions.and and關係
  Restrictions.or or關係**
4、查詢單個對象,get和load方法(注意二者的區別)
可以使用session.load(實體類,id號)或session.get(實體類,id號)從數據庫獲得一個對象,但是二者是有區別的。
使用load方法時,hibernate會使用延遲加載的機制來加載這個對象,得到的對象只是一個代理對象,對象中只包含實體對象的id值,只有當我們要使用這個對象,得到其它屬性時,這個時候纔會發出sql語句,從數據庫中去查詢我們的對象,如果查詢的對象不存在時,系統會報ObjectNotFoundException異常
而使用get方法時,Hibernate會發出sql語句去數據庫中把實體查詢出來,如果查詢的對象不存在時,系統會報NullPointException的異常

session = HibernateSessionFactory.getSession();
TUser user = (TUser)session.load(TUser.class, 4);
TUser user = (TUser)session.get(TUser.class, 4);

以上只是整理了我目前瞭解的數據庫操作方式,還有很多方法待研究!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章