1. 程式人生 > >Hibernate簡介與實例

Hibernate簡介與實例

jdb roo package evel 簡單 per resource str mode

一、Hibernate簡介

  1、什麽是Hibernate?

Hibernate是數據持久層的一個輕量級框架。數據持久層的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等。並且Hibernate是一個開源的orm(Object relations mapping)框架,提供了查詢獲取數據的方法,用面向對象的思想來操作數據庫,節省了我們開發處理數據的時間。

  2、Hibernate的優點

1)、使用簡潔的hql語句(Hibernate query language)。可以不使用傳統的insert,update等sql語句。比如insert一個對象,原來的做法是:insert into 表名稱 value(值1,值2,值3,……),而現在的做法是:save(對象)。

2)、使用or映射。對象到關系數據庫之間的映射。是從對象的角度操作數據庫,再次體現了面向對象思想。原來的實體抽取方法:首先有了表,然後表映射實體對象。而現在Hibernate做法是:直接由對象映射到表

3)、沒有侵入性,移植性比較好。什麽是沒有侵入性?就是Hibernate采用了pojo對象。所謂的pojo對象就是沒有繼承Hibernate類或實現Hibernate接口。這樣的話,此類就是一個普通的java類,所以移植性比較好。

4)、支持透明持久化。透明是針對上層而言的。三層架構的理念是上層對下層的依賴,只是依賴接口不依賴具體實現

。而Hibernate中的透明是指對業務邏輯層提供了一個接口session,而其他的都封裝隱藏。持久化是指把內存中的數據存放到磁盤上的文件中

  3、當然一個事物,不可能十全十美,即使如此優秀的Hibernate也有自己的弱點。比如:若是大量數據批量操作。則不適合使用Hibernate。並且一個持久化對象不能映射到多張表中。

  4、Hibernate中5個核心接口

  1)、Configuration接口:負責配置及啟動Hibernate,用來創建sessionFactory

2)、SessionFactory接口:一個SessionFactory對應一個數據源存儲,也就是一個數據庫對應一個SessionFactory。SessionFactory用來創建Session對象。並且SessionFactory是線程安全的,可以由多個線程訪問SessionFactory共享。

3)、Session接口:這個接口是Hibernate中常用的接口,主要用於對數據的操作(增刪改查)。而這個Session對象不是線程安全的。不能共享。

4)、Query接口:用於數據庫的查詢對象。

5)、Transaction接口:Hibernate事務接口。它封裝了底層的事務操作,比如JTA(;java transcation architecture)所有的數據操作,比如增刪改查都寫在事務中。

二、實例:一個Hibernate小程序

  創建一個Hello_World的Java項目,導入所需jar包

  在src目錄下,創建一個hibernate.cfg.xml的配置文件,文件配置設置可以參見hibernate的官方文檔。

<?xml version=1.0 encoding=utf-8?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- 數據庫連接設置 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- Student為你的數據庫名稱 -->
        <property name="connection.url">jdbc:mysql://localhost:3306/Student</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate‘s automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">
            org.hibernate.cache.NoCacheProvider
        </property>

        <!-- true:在控制臺顯示SQL語句 -->
        <property name="show_sql">true</property>
        <!-- 格式化輸出SQL語句 -->
        <property name="format_sql">true</property>

        <!-- validate 加載hibernate時,驗證創建數據庫表結構 -->
        <!-- create 每次加載hibernate,重新創建數據庫表結構,這就是導致數據庫表數據丟失的原因。 -->
        <!-- create-drop 加載hibernate時創建,退出是刪除表結構 -->
        <!-- update 加載hibernate自動更新數據庫結構 -->
        <property name="hbm2ddl.auto">create</property>
        <property name="myeclipse.connection.profile"></property>

        <!-- hibernate與數據庫的對象關系映射文件**.hbm.xml -->
        <mapping resource="com/lsj/hibernate/model/Student.hbm.xml" />
        <!-- 使用annotion註解時,hibernate與數據庫對象關系映射表示 -->
        <!-- 推薦使用annotion註解來表示映射關系 -->
        <mapping class="com.lsj.hibernate.model.Teacher" />
    </session-factory>

</hibernate-configuration>

  創建一個Teacher的實體類,這裏用的是annotion註解,還有一種方法是創建XXX.hbm.xml的關系映射文件

package com.lsj.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

//Entity是javax.persistence.Entity包中的
@Entity
// 映射的表名
@Table(name = "teacher")
public class Teacher {

    private int id;
    private int age;
    private String name;
    private String title;

    // 主鍵,一般寫在get方法中,而不是在定義中
    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

  創建一個TeacherTest的測試類

package com.lsj.hibernate.test;

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

import com.lsj.hibernate.model.Teacher;

public class TeacherTest {

    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.setAge(30);
        t.setName("小傑");
        t.setTitle("背包客");

        Configuration cfg = new Configuration();
        // 讀取hibernate.cfg.xml中的配置
        cfg.configure();
        // 獲取SessionFactory
        SessionFactory sf = cfg.buildSessionFactory();
        // 獲取Session
        Session session = sf.openSession();
        // 開啟事務
        session.beginTransaction();
        // 保存
        session.save(t);
        // 提交事務
        session.getTransaction().commit();
        // 關閉連接
        session.close();
        sf.close();
    }
}

  這樣一個簡單的Hibernate程序就寫完,運行的時候記得打開MySQL的服務。

Hibernate簡介與實例