1. 程式人生 > >SSH框架學習之Hibernate day01

SSH框架學習之Hibernate day01

什麼是SSH、SSM

SSH: Struts2 做控制器, spring管理各層的元件,hibernate負責持久化層

SSM: SpringMVC做控制器,Spring管理各層元件,Mybatis做持久化層

一、認識Hibernate

1.1什麼是ORM

Object Relation Mapping 物件關係對映。 在JDBC中,是通過手工完成的,例如查操作,查一些資料,儲存為一個JavaBean。(實體類)
Hibernate的出現就是減少了ORM操作,其他框架還有TOPLink、OJB框架

1.2 SSH實現ORM的兩大原則

  • 實體類和表一一對應
  • 不需要直接操作表,操作實體類

二、配置檔案

2.1 建立實體,讓實體間互相表示

公司類中,由於有多個聯絡人,因此用set表示
聯絡人類中,僅對應一個公司,因此用物件表示
在這裡插入圖片描述在這裡插入圖片描述

2.2、建立對映配置檔案

目的是配置表和實體對應,實體屬性和表字段對應。hibernate無需自己建立表,會自動生成
1、名稱和位置無所謂
2、對映配置檔案中,標籤name屬性寫實體類相關內容
(1)class標籤name屬性值是實體類的全路徑(包名+類名)
(2)id標籤和property標籤name屬性值,體現實體屬性和表字段一一對應
3、id和property中,對應的colum可以省略,預設等於name

注意:建立的xml第一步是引入約束

實體:公司的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 1、class標籤 配置實體類和表對應
        name 實體類
        table 表
    -->
    <class name="com.lin.entity.Company" table="t_company">
        <!-- 2 id標籤 配置實體類id 和 表id 一一對應
            要求指定唯一的實體主鍵,表主鍵
        -
        <!-- id 標籤-->
        <id name="cid" column="cid">
            <!-- 設定欄位在表裡的增長策略
            例如主鍵 native
            -->
            <generator class="native"></generator>
        </id>
        <property name="name" column="name"></property>
        <!--配置一對多,先指明name=""在Class中的成員-->
        <set name="setLinkMan">
            <!--指明外來鍵-->
            <key column="cid"></key>
            <!--指明多的路徑-->
            <one-to-many class="com.lin.entity.LinkMan"/>
        </set>

    </class>
</hibernate-mapping>
實體:聯絡人的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 1、class標籤 配置實體類和表對應
        name 實體類
        table 表
    -->
    <class name="com.lin.entity.LinkMan" table="t_linkman">
        <!-- 2 id標籤 配置實體類id 和 表id 一一對應
            要求指定唯一的實體主鍵,表主鍵
        -->

        <!-- id 標籤-->
        <id name="lid" column="lid">
            <!-- 設定欄位在表裡的增長策略
            例如主鍵 native
            -->
            <generator class="native"></generator>
        </id>

        <property name="name" column="name"></property>
        <property name="phone" column="phone"></property>

        <!--配置多對一中的一-->
        <many-to-one name="company" class="com.lin.entity.Company" column="cid"></many-to-one>
    </class>
</hibernate-mapping>

2.3、引入hibernate.cfg.xml 核心配置檔案

hibnernate只會載入核心配置檔案,其他檔案不會載入
必須在src下
必須叫這個名字

具體配置分三步:

  1. 配置資料庫資訊
  2. 配置hibernate資訊(這裡大有學問,可以通過配置豐富資料庫)
  3. 把對映加到這裡面來
<?xml version="1.0" encoding="UTF-8" ?>
<!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:///my_db</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!--第二部分: 配置hibernate資訊, 可選-->
        <!--
            hibernate會自動建立表,需要配置這行
            update: 如果有 則更新 沒有就建立
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--
        識別不同資料庫語言的方言。也就是特有的語句
        例如: mysql分頁 limit, oracle rownum
        -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--輸出底層sql語句-->
        <property name="hibernate.show_sql">true</property>
        <!--格式化輸出sql語句-->
        <property name="hibernate.format_sql">true</property>

        <!--第三部分:把對映檔案引入配置檔案,必須的-->
        <mapping resource="com/lin/entity/LinkMan.hbm.xml"/>
        <mapping resource="com/lin/entity/Company.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

三、程式碼實現

第一步:封裝一個Utils類HibernateUtils

作用是載入配置,載入完成,表也已經建立完成

package com.lin.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    static Configuration cfg = null;
    static SessionFactory sessionFactory = null;
    // 靜態程式碼快,保證一個專案只執行一次工廠建立
    static {
        // 載入核心配置檔案
        cfg = new Configuration();
        cfg.configure();
        sessionFactory = cfg.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

第二步:測試程式碼實現,這裡對資料庫進行插入操作

		SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            // 得到工廠
            sessionFactory = HibernateUtils.getSessionFactory();
            // 得到session
            session = sessionFactory.openSession();
            // 開啟事務
            tx = session.beginTransaction();
            // 執行事務,新增操作
	   User user = new User();
        user.setUsername("James");
        user.setPassword("root");
        user.setAddress("China");
        session.save(user);
            // 提交事務
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }

複習時間:

事務的四個特性

  • 原子性:一組操作,要麼都成功,要麼都失敗
  • 一致性:操作之前之後,總量不能改變
  • 隔離性:多個事務操作一個記錄,不會互相影響
  • 永續性:commit提交後必須永久儲存在磁碟中