Hibernate框架之入門

来源:http://www.cnblogs.com/zhangzongle/archive/2016/08/04/5738786.html
-Advertisement-
Play Games

1.Hibernate框架簡述 Hibernate的核心組件在基於MVC設計模式的JAVA WEB應用中,Hibernate可以作為模型層/數據訪問層。它通過配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA對象或P ...


1.Hibernate框架簡述

Hibernate的核心組件
在基於MVC設計模式的JAVA WEB應用中,Hibernate可以作為模型層/數據訪問層。它通過配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA對象或PO(Persistent Object,持久化對象)映射到資料庫中的資料庫,然後通過操作PO,對數據表中的數據進行增,刪,改,查等操作。
除配置文件,映射文件和持久化類外,Hibernate的核心組件包括以下幾部分:
a)Configuration類:用來讀取Hibernate配置文件,並生成SessionFactory對象。
b)SessionFactory介面:產生Session實例工廠。
c)Session介面:用來操作PO。它有get(),load(),save(),update()和delete()等方法用來對PO進行載入,保存,更新及刪除等操作。它是Hibernate的核心介面。
d)Query介面:用來對PO進行查詢操。它可以從Session的createQuery()方法生成。
e)Transaction介面:用來管理Hibernate事務,它主要方法有commit()和rollback(),可以從Session的beginTrancation()方法生成。

Persistent Object
持久化對象可以是普通的Javabeans,惟一特殊的是它們與(僅一個)Session相關聯。JavaBeans在Hibernate中存在三種狀態:
1.臨時狀態(transient):當一個JavaBean對象在記憶體中孤立存在,不與資料庫中的數據有任何關聯關係時,那麼這個JavaBeans對象就稱為臨時對象(Transient Object)。
2.持久化狀態(persistent):當一個JavaBean對象與一個Session相關聯時,就變成持久化對象(Persistent Object)
3.脫管狀態(detached):在這個Session被關閉的同時,這個對象也會脫離持久化狀態,就變成脫管狀態(Detached Object),可以被應用程式的任何層自由使用,例如可以做與表示層打交道的數據輿對象(Data Transfer Object)。

Hibernate的運行過程
Hibernate的運行過程如下:
A:應用程式先調用Configration類,該類讀取Hibernate的配置文件及映射文件中的信息,並用這些信息生成一個SessionFactpry對象。
B:然後從SessionFactory對象生成一個Session對象,並用Session對象生成Transaction對象;可通過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進行載入,保存,更新,刪除等操作;在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作;如果沒有異常,Transaction對象將 提交這些操作結果到資料庫中。

Hibernate的運行過程如下圖:

2.入門案例

 01.準備各種jar包(我想就不用我教了吧)

 02.準備學生實體類(用於操作對應資料庫)   

package cn.zhang.entity;
//實體類
public class Student {
    
    private int stuno;
    
    private String stuname;
    
    private int stuage;
    
    private int stuid;
    
    private int stuseat;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String stuname, int stuage, int stuid, int stuseat) {
        super();
        this.stuname = stuname;
        this.stuage = stuage;
        this.stuid = stuid;
        this.stuseat = stuseat;
    }

    public Student(int stuno, String stuname, int stuage, int stuid, int stuseat) {
        super();
        this.stuno = stuno;
        this.stuname = stuname;
        this.stuage = stuage;
        this.stuid = stuid;
        this.stuseat = stuseat;
    }


    public int getStuid() {
        return stuid;
    }
    
    public void setStuid(int stuid) {
        this.stuid = stuid;
    }



    public int getStuseat() {
        return stuseat;
    }



    public void setStuseat(int stuseat) {
        this.stuseat = stuseat;
    }



    public int getStuno() {
        return stuno;
    }

    public void setStuno(int stuno) {
        this.stuno = stuno;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public int getStuage() {
        return stuage;
    }

    public void setStuage(int stuage) {
        this.stuage = stuage;
    }

    
    
    

}

03.在src下設計Hibernate配置文件hibernate.cfg.xml

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

        <!-- Database connection settings -->
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="connection.username">zhangzong</property>
        <property name="connection.password">123</property>

        <!-- SQL dialect (SQL 方言)-->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
        <!-- Drop and re-create the database schema on startup -->
         <property name="hbm2ddl.auto">update</property> 

        <!-- Echo all executed SQL to stdout  在控制台列印後臺的SQL語句-->
        <property name="show_sql">true</property>
        
        <!-- 格式化顯示SQL -->
        <property name="format_sql">true</property>    
        
        <!-- JDBC connection pool (use the built-in) -->
        <!-- <property name="connection.pool_size">1</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>-->

        <mapping resource="cn/zhang/entity/Student.hbm.xml" />

    </session-factory>

</hibernate-configuration>

04.在實體類下設計映射文件Student.hbm.xml(在配置文件hibernate.cfg.xml使用)

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

    <hibernate-mapping package="cn.zhang.entity">
        <class name="Student" table="stuinfo">
        <id name="stuno" column="stuno">
           <!-- 主鍵生成策略:native:
           native:如果後臺是Oracle  
                      後臺是MySQL,自動應用自增 -->
            <generator class="native"/>
        </id>
        <property name="stuname" type="string" column="stuname"/>
        <property name="stuage"/>
        
        <property name="stuid" type="int" column="stuid"/>
        <property name="stuseat"/>
    </class>
       
</hibernate-mapping>

05.添加測試類

001.更新(新增)一個學生記錄

package cn.zhang.test;
//新增一條數據
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import cn.zhang.entity.Student;

public class InsertTest {
    
    public static void main(String[] args) {
        //準備對象
        Student student=new Student("光衣", 12,112333,2);//Student.hbm.xml已配置編號為自增,所以這裡不用添加編號了
         //讀取大配置文件,獲取要連接的資料庫信息
        Configuration configuration=new Configuration().configure();
         //創建SessionFactory
        SessionFactory factory = configuration.buildSessionFactory();
        //加工session
        Session openSession = factory.openSession();
        
        Transaction beginTransaction = openSession.beginTransaction();
        openSession.save(student);
        
        beginTransaction.commit();
        
        System.out.println("成功");

    }

}

002.修改一個學生信息

package cn.zhang.test;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import cn.zhang.entity.Student;

public class UpdateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //1.讀取大配置文件,獲取要連接的資料庫信息
        Configuration conf=new Configuration().configure();
        //2.創建SessionFactory
        SessionFactory factory =conf.buildSessionFactory();
        //3加工session
        Session session = factory.openSession();
        Transaction tx=session.beginTransaction();
        //獲取對象
        Student stu =new Student(1,"光衣", 12,112333,2);
        //更新
        session.update(stu);
        //提交事務
        tx.commit();
        System.out.println("更新成功");


    }

}

003.刪除一個指定學生信息

package cn.zhang.test;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import cn.zhang.entity.Student;
public class DeleteTest {
    
    public static void main(String[] args) {
        //1.讀取大配置文件,獲取要連接的資料庫信息
        Configuration conf=new Configuration().configure();
        //2.創建SessionFactory
        SessionFactory factory =conf.buildSessionFactory();
        //3.加工session
        Session session = factory.openSession();
        
        Transaction tx=session.beginTransaction();
        //獲取對象
        Student stu =new Student();
        stu.setStuno(3);//指定要刪除的編號
        //刪除指定
        session.delete(stu);
        //提交事務
        tx.commit();
        System.out.println("刪除成功");

    }

}

 

 

    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1:當安裝好虛擬機,安裝好Ubuntu操作系統後,登陸的時候發現除了自己的設置的用戶就是外來用戶,其實Ubuntu中的root帳號預設是被禁用了的,所以登陸的時候沒有這個賬號,但是如果每次使用root都進行切換的話會顯的很繁瑣,所以下文就是設置root賬戶。 (由於操作過程中忘記截圖,但是為了方便大 ...
  • 最近領導讓我寫一篇關於Mac的使用教程,因為使用人群未知,所以儘量寫的通俗易懂,可謂是關於Mac電腦使用的精簡教程吧,在此發表出來以供參考。 Mac因為安全性而聞名,我們擁有了一部Mac,那麼我們來瞭解如何使用它。相信下麵會讓您便捷的使用您的Mac。 桌面 您的桌面也許是這樣的,位置或者圖形稍有差異 ...
  • 在企業級軟體系統中,資料庫的地位是比較高的,而且一般都要求支持多種資料庫,如 Oracle、 DB2、MySQL 等,它們的最新版本大多都不再支持 macOS 系統,所以裝一個 Linux 或 Windows 的虛擬機是很有必要的。使用 Parallel Desktop 安裝 Windows 10 ... ...
  • Type at the command prompt tar xvzf file-1.0.tar.gz - tgfo uncompress a gzip tar file (.tgz or .tar.gz) tar xvjf file-1.0.tar.bz2 - to uncompress a bz... ...
  • 安裝了debian 8.5 就出問題了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: DebianDescription: Debian GNU/Linux 8.5 (jessie)Releas ...
  • 雖然大多數人的註意力都集中在.NET Core上,但與原來的.NET Framework相關的工作還在繼續。.NET Framework 4.6.2正式版已於近日發佈,其重點是安全和WinForms/WPF/ASP.NET/WCF相關的特性,英文博客文章https://blogs.msdn.micr... ...
  • http://stackoverflow.com/questions/16222674/software-license-key-and-activationhttps://github.com/Labs64http://www.codeproject.com/Articles/11012/Lice ...
  • `dotnet-install` 安裝腳本用來執行非管理員安裝 CLI 工具鏈和共用運行時。 其主要用於幫助自動化場景和非管理員安裝。有兩個腳本,一個是在 Windows 上工作的 PowerShell 和另一個在 Linux/OS X 上工作的 bash 腳本。他們兩者有同樣的行為。Bash 腳本... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...