事物和hibernate框架—三種形態和查詢測試

一、配置文件(設置隔離級別和配置使用getCurrentSession)


<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "hibernate.cfg.xml">
<!--hibernate 配置的跟標籤  -->
<hibernate-configuration>
<!--sessionFactory(會話工廠)相當於,數據庫連接池  -->
    <session-factory>
    <!--加載數據庫的驅動類 ,基礎設置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/a_hibernate_01</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>
        <!--hibernate方言 mysql方言 limit  -->
        <!--配置使用哪個類,全類名  -->
         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
         <!--在控制檯輸出sql語句  -->
         <property name="hibernate.show_sql">true</property>
         <!--美化sql語句  -->
         <property name="hibernate.format_sql">true</property>
         <!--hbm2ddl.auto是否自動生成表結構 -->
         <property name="hibernate.hbm2ddl.auto">update</property>
         <!--   
           通過hibernate來設置事物的隔離級別
           這個事物的隔離級別設置
            1.髒讀
            2.可重複讀
            3.幻讀
            READ UNCOMMITTED  讀未提交 123             1
            READ COMMITTED    讀已提交  23           2
            REPEATABLE READ   可重複讀   3           4
            SERIALIZABLE      串行化(只能一個一個訪問)  8

            設置事物的隔離級別(etc裏面找到

這裏寫圖片描述

            specify a JDBC isolation level
            hibernate.connection.isolation 1|2|4|8
            隔離級別是用一個字節存儲的
            0001  1
            0010  2
            0100  4
            1000  8 
            -->
         <property name="hibernate.connection.isolation">4</property>
         <!--使用getCurrentSession必須配置一下 
            注意:當你使用getCurrentSession時
                 不需要你手動關閉session,系統會幫你關閉

          -->
         <property name="hibernate.current_session_context_class">thread</property>
         <!--注意:映射實體類 全文件名 從包名開始 -->
         <!--讓配置文件知道有你這個實體類 與映射文件進行關聯配置 -->
        <mapping resource="com/lanou3g/User.hbm.xml"/>


    </session-factory>
</hibernate-configuration>

二、映射文件(主鍵生成策略有7個)

1.indentity:主鍵自增,有數據庫維護
2.increment:主鍵自增,有hibernate維護,會先查詢最大id,然後
在這個最大id的基礎上+1,並且插入數據時有id
3.sequence:序列-Oracle
4.hilo:高低位算法,通過hibernate會自己通過該算法,算出主鍵自增
5.native(常用):hilo + indentity + sequence 三選一
6.uuid:全球範圍內,不重複的值,是字符串。
注意:主鍵是字符串類型,是由hibernate生成uuid,然後插入到數據庫中的
7.assigned:是由程序員自己管理主鍵
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 讓實體類 與 數據庫中的表建立起關係(字段與屬性建立關係) -->
<!--package可以添加包名,添加後,底下可以省略包名  -->
   <hibernate-mapping package="com.lanou3g">
   <!--全類名  -->
   <class name="User" table="user">
     <!-- 設置主鍵關聯,注意:表中必須要有主鍵 -->
     <id name="id" column="id">
     <!--這裏就是天蠍主鍵生成策略的地方-->
         <generator class="native"></generator>
     </id>
       <!--配置非主鍵屬性  -->
     <property name="username" column="username"></property>
      <property name="password" column="password"></property>

     <!--注意:寫完映射文件需和配置文件進行關聯  -->
   </class>
   </hibernate-mapping>

三、hibernate中的三種狀態

這裏寫圖片描述
這裏寫圖片描述

1.遊離態:沒有id,沒有和session產生關聯
2.持久態:有id,有和session產生關聯
3.遊離態:有id,沒有和session產生關聯
//hibernate的三種形態
public  void fun2() {
        //獲取session
         Session session = HibernateUtils.getSession();
         Transaction transaction = session.beginTransaction();

            User user = new User();       //瞬時態,沒有id,沒有和session關聯
            user.setUsername("wanglong"); 
            user.setPassword("123");
            session.save(user);           //持久態,有id,有session關聯
            transaction.commit();
            session.close();                  //遊離態,有id,沒有關聯

    }
解析:這裏我們獲取數據庫中數據,當我們第一次get的時候,會生成查詢語句,
獲取查詢的數據,然後在向hibernate返回結果集,並且將
結果集封裝成對象,保存在緩存中,當我們再次調用get時,這時我們會去緩存中查看是否有這個id的對象,
有的話,就不生成sql查詢語句,
沒有的話就生成sql查詢語句。
注:在這個方法執行內,所有的返回到hibernate的結果集都會保存在緩存中。

public  void fun3() {
        //獲取session
         Session session = HibernateUtils.getSession();
         Transaction transaction = session.beginTransaction();
          //---------
          /*
           * 測試一下hibernate中的緩存
           * 
           */
           User user1 = session.get(User.class, 1);
           User user2 = session.get(User.class, 1);
           User user3 = session.get(User.class, 1);
           User user4 = session.get(User.class, 1);
           User user5 = session.get(User.class, 1);
           //1.生成幾條sql語句
           //2.打印結果

           System.out.println(user2==user5);

         //----------
            transaction.commit();
            session.close();                 

    }
   快照測試:
   解析:這裏我們兩次設置usernaeme,第二個dp是數據庫中id爲1存在的,但是沒有更新數據庫的sql語句打印
   是因爲當我們第一個get的時候返回的結果集封裝成對象到hibernate中,並且分別保存到緩存中和保存到快照中,在我們去set修改的時候,第一次修改我們修改了緩存中的對象,也就是將dp變成了haha,然後我們再繼續執行set又將haha變成了dp,set語句執行完畢,當事物進行提交後,就會與快照裏面的對象進行比對:
   有:就不做修改的sql語句生成
   沒有:就生成更新的sql語句

    public  void fun4() {
        //獲取session
         Session session = HibernateUtils.getSession();
         Transaction transaction = session.beginTransaction();
          //---------
         User user = session.get(User.class, 1);
         user.setUsername("haha");
         user.setUsername("dp");
        session.update(user);
         //----------
            transaction.commit();
            session.close();                 

    }

四、查詢測試

   1.HQL查詢測試:session調用createQuery();方法,在用該方法的返回對象去調用預見結果的方法
   這個預見方法分爲兩種
   a):uniqueResult()--這個是預見但數據結果的方法
   b):list()--這個是預見多數據結果的方法
    public void fun1() {
        String hql ="From User";
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
       Query query = session.createQuery(hql);
       //------------
        //預見一下結果(單數據)
//     User user = (User)query.uniqueResult();
        List list = query.list();
        System.out.println(list);


         transaction.commit();
         session.close();
    }
2.佔位符  ?
解析:我們用createQuery()的返回對象去調用setParamenter(12)方法,
裏面的參數1:我們填寫的是索引(也就是從左到右第一個問號索引是0,第二個是1。。。。)
參數2:我們填寫的是對應的值
public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();      
       //------------
        String hql = "from User where id = ? and username = ?";
       Query query = session.createQuery(hql);
       //給語句中問號賦值,索引從0開始
       query.setParameter(0, 1);
       query.setParameter(1, "wanglong");
       User user = (User)query.uniqueResult();
       System.out.println(user);

       //----------
         transaction.commit();
         session.close();
    }
    3.冒號佔位符  :
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();      
       //------------
        //冒號後面相當於,給這個冒號佔位符,起了個別名
        //注意:冒號後面不要搞空格
        String hql = "from User where id =:ww";
       Query query = session.createQuery(hql);
       //直接使用別名,給佔位符賦值
       User user = (User)query.setParameter("ww",1);
       System.out.println(user);


       //----------
         transaction.commit();
         session.close();
    }
    4. 分頁查詢

    @Test
    public void fun4() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();      
       //------------
           String hql = "from User";
           Query query = session.createQuery(hql);
           //設置起始和最大顯示
           query.setFirstResult(2);
           query.setMaxResults(2);
           //接受結果
           List list = query.list();
           System.out.println(list);
       //----------
         transaction.commit();
         session.close();
    }
       5.無語局查詢

        public void fun5() {
            Session session = HibernateUtils.getSession();
            Transaction transaction = session.beginTransaction();      
           //------------
            Criteria criteria =  session.createCriteria(User.class);
              List list = criteria.list();
              System.out.println(list);
           //----------
             transaction.commit();
             session.close();
        }
    7.查詢一共有多少記錄數
        public void fun7() {
                    Session session = HibernateUtils.getSession();
                    Transaction transaction = session.beginTransaction();      
                   //------------
                    Criteria criteria =  session.createCriteria(User.class);
                      criteria.setProjection(Projections.rowCount());
                      //一般返回值是個數的通常都是用大Long來接收
                     Long l =(Long) criteria.uniqueResult();
                     System.out.println(l);
                   //----------
                     transaction.commit();
                     session.close();
                }
                  8.原生sql語句查詢
                   注意:返回的結果跟對象沒有關係
                    public void fun8() {
                        Session session = HibernateUtils.getSession();
                        Transaction transaction = session.beginTransaction();      
                       //------------
                        String sql = "select * from user where id = ?";
                          Query query = session.createSQLQuery(sql);
                          //一條記錄就是一個Object數組
                          query.setParameter(0, 3);
                          Object [] objects = (Object[])query.uniqueResult();
                          System.out.println(Arrays.toString(objects));
//                        List<Object[]> list = query.list();
//                        for (Object[] objects : list) {
//                          System.out.println(Arrays.toString(objects));
//                      }

                       //----------
                         transaction.commit();
                         session.close();
                    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章