Hibernate筆記1

来源:http://www.cnblogs.com/huguangqin/archive/2017/08/22/7409876.html
-Advertisement-
Play Games

一.Hibernate概述Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架. 實現了ORM思想的:不再重點關註sql語句的編寫 開源的:開放源代碼的 輕量級的:消耗的資源少(記憶體),依賴的jar包比較少註:ORM思想(O:object R:relati... ...


一.Hibernate概述
Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架.
     實現了ORM思想的:不再重點關註sql語句的編寫
     開源的:開放源代碼的
     輕量級的:消耗的資源少(記憶體),依賴的jar包比較少
註:ORM思想(O:object R:relation M:mapping--對象關係映射)   
     目的:操作實體類就相當於操作資料庫表
     條件:1.創建實體類和表的映射關係
           2.創建屬性和欄位的映射關係

二.環境搭建
     1.導入jar包:必選/log4j/mysql驅動包
     2.編寫映射關係文件:實體類.hbm.xml,放在實體類包下
         映射關係文件內容:
             (1)實體類與sql表的關係
             (2)實體類屬性與sql表欄位的關係
         模板:
       

  1  <?xml version="1.0" encoding="UTF-8"?>
  2          <!DOCTYPE hibernate-mapping PUBLIC
  3              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4              "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5          <hibernate-mapping>
  6              <!-- 1.創建實體類與表的映射關係 -->
  7              <!--
  8                 lazy:配置懶載入
  9                     true:使用懶載入(使用時才發送sql語句);
 10                      false:立即載入;
 11               -->
 12          <class name="linkman.Linkman" table="cst_linkman" lazy="false">
 13              <!-- 2.創建屬性與欄位值的映射關係 -->
 14                  <!--2.1配置主鍵  -->
 15                  <id name="lkmId" column="lkm_id">
 16                      <generator class="native"></generator>
 17                  </id>
 18                  <!--2.2其它屬性與欄位  -->
 19                  <property name="lkmName" column="lkm_name"></property>
 20                  <property name="lkmGender" column="lkm_gender"></property>
 21                  <property name="lkmPhone" column="lkm_phone"></property>
 22                  <property name="lkmMobile" column="lkm_mobile"></property>
 23                  <property name="lkmEmail" column="lkm_email"></property>
 24                  <property name="lkmPosition" column="lkm_position"></property>
 25                  <property name="lkmMemo" column="lkm_memo"></property>
 26          </class>
 27          </hibernate-mapping>

    3.編寫hibernate核心配置文件:hibernate.cfg.xml,放在src包下
         核心配置文件內容(順序不能變):
             (1)資料庫配置信息;
             (2)hibernate基本配置信息;
             (3)映射關係文件的位置
         模板:
        

  1 <?xml version="1.0" encoding="UTF-8"?>
  2          <!DOCTYPE hibernate-configuration PUBLIC
  3              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4              "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5          <hibernate-configuration>
  6              <session-factory>
  7                      <!--資料庫配置  -->
  8                      <!--
  9                          hibernate.hbm2ddl.auto : hibernate生成數據定義語言
 10                             資料庫的建表語句,使用hibernate自動創建資料庫表
 11                                 create-drop  :程式開始的時候創建表(有表刪表,再創建,沒表直接創建),程式結束的時候刪除表
 12                                 create           : 有表現刪除再創建表,沒表直接創建
 13                                 update           :沒表創建表,有表的話如果映射關係發生了變化,更新表
 14                                 validate       :不會創建表,驗證映射文件的配置,如果映射文件配置發生了變化,拋出異常
 15                     -->
 16                  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
 17                  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 18                  <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property>
 19                  <property name="hibernate.connection.username">root</property>
 20                  <property name="hibernate.connection.password">root</property>
 21                      <!--hibernate基本配置  -->
 22                  <property name="hibernate.hbm2ddl.auto">update</property>
 23                  <property name="hibernate.show_sql">true</property>
 24                  <property name="hibernate.format_sql">true</property>
 25                      <!--指定映射文件位置  -->
 26                  <mapping resource="linkman/Linkman.hbm.xml"/>
 27             </session-factory>
 28          </hibernate-configuration>

附:關於使用Eclipse軟體編寫以上兩種配置文件的自動提示相關問題:
1.配置Eclipse:
     菜單欄:window-->preferences-->XML-->Catalog,選中User Specified Entries,單擊Add,選擇File System,選中dtd文件(hibernate-configuration-3.0.dtd或者hibernate-mapping-3.0.dtd)的路徑;Key Type選擇uri,將對應的dtd文件中的uri(http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd或者http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd)複製進去即可;重啟Eclipse,輸入標簽<>即可自動提示;
2.關於標簽內屬性的提示,需按快捷鍵alt+/

三.Hibernate使用步驟:七步
     1.載入配置文件--Configuration
     2.構建sessionFactory--cfg.buildSessionFactory
     3.打開新的session--factory.openSession
     4.開啟事務--tx.beginTransaction
     5.CRUD
     6.提交事務--tx.commit
     7.釋放資源--session.close()/factory.close()(若使用工具類,factory不能釋放)
工具類:HibernateUtils
   

  1  //使用靜態代碼塊創建factory,僅在啟動時創建一次,提高效率
  2     import org.hibernate.Session;
  3      import org.hibernate.SessionFactory;
  4      import org.hibernate.cfg.Configuration;
  5      public class HibernateUtils {
  6          private static SessionFactory factory;
  7          static {
  8              // 載入配置文件
  9             Configuration cfg = new Configuration();
 10              cfg.configure();
 11              // 構建sessionFactory
 12              factory = cfg.buildSessionFactory();
 13          }
 14          public static Session getSession() {
 15              return factory.openSession();
 16          }
 17      }


============================================================
舉例:
1.創建sql表
2.創建實體類
3.編寫映射關係文件:Linkman.hbm.xml
4.編寫hibernate配置文件:hibernate.cfg.xml
5.編寫工具類
6.編寫執行代碼
------------------------------------------------------------
1.創建sql表

  1 CREATE TABLE `cst_linkman` (
  2    `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯繫人編號(主鍵)',
  3    `lkm_name` varchar(16) DEFAULT NULL COMMENT '聯繫人姓名',
  4    `lkm_gender` varchar(10) DEFAULT NULL COMMENT '聯繫人性別',
  5    `lkm_phone` varchar(16) DEFAULT NULL COMMENT '聯繫人辦公電話',
  6    `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '聯繫人手機',
  7    `lkm_email` varchar(64) DEFAULT NULL COMMENT '聯繫人郵箱',
  8    `lkm_position` varchar(16) DEFAULT NULL COMMENT '聯繫人職位',
  9    `lkm_memo` varchar(512) DEFAULT NULL COMMENT '聯繫人備註',
 10    PRIMARY KEY (`lkm_id`)
 11  ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

2.創建實體類

  1 public class Linkman {
  2      private Long lkmId;// 聯繫人編號(主鍵)
  3      private String lkmName;// 姓名
  4     private String lkmGender;// 性別
  5     private String lkmPhone;// 辦 公電話
  6     private String lkmMobile;// 手機
  7     private String lkmEmail;// 郵箱
  8     private String lkmPosition;// 職位
  9     private String lkmMemo;// 備註
 10     // getter/setter
 11      public Long getLkmId() {
 12          return lkmId;
 13      }
 14 
 15     public void setLkmId(Long lkmId) {
 16          this.lkmId = lkmId;
 17      }
 18 
 19     public String getLkmName() {
 20          return lkmName;
 21      }
 22 
 23     public void setLkmName(String lkmName) {
 24         this.lkmName = lkmName;
 25      }
 26 
 27     public String getLkmGender() {
 28          return lkmGender;
 29      }
 30 
 31     public void setLkmGender(String lkmGender) {
 32          this.lkmGender = lkmGender;
 33      }
 34 
 35     public String getLkmPhone() {
 36          return lkmPhone;
 37      }
 38 
 39     public void setLkmPhone(String lkmPhone) {
 40          this.lkmPhone = lkmPhone;
 41      }
 42 
 43     public String getLkmMobile() {
 44          return lkmMobile;
 45      }
 46 
 47     public void setLkmMobile(String lkmMobile) {
 48          this.lkmMobile = lkmMobile;
 49      }
 50 
 51     public String getLkmEmail() {
 52          return lkmEmail;
 53      }
 54 
 55     public void setLkmEmail(String lkmEmail) {
 56          this.lkmEmail = lkmEmail;
 57      }
 58 
 59     public String getLkmPosition() {
 60          return lkmPosition;
 61      }
 62 
 63     public void setLkmPosition(String lkmPosition) {
 64          this.lkmPosition = lkmPosition;
 65      }
 66 
 67     public String getLkmMemo() {
 68          return lkmMemo;
 69      }
 70 
 71     public void setLkmMemo(String lkmMemo) {
 72          this.lkmMemo = lkmMemo;
 73      }
 74 
 75     // toString
 76      @Override
 77      public String toString() {
 78          return "Linkman [lkmId=" + lkmId + ", lkmName=" + lkmName + ", lkmGender=" + lkmGender + ", lkmPhone="
 79                  + lkmPhone + ", lkmMobile=" + lkmMobile + ", lkmEmail=" + lkmEmail + ", lkmPosition=" + lkmPosition
 80                  + ", lkmMemo=" + lkmMemo + "]";
 81      }
 82 
 83 }
 84 


3.編寫映射關係文件:Linkman.hbm.xml--放在實體類所在包下

  1 <?xml version="1.0" encoding="UTF-8"?>
  2  <!DOCTYPE hibernate-mapping PUBLIC
  3      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5 
  6  <hibernate-mapping>
  7  <!-- 1.創建實體類與表的映射關係 -->
  8  <class name="linkman.Linkman" table="cst_linkman">
  9      <!-- 2.創建屬性與欄位值的映射關係 -->
 10          <!--2.1配置主鍵  -->
 11          <id name="lkmId" column="lkm_id">
 12              <generator class="native"></generator>
 13          </id>
 14          <!--2.2其它屬性與欄位  -->
 15          <property name="lkmName" column="lkm_name"></property>
 16          <property name="lkmGender" column="lkm_gender"></property>
 17          <property name="lkmPhone" column="lkm_phone"></property>
 18          <property name="lkmMobile" column="lkm_mobile"></property>
 19          <property name="lkmEmail" column="lkm_email"></property>
 20          <property name="lkmPosition" column="lkm_position"></property>
 21          <property name="lkmMemo" column="lkm_memo"></property>
 22  </class>
 23  </hibernate-mapping>


4.編寫hibernate配置文件:hibernate.cfg.xml--放在src下

  1 <?xml version="1.0" encoding="UTF-8"?>
  2  <!DOCTYPE hibernate-configuration PUBLIC
  3      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5  <hibernate-configuration>
  6      <session-factory>
  7          <!--資料庫配置  -->
  8          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  9          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 10          <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property>
 11          <property name="hibernate.connection.username">root</property>
 12          <property name="hibernate.connection.password">root</property>
 13              <!--hibernate基本配置  -->
 14          <property name="hibernate.hbm2ddl.auto">update</property>
 15          <property name="hibernate.show_sql">true</property>
 16          <property name="hibernate.format_sql">true</property>
 17              <!--指定映射文件位置  -->
 18          <mapping resource="linkman/Linkman.hbm.xml"/>
 19      </session-factory>
 20  </hibernate-configuration>

5.編寫工具類

  1 import org.hibernate.Session;
  2  import org.hibernate.SessionFactory;
  3  import org.hibernate.cfg.Configuration;
  4 
  5 public class HibernateUtils {
  6      private static SessionFactory factory;
  7 
  8     static {
  9          // 載入配置文件
 10         Configuration cfg = new Configuration();
 11          cfg.configure();
 12          // 構建sessionFactory
 13          factory = cfg.buildSessionFactory();
 14      }
 15 
 16     public static Session getSession() {
 17          return factory.openSession();
 18      }
 19 
 20 }
 21 


6.編寫執行代碼--增刪改

  1 package demo;
  2 
  3 import org.hibernate.Session;
  4  import org.hibernate.Transaction;
  5  import org.junit.Test;
  6 
  7 import linkman.Linkman;
  8  import utils.HibernateUtils;
  9 
 10 public class Demo02 {
 11          // 增加
 12     @Test
 13      public void add() {
 14          // 利用工具類獲取session
 15          Session session = HibernateUtils.getSession();
 16          // 開啟事務
 17         Transaction tx = session.beginTransaction();
 18          // crud/
 19          Linkman man = new Linkman();
 20          man.setLkmName("Jack");
 21          session.save(man);
 22          // 提交事務
 23         tx.commit();
 24          // 釋放資源
 25         session.close();
 26 
 27     }
 28 
 29         // 修改id=2的名字為rose,id一定要正確,否則報空指針
 30     @Test
 31      public void modify() {
 32          // 獲取session
 33          Session session = HibernateUtils.getSession();
 34          // 開啟事務
 35         Transaction tx = session.beginTransaction();
 36          // 修改
 37         Linkman man = session.get(Linkman.class, 2L);
 38          man.setLkmName("Rose");
 39          // 提交事務
 40         tx.commit();
 41          // 釋放資源
 42         session.close();
 43      }
 44 
 45     //刪除
 46     @Test
 47      public void del() {
 48          // 獲取session
 49          Session session = HibernateUtils.getSession();
 50          // 開啟事務
 51         Transaction tx = session.beginTransaction();
 52          // crud-del
 53          Linkman man = session.get(Linkman.class, 2L);
 54          session.delete(man);
 55          // 提交事務
 56         tx.commit();
 57          // 釋放
 58         session.close();
 59      }
 60  }
 61 


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

-Advertisement-
Play Games
更多相關文章
  • 18.1 使用定製特性 FCL 中的幾個常用定製特性. DllImport 特性應用於方法,告訴 CLR 該方法的實現位於指定 DLL 的非托管代碼中. Serializable 特性應用於類型,告訴序列化格式化器一個實例的欄位可以序列化和反序列化. AssemblyVersion 特性應用於程式集 ...
  • Adding Search to an ASP.NET Core MVC app 給程式添加搜索功能 2017-3-7 7 分鐘閱讀時長 作者 本文內容 1.Adding Search by genre 根據音樂流派添加搜索 2.Adding search by genre to the Index ...
  • WPF中的Style類似於Web應用程式中的CSS,它是控制項的一個屬性,屬於資源的一種。 ControlTemplate和DataTemplate區別: ControlTemplate用於改變控制項原來的形狀(一般定義在Style中,給控制項穿上一層新的外殼,改變這個控制項的外觀),而DataTempla ...
  • 針對barMange本身添加完背景色後右側區域無法填充問題 解決辦法: 添加standaloneBarDockControl控制項 1、在barMange屬性中附加standaloneBarDockControl這個控制項 2、設置standaloneBarDockControl的背景色 得到如下結果 ...
  • 隨筆分類 - .NET Core - dotNet實訓營 .Net Core 2.0 生態(1).NET Standard 2.0 特性介紹和使用指南 .Net Core 2.0 生態(2).NET Core 2.0 特性介紹和使用指南 .Net Core 2.0生態(3):ASP.NET Core ...
  • 安裝Erlang 1,安裝預環境 通過yum安裝以下組件。 2,下載Erlang並解壓 進入Erlang官網下載地址:http://www.erlang.org/downloads 需要註意的是,要找到與當前rabbitmq相容的版本:http://www.rabbitmq.com/which-er ...
  • 建表 創建儲存過程 調用 調用具有輸出參數的存儲過程 創建儲存過程 調用儲存過程 摘取至—————— 春華秋實 如侵自刪 ...
  • 一個u8類型的數組,指針p指向該數組的第一個元素,p的類型是u8*,指針q也指向該數組的第一個元素,q的類型是u32*,問*p和*q的值是多少? 1 typedef unsigned long u32; 2 typedef unsigned short u16; 3 typedef unsigned ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...