hibernate基本架構(1)

一、課程名稱: Hibernate基本架構



二、知識點

2.一、上次課程的主要知識點

一、數據庫:Oracle數據庫的使用(SQL語句,關聯查詢),數據庫設計工具(Power Designer)java

二、Java基礎:IO操做,線程和反射,類集,JDBC數據庫

三、JavaWeb:MVC,DAO設計模式


2.二、本次預計講解的知識點

Hibernatesession

Spring架構

Struts2app

AJAX,JQuery框架


三、具體內容

3.一、框架概述(瞭解)

框架的優勢:開發速度快,規範數據庫設計


後臺框架:Hibernate,MyBATIS(iBATIS),EJBide

前臺框架(MVC):Struts(1/2),SpringMVC,JSF工具

Spring框架:Spring,Seam

JS框架:JQuery,ExtJS


3.二、Hibernate框架與ORMapping概念(瞭解)

ORMapping:對象關係映射,經過在類與表之間創建關係,使程序操做類能自動影響到表中的數據。

ORMapping的發展過程:


優勢

缺點

JDBC

好學,執行速度快

重複代碼比較多,開發速度慢

EJB1,2

提出了ORMapping

除了有概念,什麼都不行。

JDO

簡單

鏈接控制有問題

Apache OJB

太多

Hibernate

不少

執行速度慢

MyBATIS

比Hibernate執行速度快

比JDBC代碼簡單

比Hibernate代碼多

比JDBC執行速度慢

EJB3

使用了Hibernate的源代碼

架構仍是EJB的原始架構


Hibernate創建ORMapping關係的方式是使用 XML或Annotation(在Hibernate3.2以上版本纔可使用)


JDBC完成數據庫操做的支持類:Hibernate

ConnectionàSession

PreparedStatementàQuery

ResultSetàList

DataBaseConnectionàHibernateSessionFactory



3.三、Hibernate完成單表數據庫操做(重點)

在數據庫中創建一張數據表,這裏創建一個張新聞表(news)

CREATETABLE news (
idnumber(8)         primarykey ,
      title        varchar2(50)      notnull,
      content      varchar2(500)     notnull,
      pub_date     datenotnull
);

在MyEclipse中須要創建項目,並加入Hibernate框架支持。

但在這些以前,建議先在MyEclipse裏創建與數據庫的鏈接。


wKiom1MUX8nxkHDyAAWXFhr2avA817.jpg

wKioL1MUX6OixfD8AAFVPmiCuHo345.jpg

wKiom1MUX8rhnPV8AAPrOy0gJqM788.jpg

選擇創建一個新的數據庫鏈接

wKioL1MUWk-BaZJFAAJe9MFYKRs525.jpg\"

點Test Driver,測試是否鏈接成功。


wKioL1MUWoyyFYjhAACUxoRXXDA574.jpg\"

wKiom1MUWrPjZ0UiAAQDaqyE2zU762.jpg\"

若是能夠在鏈接中找到以前創建好的表,表示配置成功,能夠開始創建項目。




wKioL1MUYB3xzT3XAAI_2YHn_OQ867.jpg

wKioL1MUYB6R771HAAY21SmCQoQ058.jpg

wKiom1MUYEWAvUkKAALFtcAQSqs167.jpg

wKioL1MUYB-gLai9AAGLwscGpvU276.jpg

加入Hibernate核心配置文件


wKiom1MUYFzgFCgVAAJKhG_PBw0039.jpg

wKioL1MUYDbhFCagAAGtdZ92hFM763.jpg


若是要手工加入框架支持,須要加入如下兩部份內容:

1) 支持jar包加入到WEB-INF/lib目錄下

2) Hibernate.cfg.xml加入到src目錄下。


Hibernate核心配置文件的功能:

1) 配置數據庫鏈接參數

2) 加入Hibernate的屬性配置,例如:

a)

wKiom1MUW0jyphDqAADwcgwGQ3k016.jpg\"

b)

wKioL1MUWyKRpz-xAADxc9sTzJo154.jpg\"




生成的HibernateSessionFactory中,實現了鏈接池功能,要求掌握鏈接池的實現原理。

public class HibernateSessionFactory {
    // 配置文件的所在位置和名稱
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    // 用來實現鏈接池的,該類相似Map集合。
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    // Hibernate用來讀取配置文件的類
    private static Configuration configuration = new Configuration();
    // 用來創建鏈接的,該類就是鏈接池,使用單例設計模式
    private static org.hibernate.SessionFactory sessionFactory;
    // 備用的配置文件位置
    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() {
    }
    /**
     * 取得數據庫鏈接對象
     *
     * @return Session
     * @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        // 先從ThreadLocal中取得鏈接。
        Session session = (Session) threadLocal.get();
        // 若是手頭沒有鏈接,則取得一個新的鏈接
        if (session == null || !session.isOpen()) {
            session = sessionFactory.openSession();
            // 把取得出的鏈接記錄到ThreadLocal中,以便下次使用。
            threadLocal.set(session);
        }
        return session;
    }
    /**
     * 鏈接關閉的方法
     *
     * @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        // 將ThreadLocal清空,表示當前線程已經沒有鏈接。
        threadLocal.set(null);
        // 鏈接放回到鏈接池
        if (session != null) {
            session.close();
        }
    }
    public static Configuration getConfiguration() {
        return configuration;
    }
}



原理能夠參考下圖來看:


wKiom1MUaCPCHMyGAAE5l1YCpvg852.jpg

相關文章
相關標籤/搜索