想飛就別怕摔

          大爺?shù)牟M罵人

          Hibernate中操縱實體對象

          一、Session的保存、刪除及更新
          1.save()方法:將一個對象的屬性取出放入PreparedStatement語句中,然后向數(shù)據(jù)庫中插入n語句。
          例:
          //打開Session,開啟事務
          Students students = new Students();
                  students.setCardId(
          20080929);//設置學號
                  session.save(students);
                  System.out.println(students.getid());
          //提交事務,關閉Session

          2.update()方法:
          例:
          //打開Session,開啟事務
          students=(Students)session.get(Students.class,"1");
                  students.setName(
          "123");
                  session.update(students);
          //提交事務,關閉session
          3.批量更新:在進行批量操作時,最好的方法是調用JDBC的API進行操作。
          例:將所有學生的姓名前加上一個字符串“xiao”。
          Connection conn = session.connection();
          PreparedStatement stmt 
          = conn.prepareStatement("update students  set sname='xiao'+sname");
          stmt.executeUpdate();
          4.saveOrUpdate()方法:與save方法,update方法用法相同。只是處理的細節(jié)不同。
          5.delete()方法:
          負責刪除一個對象例:
          //打開Session,開啟事務
          students=(Students)session.get(Students.class,"1");
          session.delete(students);
          //提交事務,關閉Session
          二、通過主鍵ID取得數(shù)據(jù)對象
          1.get()方法:用立即加載的方式發(fā)送SQL語句,并得到已經初始化的對象。
          //打開Session,開啟事務
          Students students=(Students)session.get(Students.class,"1")
          //提交事務,關閉Session
          2.load()方法:它返回一個代理對象,直到這個對象被訪問,此代理對象才會被初始化。
          students = (Students)session.load(Students.class1);
              System.out.println(students.getSid());
          三、Query接口(重點)
          1.使用“?”綁定參數(shù)
          例:查找age大于27,名字中有a的所有記錄,打印姓名和年齡。
          Students students = new Students();
                  Query query 
          = session.createQuery("from Students where age>? and sname like ?");
                  query.setInteger(
          027);
                  query.setString(
          1,"%a%");
                  List list
          = query.list();
                  
          for(int i=0;i<list.size();i++)
                  
          {
                      students 
          = (Students)list.get(i);
                      System.out.print(students.getSname()
          +",");
                      System.out.println(students.getAge());
                  }
          2使用“:”后跟變量的方法設置參數(shù)
          Students students = new Students();
                  Query query 
          = session.createQuery("from Students where age>:minAge and sname like:likeName");
                  query.setInteger(minAge, 
          27);
                  query.setString(likeName,
          "%a%");
                  List list
          = query.list();
                  
          for(int i=0;i<list.size();i++)
                  
          {
                      students 
          = (Students)list.get(i);
                      System.out.print(students.getSname()
          +",");
                      System.out.println(students.getAge());
                  }
          3.使用命名查詢(namedQuery)
          students.hbm.xml的源碼如下:
           1<?xml version="1.0" encoding="utf-8"?>
           2<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           3"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
           4<hibernate-mapping>
           5    <class name="com.zzn.hibernate.Students" table="students" schema="dbo" catalog="hibernate">
           6        <id name="sid" type="java.lang.Integer">
           7            <column name="sid" />
           8            <generator class="native"></generator>
           9        </id>
          10        <property name="sname" type="java.lang.String">
          11            <column name="sname" length="10" not-null="true" />
          12        </property>
          13        <property name="age" type="java.lang.Integer">
          14            <column name="age" not-null="true" />
          15        </property>
          16    </class>
          17    <query name="queryStudents_byAgeAndName">
          18        <![CDATA[
          19            from Students where age>25:minAge and sname like:likeName
          20            ]]>
          21    </query>
          22</hibernate-mapping>
          23
          使用命名查詢的源碼如下:
           1package com.zzn.hibernate;
           2import java.util.List;
           3import org.hibernate.Query;
           4import org.hibernate.Session;
           5import org.hibernate.SessionFactory;
           6import org.hibernate.Transaction;
           7import org.hibernate.cfg.Configuration;
           8
           9public class Test3 {
          10    @SuppressWarnings("unchecked")
          11    public static void main (String[]args){
          12        Configuration configuration = new Configuration().configure();
          13        SessionFactory sessionFactory = configuration.buildSessionFactory();
          14        Session session = sessionFactory.openSession();
          15        Transaction transation = session.beginTransaction();
          16        
          17        Students students = new Students();
          18        Query query = session.getNamedQuery("queryStudents_byAgeAndName");
          19        query.setInteger("minAge"25);
          20        query.setString("likeName""%a%");
          21        List list = query.list();
          22        for(int i=0;i<list.size();i++)
          23        {
          24            students = (Students)list.get(i);
          25            System.out.println(students.getSname());
          26            System.out.println(students.getAge());
          27            System.out.print(students.getSid());
          28        }

          29        transation.commit();
          30        session.close();
          31    }

          32}

          33
          四、查詢緩存:對于有很多select語句,可insert、delete、update、語句較少的情況,使用查詢緩存性能上有一定的改善作用。反之查詢比較少的情況,這方法意義就不大了。
          (1)在hibernate.cfg.xml中設定hibernate.cache.use_query_cache屬性
          1<?xml version='1.0' encoding='UTF-8'?>
          2<!DOCTYPE hibernate-configuration PUBLIC
          3          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          4          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
          5<hibernate-configuration>
          6<session-factory>       
          7<property name="hibernate.cache.use_query_cache">true</property>
          8</session-factory>
          9</hibernate-configuration>
          (2)每次建立Query實例時,執(zhí)行setCacheable(true)。
           1Students students= new Students();
           2        Query query = session.createQuery("from Students");
           3        query.setCacheable(true);//準許把查詢放入查詢緩存
           4        List list=query.list();
           5        for(int i=0;i<list.size();i++){
           6            students =(Students) list.get(i);
           7            System.out.println(students.getSname());
           8        }

           9        //一下是再次查詢并打印
          10        Query q = session.createQuery("from Students");
          11        q.setCacheable(true);
          12        List l=q.list();
          13        for(int i=0;i<l.size();i++){
          14            students =(Students) l.get(i);
          15            System.out.println(students.getSname());
          16        }
          (3)從結果可以看出第一次查詢是從數(shù)據(jù)庫查詢出來的,而第二次則是從緩存中將Query中的結果返回的。
          五、清除緩存對象:如果在數(shù)據(jù)庫中插入1000000條數(shù)據(jù),再插入500000條時程序拋出例外OutOfMemoryException。因為Hibernate總是把新添加的對象加入到Session級別的緩存中。所以我們必須清除緩存。
          (1)clear()方法:
          在hibernate.cfg.xml中設置
          1<?xml version='1.0' encoding='UTF-8'?>
          2<!DOCTYPE hibernate-configuration PUBLIC
          3          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          4          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
          5<hibernate-configuration>
          6<session-factory>   
          7<property name="hibernate.jdbc.batch_size">20</property>
          8</session-factory>
          9</hibernate-configuration>
          然后在一個合適的頻率下調用flush()清理緩存發(fā)送SQL語句,調用Session的clear()方法清空Session緩存。
           1//打開Session,開啟事務
           2for(int i=0;i<1000000;i++){
           3    Students students = new Students();
           4    students.setCardid();
           5    session.save(students);
           6    if(i%20){
           7        //第20個對象保存一次,之后馬上清空Session
           8        session.flush();
           9        session.clear();
          10    }

          11}

          12//提交事務,關閉session
          (2)evict()方法:清除緩存中的某個對象
          1//打開事務Session,開啟事務
          2        for(int i=0;i<1000000;i++){
          3            Students students = new Students();
          4            students.getSid();
          5            session.save(students);
          6            session.evict(students);//把students對象 清除出Session緩存
          7            SessionFactory.evict(Students.class,students.getSid());//把students對象清除出二級緩存
          8        }

          9        //提交事務,關閉Session
          以上說的都是重點要掌握的,還有一些方法如:setEntity();setparameter();setPropertyies();uniqueResult();iterator()等大家有興趣也可以自己去看看。

          posted on 2008-09-28 12:20 生命的綻放 閱讀(434) 評論(0)  編輯  收藏 所屬分類: Hibernate

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統(tǒng)計

          常用鏈接

          留言簿(5)

          隨筆分類(94)

          隨筆檔案(93)

          文章分類(5)

          文章檔案(5)

          相冊

          JAVA之橋

          SQL之音

          兄弟之窗

          常用工具下載

          積分與排名

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 凌云县| 克什克腾旗| 略阳县| 凤冈县| 图们市| 连云港市| 广德县| 安义县| 嵩明县| 古交市| 大冶市| 和田县| 巴彦淖尔市| 江北区| 马关县| 紫金县| 德钦县| 类乌齐县| 神木县| 达孜县| 商城县| 潢川县| 交城县| 赤城县| 噶尔县| 萨迦县| 青阳县| 贵南县| 佛冈县| 庄河市| 孝感市| 宽城| 钟祥市| 合水县| 莆田市| 电白县| 大关县| 伊通| 阿图什市| 界首市| 登封市|