Hibernate知識總結(一)

一、ORM

ORM的全稱是Object/Relation Mapping,即對象/關係映射,可以將其理解成一種規範,它概述了這類框架的基本特徵:完成面向對象的編程語言到關係數據庫的映射。可以把ORM看作應用程序和數據庫的橋樑。

ORM基本映射方式

1、數據表映射實體類(持久化類);
2、數據表中的行映射對象;
3、數據表中的字段映射對象的屬性。

基本上所有的ORM工具大致都遵循相同的映射思路。

二、Hibernate

Hibernate是一款輕量級的持久層框架,它完成了對象模型和基於SQL的關係模型的映射關係,使得開發者能夠以面向對象的方式開發應用程序,它還提供數據處理的方法,可以大幅度減少開發人員使用SQL和JDBC處理數據的時間。

Hibernate初步使用

下載Hibernate(此步驟略過),解壓該文件;

 

使用IDE新建普通java項目(本人使用idea),在項目中引入使用Hibernate所必須的jar包,即引入required文件夾中的jar包;另外此處使用JDBC連接,需要額外引入mysql-connector的jar包

 

現在使用一個簡單的小例子,實現Hibernate的初步使用。
注:此處使用的是Hibernate的註解來創建數據表,不提及xml配置文件建表方式。

創建持久化類User,該類和一般的JavaBean並沒有什麼區別;
User類包含id、userName、age屬性,User類的代碼如下:

 1 package com.yjry.note;
 2 
 3 public class User {
 4     private Integer id;
 5     private String userName;
 6     private Integer age;
 7     //重寫toString方法,便於顯示數據
 8     @Override
 9     public String toString() {
10         return "User{" +
11                 "id=" + id +
12                 ", userName='" + userName + '\'' +
13                 ", age=" + age +
14                 '}';
15     }
16 
17     public Integer getId() {
18         return id;
19     }
20 
21     public void setId(Integer id) {
22         this.id = id;
23     }
24 
25     public String getUserName() {
26         return userName;
27     }
28 
29     public void setUserName(String userName) {
30         this.userName = userName;
31     }
32 
33     public Integer getAge() {
34         return age;
35     }
36 
37     public void setAge(Integer age) {
38         this.age = age;
39     }
40 }

 

爲該類添加Hibernate註解,添加註解後代碼如下:

package com.yjry.note;

import javax.persistence.*;

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "user_name", length = 30)
    private String userName;
    private Integer age;
    //重寫toString方法,便於顯示數據
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }

    public Integer getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 

下面解釋下各個註解的意義:

@Entity註解聲明該類是一個Hibernate的持久化類;

@Table註解指定該類映射的數據表,此處指定該類映射的數據表爲t_user表;

@Id用於指定該類的標識屬性(可以唯一表示該對象的屬性),標識屬性通常映射到數據表的主鍵列;

@GeneratedValue用於指定主鍵生成策略,其中strategy屬性指定了主鍵生成策略爲IDENTITY,對於MySQL數據庫來說,主鍵自增長。

 

接下來編寫Hibernate的核心配置文件hibernate.cfg.xml(該文件名爲Hibernate加載的默認文件名),配置文件代碼如下:

<!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.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>

        <!--是否打印sql語句-->
        <property name="hibernate.show_sql">true</property>
        <!--打印出來的sql語句是否格式化-->
        <property name="hibernate.format_sql">true</property>

        <!--建表策略,建議使用update-->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--指定數據庫方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!--告訴hibernate映射文件所在位置-->
        <mapping class="com.yjry.note.User"/>
    </session-factory>
</hibernate-configuration>

建表策略

hibernate.hbm2ddl.auto屬性可以爲validate、update、create、create-drop。

validate:每次創建SessionFactory時,若數據庫中沒有與持久化類對應的數據表,或者數據表與持久化類不一致,則拋出異常;
注:判斷不一致的條件爲:數據表中缺少持久化類的屬性對應的字段,也就是說,若持久化類對應的數據表含有多餘的字段,不會影響validate檢查,即程序不會拋出異常。

update:每次創建SessionFactory時,若數據庫中沒有與持久化類對應的數據表,則自動建表;若數據庫中存在對應的表,則保留已有的數據表和數據,僅更新或插入數據;

create:每次創建SessionFactory時,都會自動建表,若之前存在數據表,則原表保留的數據會全部丟失;

create-drop:每次創建SessionFactory時,自動建表,SessionFactory關閉時,自動刪表。

數據庫方言

Hibernate底層依然使用SQL語句來執行數據庫操作,然而各個數據庫在SQL語法上存在一些差異,因此Hibernate需要根據數據庫來識別這些差異,此時就要指定hibernate.dialect,這裏使用MySQL數據庫方言,告訴Hibernate使用MySQL的方式執行SQL語句。

 

創建測試類,完成數據表的創建以及數據的插入操作。代碼如下:

 

package com.yjry.test;

import com.yjry.note.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class UserTest {
    public static void main(String[] args) {
        /**
         * 加載Hibernate配置文件
         * 不帶參數的Configuration方法,默認加載hibernate.cfg.xml文件
         * 若傳入test.xml作爲參數,則加載test.xml文件
         */
        Configuration configuration = new Configuration().configure();
        //創建SessionFactory實例,創建該實例後,數據表已經創建完畢
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        //創建Session實例
        Session session = sessionFactory.openSession();
        //開啓事務
        Transaction transaction = session.beginTransaction();
        //創建User對象,並設置屬性
        User user = new User();
        user.setUserName("張三");
        user.setAge(20);
        //執行session的save方法,保存數據,數據表待插入該數據
        session.save(user);
        //提交事務,數據插入到數據表
        transaction.commit();
        //關閉資源
        session.close();
        sessionFactory.close();
    }
}

 

執行該代碼,會發現MySQL數據庫中多了一張t_user表,該表包含id、age、user_name三個字段,並且剛纔創建的User對象數據已經插入到數據表中。

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章