學習hibernate(一) -- hibernate環境搭建

1.下載hibernate
java

    須要到hibernate的官網下載一個hibernate。網址是:http://hibernate.org/orm/downloads/
mysql

2.解壓hibernate
sql

    下載後解壓縮,獲得一個hibernate-release-4.3.11.Final文件夾(我下載的hibernate版本是4.3.11),在hibernate-release-4.3.11.Final文件夾裏有一個lib文件夾,裏面放着hibernate的jar包。數據庫

    例子中使用了lib下的required文件夾中的全部jar包。如圖:api

    這些包的做用以下(待驗證):
緩存

包名
說明
antlr-2.7.7
能夠接收詞文法語言描述,並能產生識別這些語言的語句的程序,hibernate利用它實現hql到sql的轉換。
dom4j-1.6.1
xml解析器,用來讀寫xml文件的。
hibernate-commons-annotations-4.0.5.Final
hibernate中支持註解開發的程序。
hibernate-core-4.3.11.Final
hibernate的核心程序。
hibernate-jpa-2.1-api-1.0.0.Final hibernate對jap(java persistence API)規範的支持,能夠理解爲JAP是標準接口,hibernate是實現。
jandex-1.1.0.Final 用來檢索註解(annotation)索引的程序,識別該對象是註解對象(待驗證)?
javassist-3.18.1-GA 用來操做字節碼的程序,可直接編輯和生成java字節碼,以達到對.class文件的動態修改。
jboss-logging-3.1.3.GA 提供hibernate日誌功能的程序(待驗證)?
jboss-logging-annotations-1.2.0.Beta1 解析logging的註解模式程序(待驗證)?
jboss-transaction-api_1.2_spec-1.0.0.Final 事務控制程序(待驗證)?

3.導入hibernate的jar包安全

    建立一個JavaProject,引用上面圖片中的jar包,這裏須要另一個jar包,因爲我鏈接的是mysql數據庫,因此須要在導入一個mysql-connector-java-5.1.7-bin.jarsession

4.新建一個測試用的java對象app

package cn.net.bysoft.lesson1;

import java.util.Date;

public class User {

    public User() {
    }

    public User(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", birthday=" + birthday
                + "]";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    private int id;
    private String name;
    private Date birthday;
}

    編寫的java對象須要知足以下要素:less

  • 須要有一個無參的構造函數,由於在session.get時須要用到反射建立java對象;

  • 須要提供一個id屬性,對應數據庫的主鍵;

  • 須要爲對象的其餘屬性提供get/set方法;

  • 須要定義成非final的類,以便在hibernate進行延遲加載時爲類建立代理;

  • 若有必要保存到集合中,須要重equals方法和hashcode方法;

5.設置java對象與數據庫的映射關係

    須要建立一個User.hbm.xml文件,編輯java對象與數據庫的映射關係,格式以下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.net.bysoft.lesson1.User" table="S_USER">
        <id name="id" type="integer" column="ID">
            <!-- 指定主鍵的生成方式,native是使用數據庫本地的方式 -->
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" column="NAME"></property>
        <property name="birthday" type="timestamp" column="BIRTHDAY"></property>
    </class>
</hibernate-mapping>

    該文件是用來配置java對象與數據表之間的映射關係的,其中須要留意的是id這個屬性,generator來指定主鍵的生成方式,而native則表明是調用數據庫本地的方式來生成主鍵,我使用的mysql數據庫就會自動將id列設置成自增。

    主鍵具體有哪些生成方式,待接下來詳細研究。

6.配置hibernate的配置信息

在src下建立一個hibernate.cfg.xml文件,格式以下:

<!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.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
        
        <!-- hibernate使用的數據庫方言
             若是不知道能夠去/hibernate-release-4.3.11.Final/project/etc/hibernate.properties
             中查找 -->
        <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>
        <!-- 是否自動生成數據表的策略,create表明每次啓動程序都從新建立數據表 -->
        <property name="hibernate.hbm2ddl.auto">create</property>
        
        <!-- 須要使用到的*.hbm.xml文件 -->
        <mapping resource="cn/net/bysoft/lesson1/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

    該文件須要注意的有兩個地方,第一個是mapping屬性,第二個是hibernate.hbm2ddl.auto這個屬性。

    mapping屬性用來配置*.hbm.xml的資源文件地址,這裏須要注意的是沒有用cn.net.bysoft.lession的形式,而是使用的'/'來描述目錄位置。

    接下來是自動執行ddl語句的設置(也就是hibernate.hbm2ddl.auto)參數有4個,分別是:

  • create

    create爲每次建立sessionfactory時,會根據*.hbm.xml文件中所配置的信息來drop掉數據表,drop後從新create數據表;

  • create-drop

    create-drop爲每次建立sessionfactory時,會根據*.hbm.xml文件中所配置的信息來create數據表。而每當sessionfactory被close時,會drop掉開始時create的數據表;

  • update

    update爲每次建立sessionfactory時,若是數據庫中沒有對應的表,則新建。

    若已經新建過,則會判斷*.hbm.xml文件的配置與創建好的數據表的結構是否相同。

    若是相同則不去進行ddl的操做。

    若是不一樣,則會根據*.hbm.xml文件中有變化的配置項去更新數據表,但不會刪除數據表中已建立過的任何信息。

  • validate

    validate爲每次建立sessionfactory時,將用*.hbm.xml文件中的配置信息與現有的對應的數據表結構進行比較,若發現不一樣則拋出異常。

7.編寫代碼測試

package cn.net.bysoft.lesson1;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class UserTest {

    @Test
    public void test() {
        // 0.建立configuration對象,該對象保存着hibernate的配置信息和對象關係映射的信息。
        Configuration cfg = new Configuration().configure();
        // 1.建立sessionfactory對象
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
        StandardServiceRegistry registry =  builder.build();
        SessionFactory sessionFactory = cfg.buildSessionFactory(registry); 
        // 2.建立session對象
        Session session = sessionFactory.openSession();
        // 3.開始事務
        Transaction transaction = session.beginTransaction();
        // 4.保存
        User user = new User("Jack", new Date());
        session.save(user);
        // 5.提交事務
        transaction.commit();
        // 6.關閉session對象
        session.close();
        // 7.關閉sessionfactory對象
        sessionFactory.close();
    }
}

    上面這段代碼中configuration對象用來保存則hibernate的配置信息,如hibernate.cfg.xml中的配置信息,和*.hbm.xml的映射信息。

    sessionfactory爲建立session的工廠,它是線程安全的。通常建議一個項目中只有一個sessionfactory,由於建立sessionfactory很是費資源。

    接下來是session對象,該對象是hibernate的核心,是一個單線程的對象,內部有session緩存。

    對須要持久化的java對象的全部操做都用到了session。

    經常使用的方法有get、load、save、update、saveorupdate、delete、begintransaction、isopen、flush、clear、evicto、close等等方法,接下來將會一個一個研究這些方法的使用。

    這是執行這段代碼後,控制檯輸出的內容:


    建立了一張名爲S_USER的數據表,並insert了一條數據。

    到此位置,一個簡單的hibernate環境就搭建好了。工程的目錄結構以下:

相關文章
相關標籤/搜索