1. 程式人生 > >純java專案使用hibernateSessionFactory訪問資料庫

純java專案使用hibernateSessionFactory訪問資料庫

package com.zz.util;

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

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html }.
 */
public class HibernateSessionFactory {

    /**
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses  
     * #resourceAsStream style lookup for its configuration file.
     * The default classpath location of the hibernate config file is
     * in the default package. Use #setConfigFile() to update
     * the location of the configuration file for the current session.   
     */
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static org.hibernate.SessionFactory sessionFactory;
    
    private static Configuration configuration = new Configuration();
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static String configFile = CONFIG_FILE_LOCATION;

    static {
        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }
    private HibernateSessionFactory() {
    }
    
    /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            threadLocal.set(session);
        }

        return session;
    }

    /**
     *  Rebuild hibernate session factory
     *
     */
    public static void rebuildSessionFactory() {
        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    /**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

    /**
     *  return session factory
     *
     */
    public static org.hibernate.SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    /**
     *  return session factory
     *
     *    session factory will be rebuilded in the next call
     */
    public static void setConfigFile(String configFile) {
        HibernateSessionFactory.configFile = configFile;
        sessionFactory = null;
    }
    /**
     *  return hibernate configuration
     *
     */
    public static Configuration getConfiguration() {
        return configuration;
    }

}

 

HibernateSessionFactory類是自定義的SessionFactory,名字可以根據自己的喜好來決定。這裡用的是HibernateSessionFactory,其內容及解釋。上述程式碼是由myeclipse 自動生成的;也可以根據自己的情況寫出:

package com.zz.util;
 
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
//在使用hibernate開發專案,請一定保證只有一個SessionFactory
//一個數據庫對應一個SessionFactory 物件.
final public class MySessionFactory {
 
    private static SessionFactory sessionFactory=null;
     
    private MySessionFactory(){
         
    }
     
    static{
         
        sessionFactory =new Configuration().configure("com/zz/config/hsp.cfg.xml").buildSessionFactory();
        System.out.println("sessionFactory 型別"+sessionFactory);
    }
     
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
     
}


 

在Hibernate中,Session負責完成物件持久化操作。該檔案負責建立Session物件,以及關閉Session物件。從該檔案可以看出,Session物件的建立大致需要以下3個步驟:

① 初始化Hibernate配置管理類Configuration。

② 通過Configuration類例項建立Session的工廠類SessionFactory。

③ 通過SessionFactory得到Session例項。
31. Configuration介面

Configuration負責管理Hibernate的配置資訊。Hibernate執行時需要一些底層實現的基本資訊。這些資訊包括:資料庫URL、資料庫使用者名稱、資料庫使用者密碼、資料庫JDBC驅動類、資料庫dialect。用於對特定資料庫提供支援,其中包含了針對特定資料庫特性的實現,如Hibernate資料庫型別到特定資料庫資料型別的對映等。

使用Hibernate必須首先提供這些基礎資訊以完成初始化工作,為後續操作做好準備。這些屬性在Hibernate配置檔案hibernate.cfg.xml中加以設定,當呼叫:

Configuration config=new Configuration().configure();

時,Hibernate會自動在目錄下搜尋hibernate.cfg.xml檔案,並將其讀取到記憶體中作為後續操作的基礎配置。
3 2. SessionFactory介面

SessionFactory負責建立Session例項,可以通過Configuration例項構建SessionFactory。

Configuration config=new Configuration().configure();

SessionFactorysessionFactory=config.buildSessionFactory();

Configuration例項config會根據當前的資料庫配置資訊,構造SessionFacory例項並返回。SessionFactory一旦構造完畢,即被賦予特定的配置資訊。也就是說,之後config的任何變更將不會影響到已經建立的SessionFactory例項sessionFactory。如果需要使用基於變更後的config例項的SessionFactory,需要從config重新構建一個SessionFactory例項。

SessionFactory儲存了對應當前資料庫配置的所有對映關係,同時也負責維護當前的二級資料快取和Statement Pool。由此可見,SessionFactory的建立過程非常複雜、代價高昂。這也意味著,在系統設計中充分考慮到SessionFactory的重用策略。由於SessionFactory採用了執行緒安全的設計,可由多個執行緒併發呼叫。
33. Session介面

Session是Hibernate持久化操作的基礎,提供了眾多持久化方法,如save、update、delete等。通過這些方法,透明地完成物件的增加、刪除、修改、查詢等操作。

同時,值得注意的是,HibernateSession的設計是非執行緒安全的,即一個Session例項同時只可由一個執行緒使用。同一個Session例項的多執行緒併發呼叫將導致難以預知的錯誤。

Session例項由SessionFactory構建:

Configuration config=new Configuration().configure();

SessionFactorysessionFactory=config.buldSessionFactory();

Session session=sessionFactory.openSession();
34. Transaction介面

Transaction是Hibernate中進行事務操作的介面,Transaction介面是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA中的UserTransaction,甚至可以是CORBA事務。之所以這樣設計是可以讓開發者能夠使用一個統一的操作介面,使得自己的專案可以在不同的環境和容器之間方便地移值。事務物件通過Session建立。例如以下語句:

Transaction ts=session.beginTransaction();
35. Query介面

在Hibernate 2.x中,find()方法用於執行HQL語句。Hibernate 3.x廢除了find()方法,取而代之的是Query介面,它們都用於執行HQL語句。Query和HQL是分不開的。

Query query=session.createQuery(“fromtable where id=1”);

例如以下語句:

Query query=session.createQuery("fromtable whereid=?");

就要在後面設定其值:

Query.setString(0,"要設定的值");

上面的方法是通過“?”來設定引數,還可以用“:”後跟變數的方法來設定引數,如上例可以改為:

Query query=session.createQuery("fromtable whereid=:1");

Query.setString("kchValue","要設定的課程號值");

其使用方法是相同的,例如:

Query.setParameter(0,"要設定的值");

Query還有一個list()方法,用於取得一個List集合的示例,此示例中包括可能是一個Object集合,也可能是Object陣列集合。例如:

Query query=session.createQuery("fromtable whereid=1");

List list=query.list();

相關推薦

java專案使用hibernateSessionFactory訪問資料庫

package com.zz.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; /**  

Java實現控制檯對資料庫的增刪改查(Eclipse)

package com.hznu.qjc.daos; import com.hznu.qjc.users.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; impor

JSP | 使用JAVA驅動連線MySQL資料庫

本程式採用的整合開發環境是eclipse。採用的資料庫是JspStudy裡整合的MySQL資料庫。MySQL的java連線驅動在jspstudy的安裝目錄下Tomcat——>lib資料夾下:沒有安裝jspstudy的話,mysql的java驅動可以在官網下載:https

java專案連線mysql資料庫的jdbc遇到的問題

最近在寫java專案的時候想要往資料庫裡存點東西,於是就用mysql資料庫來存資料,可我在使用過程中遇到了兩個問題,現做個筆記,問題如下: 一、報com.mysql.jdbc.Driver類未找到         之所以報這個錯,不是因為沒有匯入mysql驅動包,而是我導的

Java Web中訪問資料庫需要的DAO和VO

1、何為VO和DAO VO就是一個普通的JavaBean,而對於JavaBean的一個重要的應用就是將資料庫查詢的程式碼,從jsp中移植到JavaBean中。使jsp作為真正的表示層,通過在jsp中呼叫這個特定的類提供的方法,去對資料庫進行操作 DAO叫做Data Acce

Java專案中連線資料庫的幾種方式和範例

1、最原始的寫法(也是一般初學者的寫法)   首先import資料庫連線基礎類,然後其它的然後就簡單了。實際操作過程中只需載入驅動程式類,之後呼叫sql語句就行了。以下是一個簡單的程式例子。  //Select.java  import java.net.URL;  im

簡易hibernate搭建,java專案

一 ..建java專案 工具 eclipse file->new ->Java Project 二.匯入jar包 剛開始只匯入幾個相關的jar包 後來真正執行時老出錯 說少類 所以我就將很多jar包都導進去了 各位如果能甄選出來哪些是不需要的 下面評論提示下 下

JDBC驅動直接訪問MySQL資料庫Java驅動程式)

       純Java驅動方式由JDBC驅動直接訪問資料庫,驅動程式完全由Java語言編寫,執行速度快,而且具備了跨平臺的特點。使用純Java驅動方式進行資料庫連線,首先需要下載資料庫廠商提供的驅動程式JAR包,並將JAR包引入工程中。本示例使用的資料庫是MySQL 5.5

nodejs連線Access資料庫,出現Error: Spawn C:\WINDOWS\SysWOW64\cscript.exe error Java專案生成可執行jar包、exe檔案以及在Windows下的安裝檔案

因為集成了第三方的資料庫,所以需要獲取資料庫的資料 使用 var connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+config.id_path+';');  

Java專案打包成jar(我使用的idea),在製作bat指令碼訪問,可以外部傳遞引數

先記錄一個工具類,該類是將大文字檔案分割,可以外部指定分割檔案的大小 SplitFile.Java package com.tencent.splitlarge.file; import java.io.*; import java.text.SimpleDateFormat; impor

java連線資料庫——java封裝JDBC

第一步: package com.qq.db; import java.sql.*; /* * 封裝一個數據庫的工具類 * 通用的獲取資料的方法 * 提高程式碼的高重用性 * */ public class DBunit { private static fina

struts2小小專案 經驗總結(1) 在sturt2裡實現訪問資料庫

開始填坑了哈,這個東西其實還不完整,但是如果再不寫的話,前面那些坑可能要開始忘了,那就先寫著吧,各位如果有啥建議歡迎給我提,一起進步。 原始碼在這 這個專案我給他起了個名字--貓眼,哈哈,也就是一時興起,給了它個名字,它的作用是使用struts框架加資料庫建立一個小網站,客戶在進行

informix資料庫在linux中的安裝以及用java/c/c++訪問

一、安裝前準備 安裝JDK(略) 到IBM官網上下載informix軟體:iif.12.10.FC9DE.linux-x86_64.tar放在某個大家都可以訪問的目錄比如:/mypkg,並解壓到該目錄下。 我也放到了百度雲和天翼雲上供下載。 建立informix使

java 資料視覺化(二)通過jdbc訪問資料庫,在servlet上獲取資料庫資料

想要通過servlet獲取資料庫資料,首先需要建立jdbc 因為資料是通過無線感測傳到資料庫的,因此jdbc裡只有查詢操作,增刪改的同學可以自行新增。 程式碼中被註釋掉的部分用於測試。 main函式部分用於檢測是否連線上資料庫,並檢測是否能讀到資料,若是讀得到

使用MySQL外掛的QT專案在通過windeployqt工具部署後無法訪問資料庫的解決辦法

一個專案,使用了QT自帶的qsqlmysql.dll(qsqlmysqld.dll)作為連線MySQL資料庫的介面,在QTCreator環境下可以自動載入libmysql.dll,可以順利訪問資料庫,但是通過windeployqt工具部署後,無法訪問資料庫。   推測是因為QT的w

SSM Tomcat 專案無法訪問其他人資料庫

在做專案時,可以訪問本地的mysql資料庫,卻無法訪問遠端的資料庫,原因為遠端mysql為8.0版本,而本地資料庫為5.0 解決方法如下 1、先查詢本機資料庫版本,再查詢遠端資料庫版本 cmd語句 mysql -uroot -p123456 //-u(使用者名稱) -

vue axios ajax前後端分離專案localhost訪問java springboot後臺無法獲取後臺返回的cookie

訪問後臺時後臺明明設定了cookie,但是前臺卻接收不到, 由於localhost不是有效域名,會被chrome和ie無視掉。 https://cnodejs.org/topic/511f48eddf9e9fcc58320fa2 https://blog.csdn.net/lanria/

JAVA訪問資料庫之連線資料庫

開發一個訪問資料庫的應用程式,首先要載入資料庫的驅動程式,只需要在第一次訪問資料庫時載入一次,然後每次執行時建立一個Connection例項,緊接著執行操作資料庫的SQL語句,並處理返回的結果集,最後在完成完成此次操作時銷燬前面建立的Connection,釋放與

java 修改專案web訪問根目錄

在開發JAVA WEB專案時可能需要修改專案訪問的根目錄,例如http://localhost:8080/test, ”test“是web專案訪問根目錄(這裡只是個人這麼稱呼,並不是官方術語)。可能需求不同,在訪問的時候不需要test或者是需要更換成別的名稱。總而言之,就是

idea中Java Web專案訪問路徑問題

說明 這裡只以 servlet 為例,沒有涉及到框架,但其實路徑的基本原理和框架的關係不大,所以學了框架的同學如果對路徑有疑惑的也可以閱讀此文 專案結構 在 idea 中新建一個 Jav