動態

詳情 返回 返回

Hibernate的升級&&Query用法 - 動態 詳情

一、基本概念
1、Configuration:

    概述: Configuration類負責管理Hibernate的配置信息。啓動Hibernate、創建SessionFactory對象。

      (1)  Hibernate運行的底層配置信息:數據庫的URL、用户名、密碼、JDBC驅動類,數據庫Dialect,數據庫連接池等。

      (2)  Hibernate對象關係映射文件(*.hbm.xml) 。

   Hibernate配置的兩種方法:

     (1)屬性文件( (hibernate.properties) 
                 調用代碼:Configuration cfg = new Configuration();
     (2)XML文件(hibernate.cfg.xml) 。
                 調用代碼:Configuration cfg = new Configuration().configure();
                 configrure()方法默認讀hibernate.cfg.xml

2.SessionFactory:

   概述:應用程序從SessionFactory(會話工廠)裏獲得Session(會話)實例。它在多個應用線程間進行共享。

      (1) SessionFactory是線程安全的(Thread-Safe),可以讓多個執行線程同時存取SessionFactory而不會有數據共享的問題。
      (2) 會話工廠緩存了生成的SQL語句和Hibernate在運行時使用的映射元數據。
      (3) 需要注意的是SessionFactory是重量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠(單例模式),當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。
   調用代碼: SessionFactory sessionFactory =cfg.buildSessionFactory();

3.Session 

  概述:Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流)
      (1)Session也稱為持久化管理器,因為它是與持久化有關的操作接口。
      (2)Session不是線程安全的,應該避免多個線程共享同一個Session實例。
      (3)Session通過SessionFactory打開,在所有的工作完成後,需要關閉。
      (4)保證在一個線程中僅存在一個Session實例
                    getCurrentSession (Hibernate 3+)
                    可以採用ThreadLocal的辦法.(Hibernate 2)
                    把Session對象放在方法內部定義.
   它與Web層的HttpSession沒有任何關係。

4.Transaction(事務)

    概述: Transaction接口負責事務相關的操作。
          它將應用代碼從底層的事務實現中抽象出來——這可能是一個JDBC事務,一個JTA用户事務或者甚至是一個公共對象請求代理結構(CORBA)——允許應用通過一組一致的API控制事務邊界。

          這有助於保持Hibernate應用在不同類型的執行環境或容器中的可移植性。

   調用代碼:
Transaction tx = session.beginTransaction();tx.commit();l提交事務
.…..
tx.rollback();  //回滾事務
注:使用Hibernate進行操作時(增、刪、改)必須顯示的調用Transaction(默認: autoCommit=false) 。

5.Query

   概述:
Query(查詢)接口允許你在數據庫上執行查詢並控制查詢如何執行。查詢語句使用HQL或者本地數據庫的SQL方言編寫。

  調用代碼:
Query query = session.createQuery("fromUser");

二、使用步驟
1.實現SessionFactory的單態模式
在cn.hrbust.dao包下創建HibernateUtil.java類

package cn.hrbust.dao;

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

public class HibernateUtil {
    private static Configuration cfg=null;
    private static SessionFactory sf=null;
    static    { //在類加載的時候只能執行一次
        try {
            cfg=new Configuration().configure();
            sf=cfg.buildSessionFactory();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static SessionFactory getSessionFactory(){
        return sf;//去返回SessionFactory
    }
    public void closeSessionFactory(){
        sf.close();//關閉SessionFactory
    }
}
manageUser就變為:

public class manageUser{
public static void main(String[] args){
        Configuration cfg=null;
        SessionFactory sf=null;
        Session session=null;
        Transaction ts=null;
        User u=new User();
        u.setName("1814010833");
        u.setGender("女");
        u.setAge(21);
        u.setBirthday(Date.valueOf("2000-2-5"));
        try {
            sf=HibernateUtil.getSessionFactory(); //sessionFactory的單態模式
            session=sf.openSession();
            ts=session.beginTransaction();
            session.save(u);
            ts.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(ts!=null){
                ts.rollback();
                }
            }finally{
            session.close();
            sf.close();
            }
        }
}

 
2.之前用openSession的方式去打開持久化管理器,Hibernate3之後推薦用getCurruntSession來打開session,並且這種方式保證線程安全
使用getCurrentSession需要在配置文件中加入<property name="hibernate.current_session_context_class">thread</property>

<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/l....
-->
<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hellohibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.current_session_context_class">thread</property><!-- 保證每個讀寫線程有唯一的session實例 -->
    <property name="show_sql">true</property>
    <mapping resource="cn/hrbust/pojo/User.hbm.xml"/>
</session-factory>

</hibernate-configuration>
配置好後將session=sf.openSession();改為session=sf.getCurrentSession();

public class manageUser{
public static void main(String[] args){
        Configuration cfg=null;
        SessionFactory sf=null;
        Session session=null;
        Transaction ts=null;
        User u=new User();
        u.setName("1814010833");
        u.setGender("女");
        u.setAge(21);
        u.setBirthday(Date.valueOf("2000-2-5"));
        try {
            sf=HibernateUtil.getSessionFactory(); //sessionFactory的單態模式
            session=sf.getCurrentSession();//保證每個讀寫線程有唯一的session實例
            ts=session.beginTransaction();
            session.save(u);
            ts.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(ts!=null){
                ts.rollback();
                }
            }finally{ //當用getCurrentSession的時候可以自動關閉
            //session.close();
            //sf.close();
            }
        }
}
 

3.事務
如果不提交,則僅僅是發出語句,但是事務沒有被提交,所以數據庫裏並沒有,所以必須要顯示開啓事務,即ts.commit必須要加才可以生效

4.Query
(1)擴展功能:單獨測試方法:

保存用户對象:

public class manageUser extends TestCase{
public void testSavaUser(){

    Configuration cfg=null;
    SessionFactory sf=null;
    Session session=null;
    Transaction ts=null;
    User u=new User();
    u.setName("哈哈哈");
    u.setGender("男");
    u.setAge(30);
    u.setBirthday(Date.valueOf("2000-2-5"));
    try {
        sf=HibernateUtil.getSessionFactory(); //sessionFactory的單態模式
        session=sf.getCurrentSession();//保證每個讀寫線程有唯一的session實例
        ts=session.beginTransaction();
        session.save(u);
        ts.commit();
    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        if(ts!=null){
            ts.rollback();
            }
        }finally{
        //session.close();
        //sf.close();
        }
}

}
 

(2)查詢用户對象:

public class manageUser extends TestCase{
public void testQueryUser(){

    Configuration cfg=null;
    SessionFactory sf=null;
    Session session=null;
    Transaction ts=null;

    try {
        sf=HibernateUtil.getSessionFactory(); //sessionFactory的單態模式
        session=sf.getCurrentSession();//保證每個讀寫線程有唯一的session實例
        ts=session.beginTransaction();
        Query query=session.createQuery("from User");
        List<User> users =query.list();

// for的第一種方式
// for(int i=0;i<users.size();i++){
// User u=users.get(i);
// System.out.println(u.getName()+" "+u.getAge());
// }
// for的另一種方式

        for(User u:users){
            System.out.println(u.getName()+" "+u.getAge());
        }
        
        ts.commit();
    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        if(ts!=null){
            ts.rollback();
            }
        }finally{
        //session.close();
        //sf.close();
        }
}

}

user avatar zzger 頭像 atguigu 頭像 xiaoyongyong 頭像 yuyue_5fd1b66ebf29c 頭像 fengyan_60cea4fbda03d 頭像
點贊 5 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.