《Hibernate學習筆記一》第一個程序的搭建

Hibernate學習筆記:第一個程序的搭建

前一段時間對Struts2這個框架有了一點點地瞭解,很高興,自己開始學習Hibernate這個框架了。本篇博文將記錄下第一個Hibernate程序的搭建過程。其實有時候個人覺得無論我們學習什麼語言也好,還是學習什麼框架也好,第一個HelloWorld程序真的相當重要,假如 我們在學習第一個HelloWorld程序都跑不出來,這完全影響着我們對新接觸的東西的興趣和動力,但是,往往第一個程序都會涉及到很多的配置,因此使得對於初學者要摸索一定的時間,對於我也是如此,因爲對於剛開始學習Hibernate這個框架的時候,我並不清楚要添加哪些庫文件,因此我需要參考一些博客和視頻,才能更好的完成第一個程序的搭建工作,只有在我們成功地搭建好了第一個程序之後,我們就爲我們後面的學習做好的準備,在後面的學習中我們就不需要擔心添加哪些庫文件呀,需要哪些配置呀 等等工作。本篇博文就是對Hibernate的第一個程序的搭建的所有過程的一個建立,希望對剛學習Hibernate的你有所幫助

廢話不多說,開始幹正事。

第一個Hibernate程序的搭建

相信在學Hibernate的你在前段時間一定學習過Java這門語言,因此一定有Java的編譯環境以及我們常見的IDE,即一定使用過eclipse/MyEclipse等IDE,如果沒有使用,就需要下載。

下面就假設你有Java相關的開發環境(JDK,IDE)。

在開始介紹之前,先提供一個參考文檔:Hibernate3.1.2在線中文幫助文檔,這個文檔有着很好的參考價值,也有第一個Hibernate 應用程序的搭建過程:http://www.jq-school.com/Show.aspx?id=321。本人第一個Hibernate的搭建也是主要參考這個文檔來完成的.

1、準備工作

a、在Hibernate官網下載Hibernate發佈包,鏈接爲:http://hibernate.org/orm/downloads/,下載後解壓到相應的文件夾中,裏面涉及到的一些Jar包將會爲我們所用。我下載的是和ibernate-release-5.1.0.Final 這個版本。

b、數據庫驅動包,JDBC Driver要根據你用的database來定,一般database官方網站上都會有。Hibernate支持常用的database,比如 MySQL, Oracle, PostgreSQL, 和MS-SQL Server。這些數據庫都有JDBC Driver:

我自己下載的是MySQL數據庫的Driver 。

Oracle JDBC Driver下載地址(下載前必須同意Oracle協議書) 
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

MySQL JDBC Driver下載地址 
http://dev.mysql.com/downloads/connector/j/3.0.html

PostgreSQL JDBC Driver下載地址 
http://jdbc.postgresql.org/download.html

MS-SQL Server JDBC Driver下載地址 
http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&displaylang=en

2、新建工程,添加Jar包

1)、我使用的IDE是MyEclipse ,打開MyEclipse,新建一個Java Project,我這裏的工程取名爲:HelloWorld_Hibernate,然後添加相應的Jar包。

怎麼添加Jar包呢??

添加Jar包主要有兩個方法,第一種方法爲:點擊項目—>Build Path—>Add External JARS;由於hibernate 有許多Jar需要添加,並且這些Jar包都是屬於hibernate的,因此,我們就將其放在一起,然後引入工程這樣纔是最好的。這也就是第二種方法。

具體步驟如下:

window—>Java—->Build Path —->User Libraries —>new ,這樣就新建了一個文件夾(我這裏新建的文件夾爲:hibernate),然後在這個夾 ,點擊Add External JARS 中添加Jar包,需要添加的Jar包在hibernate解壓後的lib/required下,我將這個文件夾下所有的包都加入進去了。具體截圖如下: 

當上面的步驟完成之後,我們就可以在工程中引入這個

實體類 Student

實體類中有幾個屬性:id name age,併爲這些屬性配上get/set 方法。

package com.hibernate.model;
    public class Student {
    private int id;
    private String name;
    private int age;
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

所有的持久化類(persistent classes)都要求有無參的構造器,因爲Hibernate必須使用Java反射機制來爲你創建對象。構造器(constructor)的訪問級別可以是private,然而當生成運行時代理(runtime proxy)的時候則要求使用至少是package 級別的訪問控制

在數據庫中創建表與實體類對應

這裏我們採用的是自己創建表,我們也可以要Hibernate 幫我們創建。 
在下面即將要介紹的配置文件hibernate.cfg.xml文件中:

<!--  屬性hbm2ddl.auto 可選值有:create|update|drop-create|invalide 
        create  每次都會給你新建一個表,因此存在數據丟失
        update  當你的實體類中添加或刪除了其他的屬性,即將導致相應的表結構發生變化,因此會更改表的結構
        invalide  即對象關係映射的檢查。
        -->
<property name="hbm2ddl.auto">create</property> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Hibernate配置 hibernate.cfg.xml 配置文件

Hibernate 的配置文件名字叫 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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>  <!--  hibernate爲數據庫名稱 -->
        <!--  數據庫的用戶名和密碼 -->
        <property name="connection.username">root</property>
        <property name="connection.password">123456789</property>

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

        <!-- SQL dialect 主要看你使用的是那種數據庫 -->
        <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>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
       <!-- <property name="hbm2ddl.auto">create</property> --> 
        <!-- Student類與表Student的映射關係 -->
        <mapping resource="com/hibernate/model/Student.hbm.xml"/>

    </session-factory>

</hibernate-configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

創建映射文件

上面雖然我們建立了實體類的數據庫表,但是我們還沒有建立關聯,即映射。

一個映射文件的基本結構看起來像這樣 :

<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>
    [...]
    </hibernate-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在我們的項目中,映射文件Student.hbm.xml文件內容如下:

<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.hibernate.model">
    <class name="Student" table="Student"> <!-- 如果我們不寫table,則默認表名與類名一致 -->
        <!-- 主鍵 -->
        <id name="id" column="id">
            <!-- 主鍵的生成策略 -->
            <generator class="native"/>
        </id>
        <!-- 其他屬性,name對應實體類的屬性,column對應關係型數據庫表的列 -->
        <property name="name"  column="name"/>
        <property name="age"/>
    </class>
    </hibernate-mapping>

    <!-- 這樣就將Student類和表Student關聯在一起了 -->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

測試類

待上面的工作完成之後,我們就可以建立一個測試類來進行測試了。測試類StudentTest的代碼如下 :

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Student;

public class TestStudent {

    public static void main(String[] args) {
        Student s=new Student();        
        s.setId(1);
        s.setName("wu");
        s.setAge(19);
        //下面爲固定格式的代碼,即先獲取Session ,然後跳用Session 的save方法。
        Configuration cfg=new Configuration();
        SessionFactory sf=cfg.configure().buildSessionFactory();
        Session session=sf.openSession();
        session.beginTransaction();
        session.save(s);
        session.getTransaction().commit();
        session.close();
        sf.close();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

測試結果在數據庫中的結果 如下 :

這就說明我們的第一個Hibernate 程序就成功了。

用Annotation來創建第一個程序

上面採用的是xml配置文件的方式來創建實體類與數據庫表的對應關係,下面就用Annotation的方式來創建第一個程序。

下面我們又創建一個實體類Teacher。

內容如下:

package com.hibernate.model;

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

@Entity
public class Teacher {
    private int id;
    private String name;
    private String title;
    @Id
    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 String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

從上面的代碼中可以看到@Entity /@Id 等註解,利用這種方式我們就不需要寫實體類和數據庫表的映射文件了。

hibernate.cfg.xml文件的內容如下,與第一種方式的區別在於添加了這樣一行代碼:

<mapping class="com.hibernate.model.Teacher"/>
  • 1

詳細內容如下:

<?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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>  <!--  hibernate爲數據庫名稱 -->
        <!--  數據庫的用戶名和密碼 -->
        <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 dialect 主要看你使用的是那種數據庫 -->
        <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>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
       <!-- <property name="hbm2ddl.auto">create</property> --> 
        <!-- Student類與表Student的映射關係 -->
        <mapping resource="com/hibernate/model/Student.hbm.xml"/>

        <mapping class="com.hibernate.model.Teacher"/>

    </session-factory>

</hibernate-configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

測試文件與TestStudent 一樣,如下:

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Teacher;

public class TestTeacher {

    public static void main(String[] args)  throws Exception{
        Teacher t=new Teacher();
        t.setId(1);
        t.setName("wuranghao");
        t.setTitle("professior");

        Configuration cfg=new Configuration();
        SessionFactory sf=cfg.configure().buildSessionFactory();
        Session session=sf.openSession();
        session.beginTransaction();
        session.save(t);
        session.getTransaction().commit();
        session.close();
        sf.close();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

同樣當我們運行之後,在數據庫表中查詢的結果如下:

參考資料

1、blog :http://blog.csdn.net/doodoofish/article/details/43207/

2、http://www.jq-school.com/hibernate/html/tutorial.html#tutorial-firstapp


from: http://blog.csdn.net/u010412719/article/details/51258691


發佈了8 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章