隨筆-21  評論-29  文章-0  trackbacks-0
          以上實例有一個限制,即查詢對象只能根據id值來查詢。
          我們可以通過完善HibernateUtil來實現更多更能。
          package cn.itcast.hibernate;

          import java.io.Serializable;

          import org.hibernate.HibernateException;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;
          import org.hibernate.cfg.Configuration;

          public final class HibernateUtil {
              
          private static SessionFactory sessionFactory ;
              
          private HibernateUtil(){}
              
              
          static{
               Configuration cfg 
          = new Configuration() ;
                  cfg.configure();
                  sessionFactory 
          = cfg.buildSessionFactory();
               }


              
          public static SessionFactory getSessionFactory() {
                  
          return sessionFactory;
              }

              
              
          public static Session getSession(){
                  
          return sessionFactory.openSession();
              }

              
              
          public static void add(Object entity){
                  Session s 
          = null ;
                  Transaction tx 
          = null ;
                  
          try{
                      s 
          = HibernateUtil.getSession();
                      tx 
          = s.beginTransaction();
                      s.save(entity);        
                      tx.commit();
                  }
          finally {
                      
          if(s !=null)
                          s.close();
                            }

              }

              
              
          public static void update(Object entity){
                  Session s 
          = null ;
                  Transaction tx 
          = null ;
                  
          try{
                      s 
          = HibernateUtil.getSession();
                      tx 
          = s.beginTransaction();
                      s.update(entity);        
                      tx.commit();
                  }
          finally {
                      
          if(s !=null)
                          s.close();
                            }

              }

              
              
          public static void delete(Object entity){
                  Session s 
          = null ;
                  Transaction tx 
          = null ;
                  
          try{
                      s 
          = HibernateUtil.getSession();
                      tx 
          = s.beginTransaction();
                      s.delete(entity);        
                      tx.commit();
                  }
          finally {
                      
          if(s !=null)
                          s.close();
                            }

              }

              
              
          public static Object get(Class clazz,Serializable id){
                  Session s 
          = null ;
                  
          try{
                      s 
          = HibernateUtil.getSession();
                      Object obj 
          = s.get(clazz, id);
                      
          return obj ;
                  }
          finally {
                      
          if(s !=null)
                          s.close();
                            }

              }

          }
          以上代碼就能實現常用的增、刪、改以及根據id查詢的功能了!

          HQL(Hibernate Query Language)
          面向對象的查詢語言,與SQL不同,HQL中的對象名是區分大小寫的(除了JAVA類和屬性其他部分不區分大小寫);HQL中查的是對象而不是表,并且支持多態;
          HQL主要通過Query接口來操作,Query的創建方式:
             Query q  =  session.createQuery(hql);
                 from Person
                 from  User  user  where  user.name =: name 
                 from  User  user  where  user.name =: name and user.birthday<:birthday

          Criteria
              Criteria是一種比HQL更面向對象的查詢方式。Criteria的創建方式:
                Criteria  crit = session.createCriteria(DomainClass.class);
                簡單屬性條件如: criteria.add(Restrictions.eq(propertyName,value));
                                                  criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName));

          實例操作
            新建一QueryTest類
          package cn.itcast.hibernate;

          import java.util.Date;
          import java.util.List;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import cn.itcast.hibernate.domain.User;

          public class QueryTest {

              
          public static void main(String[] args) {
                  User user 
          = new User();
                  user.setBirthday(
          new Date());
                  user.setName(
          "name");
                  HibernateUtil.add(user);    
                  query(user.getName());
              }

              
              
          static void query(String name){
                  Session s 
          = null ;
                  
          try{
                      s 
          = HibernateUtil.getSession();
                      String hql 
          = "from User as user where user.name=?";//from Object
                      Query query = s.createQuery(hql);
                      query.setString(
          0, name);
                      List
          <User> list = query.list();//list作用類似于executeQuery
                      
          //User u = (User)query.uniqueResult(); //當查詢結構唯一的時候可以使用
                      
          //System.out.print(u);
                      for(User user : list){
                          System.out.println(user.getName());
                      }

                  }
          finally {
                      
          if(s !=null)
                          s.close();
                            }

              }

          }

          觀察輸出結果


          Oracle中 實體類或屬性名與數據庫關鍵字沖突問題
          以上是User.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"
          >
          <hibernate-mapping package="cn.itcast.hibernate.domain">
              
          <class name="User" table="user">
                  
          <id name="id">
                      
          <generator class="native" />
                  
          </id>        
                  
          <property name="name" column="name"/>
                  
          <property name="birthday"/>        
              
          </class>
          </hibernate-mapping>
          User類默認關聯的表名為user,但是user在oracle中是關鍵字
          我們可以設置表名為tuser。
          如果tuser已經存在,給表明加一對反引號,`user` 即可。不過最好還是只改表明。

          如果是字段名(屬性名)和關鍵字相沖突,其處理方法也是一樣的!

          HQL的命名參數
          String hql = "from User as user where user.name=?";//from Object
                      Query query = s.createQuery(hql);
                      query.setString(
          0, name);
          以上語句中,如果where后面的屬性有多個,就需要多個問號,而且在set方法里面容易犯錯,比如記錯順序等。不利于維護。
          為解決這個問題,我們可以使用HQL的命名參數來解決,代碼如下:
          String hql = "from User as user where user.name=:name";//from Object
                      Query query = s.createQuery(hql);
                      query.setString(
          "name", name);

          Query接口的兩個方法實現分頁查詢
                      query.setFirstResult(200); //從第200條記錄開始
                      query.setMaxResults(10);   //共set 10條記錄
          利用方言可以實現各個數據庫的分頁查詢。
          posted on 2009-05-04 15:11 特立獨行 閱讀(302) 評論(0)  編輯  收藏 所屬分類: Hibernate框架
          主站蜘蛛池模板: 北海市| 湘潭市| 荔浦县| 阿坝县| 溧阳市| 新泰市| 丽水市| 德昌县| 寿光市| 吉水县| 崇义县| 明溪县| 乾安县| 永登县| 武宣县| 黄浦区| 永善县| 德庆县| 涟水县| 新田县| 莱西市| 博客| 京山县| 苗栗市| 双峰县| 蓝田县| 阿拉善盟| 奇台县| 赣州市| 璧山县| 江华| 呼和浩特市| 莲花县| 来宾市| 岑巩县| 芦山县| 日照市| 成安县| 八宿县| 蒙自县| 汪清县|