Hibernate初探

来源:http://www.cnblogs.com/AndroidJotting/archive/2017/02/16/6405970.html
-Advertisement-
Play Games

Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程式員往往只需定義好了POJO 到資料庫表的映射關係,即可通過Hibernate 提供的方法完成持久層操作。程式員甚至不需要對SQL 的熟 ...


  Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程式員往往只需定義好了POJO 到資料庫表的映射關係,即可通過Hibernate 提供的方法完成持久層操作。程式員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 介面加以執行。

  今天我們就一起對Hibernate的應用初步進行一下學習。

  首先公欲善其事必先利其器,為了更方便我們書寫Hibernate的配置文件,我們這裡需要為我們的eclipse安裝一個Hibernate Tools的插件,這樣就可以很方便的讓我們完成Hibernate的配置文件編寫。

  這裡我採用的是線上安裝:

1.啟動eclipse
2.選擇Help > Install New Software...>
3.添加如下地址:http://download.jboss.org/jbosstools/updates/stable/helios/
4.選擇性安裝:hibernate tools在All Jboss tools節點下麵

  到這裡我們的Hibernate Tools就算安裝好了,接下來我們就可以通過eclipse很方便的生成相應的配置文件

  接下來我們創建一個Java工程,然後將我們的下載好的hibernate JAR包文件導入,這裡個人建議大家將這些JAR包添加為一個新的User Liberary,方便以後我們在其他項目中調用,這裡我們現在只是為了初步探究Hibernate的使用,這裡我們只需要將必要的JAR包文件導入即可,

解壓我們下載的Hibernate壓縮包,裡面有一個lib文件夾,顧名思義,這就是我們會用的JAR包文件,文件裡面有很多子目錄,我們現在只需要將required文件夾下的JAR包文件導入即可。

  導入過hibernate JAR包後,一定要記得導入我們的資料庫驅動JAR包,還有就是為了方便我們測試,這裡我使用的是Junit單元測試工具,需要一併導入相應的JAR包文件。

  導入後所有的JAR包文件後,我們就可以開始我們的代碼編寫了,首先我們需要創建一個Hibernate配置文件:hibernate.cfg.xml

  

  

  創建好我們的Hibernate的配置文件後,打開,添加資料庫連接驅動地址+資料庫連接用戶名+資料庫連接密碼+資料庫連接地址+資料庫方言等等。

  

<?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="connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <!-- 數據連接用戶名 -->
        <property name="connection.username">root</property>
        <!-- 資料庫連接密碼 -->
        <property name="connection.password">123456</property>
        <!--設置資料庫的連接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql伺服器名稱,此處為本機,hibernate是資料庫名-->
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <!-- 資料庫方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
        <!-- 控制台列印sql語句 -->
        <property name="show_sql">true</property>
        <!-- 控制台格式化輸出sql語句 -->
        <property name="format_sql">true</property>
        <!-- 資料庫生產策略 -->
        <property name="hbm2ddl.auto">update</property>
        
        <!-- 如果使用的是本地事務(jdbc事務) -->
        <!-- <property name="current_session_context_class">thread</property> -->
        
        <!-- 如果使用的是本地事務(JTA事務) -->
        <!-- <property name="current_session_context_class">jta</property> -->
        
    </session-factory>
</hibernate-configuration>

  有了Hibernate的配置文件接下來我們就要創建我們的實例對象和資料庫映射文件xx.hbm.xml

  這裡我通過創建學生對象和大家一起熟悉這個過程:

/**
 * 創建一個實體類
 * @author gaoshang
 */
public class Student {
    
    //不帶參數的構造方法
    public Student(){}
    
    private int id;//學生I
    private String name;//學生姓名
    private int birthday;//學生出生年月
    private String home;//學生住宅
    private Date joinTime;//學生入學時間
    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 getBirthday() {
        return birthday;
    }
    public void setBirthday(int birthday) {
        this.birthday = birthday;
    }
    public String getHome() {
        return home;
    }
    public void setHome(String home) {
        this.home = home;
    }
    public Date getJoinTime() {
        return joinTime;
    }
    public void setJoinTime(Date joinTime) {
        this.joinTime = joinTime;
    }
    //學生對象的ToString方法
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", birthday=" + birthday + ", home=" + home + ", joinTime="
                + joinTime + "]";
    }
    //帶參數的構造方法
    public Student(int id, String name, int birthday, String home, Date joinTime) {
        super();
        this.id = id;
        this.name = name;
        this.birthday = birthday;
        this.home = home;
        this.joinTime = joinTime;
    }
    
}

  接下來創建我們的資料庫映射文件xx.hbm.xml:

  

  點擊next,選擇我們的實例對象,點擊finash完成。最後eclispe就可以幫我們的生產一個Student學生類對於的資料庫映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-2-15 14:17:57 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="hibernate.Student" table="STUDENT">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
            <!-- generator:屬性的生成策略 -->
            <!-- assigned:通過賦值的形式進行設置 -->
            <!-- native:自動生成,從0或1開始編號 -->
            <!-- uuid:使用uuid進行生成 -->
        </id>
        <property name="name" type="java.util.String" length="10">
            <column name="NAME" />
        </property>
        <property name="birthday" type="int">
            <column name="BIRTHDAY" />
        </property>
        <property name="home" type="java.util.String" length="10">
            <column name="HOME" />
        </property>
        <property name="joinTime" type="java.util.Date">
            <column name="JOINTIME" />
        </property>
    </class>
</hibernate-mapping>

  到這裡我們的Hibernate配置就算完成了。下麵我們來通過使用Junit單元測試工具進行持久化操作。

  

package hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Junit做單元測試時,測試方法不能使用private修飾,否則會報method initializationerror not found
 * 解決方法:http://www.cnblogs.com/sxdcgaq8080/p/5649819.html
 * @author gaoshang
 */
public class StudentTest {
    
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @Before
    public void init(){
        System.out.println("Junit測試配置");
        /**
         * hibernate4.x創建SessionFactory
         */
        //創建配置對象
        //Configuration configraction = new Configuration().configure();
        //創建會話工廠對象回調
        //ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configraction.getProperties()).buildServiceRegistry();
        //創建會話工廠
        //sessionFactory = configraction.buildSessionFactory(serviceRegistry);
        
        /**
         * hibernate5.x創建SessionFactory
         */
        //創建會話工廠對象回調
        final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();// 使用hibernate.cfg.xml進行配置  
        //創建會話工程
        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
        
        //創建session對象
        session = sessionFactory.openSession();
        //創建事物對象
        transaction = session.beginTransaction();
    }
    
    @After
    public void close(){
        System.out.println("Junit測試完成");
        if(transaction!=null)
            transaction.commit();//提交事物,hibernate是事物驅動的,只有提交事物才能完成持久化操作
        if(session!=null)
            session.close();//關閉session對象
        if(sessionFactory!=null)
            sessionFactory.close();//關閉sessionFactory對象
    }
    
    @Test
    public void run(){
        System.out.println("Junit測試");
        Student s = new Student(1, "hpu", 24, "河南", new Date());//創建學生對象
        session.save(s);//提交持久化操作
    }
    
}

  最後在奉上一個對學生對象進行增刪改查的完整操作測試類:

package hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class StudentManagerTest {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;
    
    @After
    public void close(){
        if(transaction!=null)
            transaction.commit();
        if(session!=null)
            session.close();
        if(sessionFactory!=null)
            sessionFactory.close();
    }
    
    @Before
    public void init(){
        final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }
    
    @Test
    public void saveStudent(){
        Student s = new Student(1, "123", 45, "中國", new Date());
        session.save(s);
    }
    
    @Test
    public void updateStudent(){
        Student s = new Student(1, "123", 20, "china", new Date());
        session.update(s);
    }
    
    @Test
    public void delStudent(){
        Student s = new Student();
        s.setId(3);
        session.delete(s);
    }
    
    /**
     * get方法當對象不存在時返回NULL
     */
    @Test
    public void getStudent(){
        System.out.println(session.get(Student.class, 6));
    }
    
    /**
     * load方法當對象不存在是報org.hibernate.ObjectNotFoundException
     */
    @Test
    public void loadStudent(){
        System.out.println(session.load(Student.class, 5));
    }
}

  好了,到這裡對於Hibernate的初探就和大家分享完畢,歡迎留言探討一起學習。


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

-Advertisement-
Play Games
更多相關文章
  • 最初的時候,我們只是想設計一個Web版本的HBase數據瀏覽器,類似於PL/SQL那樣便捷,後來又添加了HDFS分散式文件系統瀏覽器,再後來又添加了Hive數據倉庫瀏覽器功能。這個時候,hadoop集群由一個擴張到三個,大數據業務系統所涉及到的NoSQL資料庫也越來越多,譬如Neo4j、MongoD... ...
  • 查詢本月所有的天數: 查詢本周所有的天數: 示例: 如下圖所示,有表MO_Orders,欄位:BookTime,Number,Count。 查詢出本周的每天的數據總和。 查詢語句: 查詢效果如下圖,其中id為星期,從周一開始至周日: 示例:如下圖所示,有表: MO_Orders,欄位:BookTim ...
  • phpMyAdmin提示“無法在發生錯誤時創建會話,請檢查 PHP 或網站伺服器日誌,並正確配置 PHP 安裝。” ...
  • 先貼上解決方案截圖 一、新建4個解決方案文件夾 1-Presentation 2-Application 3-Domain 4-Infrastructure 二、在解決方案文件夾中分別創建項目 新建.NET Core Web應用程式,【身份驗證】需要選擇【個人用戶賬戶】否則無法執行migration ...
  • 1.緩存池 MySQL的設計是通過緩存池的方式的,也就是說將一部分的數據都儲存到記憶體中,當我們查找一個數據的時候,如果發現在緩存池中的時候,就能夠直接的從緩存中獲取,如果不在的話,那麼就去磁碟中載入.所以建議資料庫伺服器採用64位的操作系統,這樣就能夠使用很大的記憶體。下麵的一些參數是設置記憶體池的: ...
  • elasticsearch-5.2.1安裝方法 1. 安裝java 右擊【我的電腦】 【屬性】 【高級系統設置】 【環境變數】,如圖: 選擇【新建系統變數】--彈出“新建系統變數”對話框,在“變數名”文本框輸入“JAVA_HOME”,在“變數值”文本框輸入JDK的安裝路徑(也就是步驟5的文件夾路徑) ...
  • 環境:REHL6.5 軟體:rpmbuild 使用到的文件:ALiSQL-Master 一、安裝所需要的軟體 [root@alisql ~]# yum install rpm* rpm-build rpmdev* –y[root@alisql ~]# rpmdev-setuptree[root@al... ...
  • 採用偽分佈模式安裝和設置CDH,前提是已經安裝了Java和SSH。 1. 下載hadoop-2.6.0-cdh5.9.0,複製到/opt/下,再解壓; 2. 進入/opt/hadoop-2.6.0-cdh5.9.0/etc/hadoop/,在hadoop-env.sh中添加: 修改配置文件core- ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...