Hibernate 入門

本文包括:

1、CRM 項(xiàng)目的整體介紹

2露戒、Hibernate 框架概述

3、Hibernate 快速入門

4、Hibernate 常用的配置文件

5拥坛、Hibernate 常用的接口和類

1、CRM 項(xiàng)目的整體介紹

  1. 什么是 CRM

    • CRM(Customer Relationship Management)客戶關(guān)系管理,是利用相應(yīng)的信息技術(shù)以及互聯(lián)網(wǎng)技術(shù)來協(xié)調(diào)企業(yè)與顧客間在銷售螃成、營銷和服務(wù)上的交互,向客戶提供創(chuàng)新式的個(gè)性化的客戶交互和服務(wù)的過程

    • 其最終目標(biāo)是將面向客戶的各項(xiàng)信息和活動(dòng)集成起來启摄,組建一個(gè)以客戶為中心的企業(yè)帽驯,實(shí)現(xiàn)對面向客戶的活動(dòng)的全面管理

  2. CRM 的模塊

    • CRM 系統(tǒng)實(shí)現(xiàn)了對企業(yè)銷售梳侨、營銷择示、服務(wù)等各階段的客戶信息、客戶活動(dòng)進(jìn)行統(tǒng)一管理迄本。

    • CRM 系統(tǒng)功能涵蓋企業(yè)銷售、營銷抓韩、用戶服務(wù)等各各業(yè)務(wù)流程,業(yè)務(wù)流程中與客戶相關(guān)活動(dòng)都會(huì)在 CRM 系統(tǒng)統(tǒng)一管理相恃。

    • 下邊列出一些基本的功能模塊,包括:

      • 客戶信息管理

      • 聯(lián)系人管理

      • 商機(jī)管理

      • 統(tǒng)計(jì)分析等

  3. 模塊的具體功能

    • 客戶信息管理

      • 對客戶信息統(tǒng)一維護(hù)倦挂,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的數(shù)據(jù)資源呀非。
    • 聯(lián)系人管理

      • 對客戶的聯(lián)系人信息統(tǒng)一管理艺糜,聯(lián)系人是指客戶企業(yè)的聯(lián)系人边涕,即企業(yè)的業(yè)務(wù)人員和客戶的哪些人在打交道。
    • 客戶拜訪管理

      • 業(yè)務(wù)員要開發(fā)客戶需要去拜訪客戶美浦,客戶拜訪信息記錄了業(yè)務(wù)員與客戶溝通交流方面的不足、采取的策略不當(dāng)摊滔、有待改進(jìn)的地方或值得分享的溝通技巧等方面的信息棒妨。
    • 綜合查詢

      • 客戶相關(guān)信息查詢陪腌,包括:客戶信息查詢、聯(lián)系人信息查詢杂拨、商機(jī)信息查詢等
    • 統(tǒng)計(jì)分析

      • 按分類統(tǒng)計(jì)客戶信息亏狰,包括:客戶信息來源統(tǒng)計(jì)宫仗、按行業(yè)統(tǒng)計(jì)客戶滩褥、客戶發(fā)展數(shù)量統(tǒng)計(jì)等
    • 系統(tǒng)管理

      系統(tǒng)管理屬于crm系統(tǒng)基礎(chǔ)功能模塊驹针,包括:數(shù)據(jù)字典、賬戶管理嚎货、角色管理、權(quán)限管理玄组、操作日志管理等

  4. SSH 框架

  5. Hibernate 的開發(fā)位置

    學(xué)習(xí)路線:

    • Hibernate 入門:主要是學(xué)習(xí)框架的入門延曙,自己搭建框架趴荸,完成增刪改查的操作

    • Hibernate 一級(jí)緩存:主要學(xué)習(xí)一級(jí)緩存孵淘、事務(wù)管理和基本的查詢

    • Hibernate 進(jìn)階:主要學(xué)習(xí)一對多和多對多的操作等

    • Hibernate 查詢優(yōu)化:基本查詢和查詢的優(yōu)化

2惧财、Hibernate 框架概述

  1. Hibernate 框架的概述

    • Hibernate 是一個(gè)開放源代碼的對象關(guān)系映射(ORM)框架仰迁,它對 JDBC 進(jìn)行了非常輕量級(jí)的對象封裝恰起,使得 Java 程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫东羹。

    • Hibernate 可以應(yīng)用在任何使用 JDBC 的場合恕酸,既可以在 Java 的客戶端程序使用了讨,也可以在 Servlet/JSP 的 Web 應(yīng)用中使用。

    • Hibernate 是輕量級(jí) JavaEE 應(yīng)用的持久層解決方案侧巨,是一個(gè)關(guān)系數(shù)據(jù)庫ORM框架

  2. 記追痹:Hibernate 是一個(gè)持久層的 ORM 框架@蚵!寺庄!

  3. 什么是ORM(對象關(guān)系映射)

    • ORM映射:Object Relational Mapping

      • O:面向?qū)ο箢I(lǐng)域的 Object(JavaBean 對象)
      • R:關(guān)系數(shù)據(jù)庫領(lǐng)域的 Relational(表的結(jié)構(gòu))
      • M:映射 Mapping(XML 的配置文件)
    • 簡單一句話:Hibernate 使程序員通過操作對象的方式來操作數(shù)據(jù)庫表記錄

  4. Hibernate 優(yōu)點(diǎn):

    • Hibernate 對 JDBC 訪問數(shù)據(jù)庫的代碼做了封裝宪彩,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼留晚。

    • Hibernate 是一個(gè)基于 jdbc 的主流持久化框架隆判,是一個(gè)優(yōu)秀的 ORM 實(shí)現(xiàn),它很大程度的簡化了 DAO 層編碼工作。

    • Hibernate 的性能非常好,因?yàn)樗且粋€(gè)輕量級(jí)框架趁窃。映射的靈活性很出色呻征。它支持很多關(guān)系型數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系领突。

3、Hibernate 快速入門

  1. 下載Hibernate 5的運(yùn)行環(huán)境

  2. 創(chuàng)建表結(jié)構(gòu)

    • 建表語句如下

        Create database hibernate_day01;
        Use hibernate_day01;
        CREATE TABLE `cst_customer` (
          `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(hào)(主鍵)',
          `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
          `cust_user_id` bigint(32) DEFAULT NULL COMMENT '負(fù)責(zé)人id',
          `cust_create_id` bigint(32) DEFAULT NULL COMMENT '創(chuàng)建人id',
          `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
          `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業(yè)',
          `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級(jí)別',
          `cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯(lián)系人',
          `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
          `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動(dòng)電話',
          PRIMARY KEY (`cust_id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
      
  3. 搭建 Hibernate 的開發(fā)環(huán)境

    • 創(chuàng)建 WEB 工程,引入 Hibernate 開發(fā)所需要的 jar 包

      • MySQL的驅(qū)動(dòng)jar包

      • Hibernate開發(fā)需要的jar包(資料/hibernate-release-5.0.7.Final/lib/required/所有jar包)

      • 日志jar包(資料/jar包/log4j/所有jar包)

  4. 編寫 JavaBean 實(shí)體類

    • Customer 類的代碼如下:

        public class Customer {
            // 以后都使用包裝類扫夜,默認(rèn)值為 null
            private Long cust_id;
            private String cust_name;
            private Long cust_user_id;
            private Long cust_create_id;
            private String cust_source;
            private String cust_industry;
            private String cust_level;
            private String cust_linkman;
            private String cust_phone;
            private String cust_mobile;
            // 省略get和set方法
        }
      
  5. 創(chuàng)建 類與表結(jié)構(gòu)的 映射

    1. 在 JavaBean 所在的包下創(chuàng)建映射的配置文件

      • 默認(rèn)的命名規(guī)則為:實(shí)體類名.hbm.xml

      • 在 實(shí)體類名.hbm.xml 配置文件中引入約束(引入的是 hibernate3.0 的 dtd 約束谨娜,不要引入 4 的約束)

          <!DOCTYPE hibernate-mapping PUBLIC 
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
    2. 如果不能上網(wǎng)辫封,編寫配置文件是沒有提示的雏逾,需要自己來配置

      復(fù)制 http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window --> preferences --> 搜索 xml --> 選擇 xml catalog --> 點(diǎn)擊 add --> 選擇 URI --> 粘貼復(fù)制的地址 --> 選擇 location蠢正,選擇本地的 DTD 的路徑

    3. 編寫映射的配置文件:實(shí)體類名.hbm.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>
       
           <!-- 配置類和表結(jié)構(gòu)的映射 -->
           <class name="com.itheima.domain.Customer" table="cst_customer">
               <!-- 配置 id 
                   見到 name 屬性,JavaBean 的屬性
                   見到 column 屬性神汹,是表結(jié)構(gòu)的字段
               -->
               <id name="cust_id" column="cust_id">
                   <!-- 主鍵的生成策略 -->
                   <generator class="native"/>
               </id>
               
               <!-- 配置其他的屬性 -->
               <property name="cust_name" column="cust_name"/>
               <property name="cust_user_id" column="cust_user_id"/>
               <property name="cust_create_id" column="cust_create_id"/>
               <property name="cust_source" column="cust_source"/>
               <property name="cust_industry" column="cust_industry"/>
               <property name="cust_level" column="cust_level"/>
               <property name="cust_linkman" column="cust_linkman"/>
               <property name="cust_phone" column="cust_phone"/>
               <property name="cust_mobile" column="cust_mobile"/>
               
           </class>
           
       </hibernate-mapping>    
      
  6. 編寫 Hibernate 核心的配置文件

    1. 在 src 目錄下宪摧,創(chuàng)建名稱為 hibernate.cfg.xml 的配置文件

    2. 在 XML 中引入 DTD 約束

       <!DOCTYPE hibernate-configuration PUBLIC
           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
           "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
      
    3. 打開:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties造锅,可以查看具體的配置信息

      • 必須配置的4大參數(shù)

          #hibernate.connection.driver_class com.mysql.jdbc.Driver
          #hibernate.connection.url jdbc:mysql:///test
          #hibernate.connection.username gavin
          #hibernate.connection.password
        
      • 數(shù)據(jù)庫的方言(必須配置的)

          #hibernate.dialect org.hibernate.dialect.MySQLDialect
        
      • 可選的配置

          #hibernate.show_sql true
          #hibernate.format_sql true
          #hibernate.hbm2ddl.auto update
        
      • 引入映射配置文件(一定要注意,要引入映射文件,框架需要加載映射文件,如果不引入,則需要在 Java 代碼中手動(dòng)加載)

          <mapping resource="com/itheima/domain/Customer.hbm.xml"/>               
        
    4. 具體的配置如下

       <?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>
           
           <!-- 記姿嗤怼:先配置SessionFactory標(biāo)簽户敬,一個(gè)數(shù)據(jù)庫對應(yīng)一個(gè)SessionFactory標(biāo)簽 -->
           <session-factory>
               
               <!-- 必須要配置的參數(shù)有5個(gè)骂维,4大參數(shù),數(shù)據(jù)庫的方言 -->
               <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
               <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
               <property name="hibernate.connection.username">root</property>
               <property name="hibernate.connection.password">liaohaolin</property>
               
               <!-- 數(shù)據(jù)庫的方言 -->
               <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
               
               <!-- 可選配置 -->
               <!-- 顯示SQL語句,在控制臺(tái)顯示 -->
               <property name="hibernate.show_sql">true</property>
               <!-- 格式化SQL語句 -->
               <property name="hibernate.format_sql">true</property>
               <!-- 生成數(shù)據(jù)庫的表結(jié)構(gòu) 
                   update:如果沒有表結(jié)構(gòu)感耙,創(chuàng)建表結(jié)構(gòu)。如果存在,不會(huì)創(chuàng)建伞访,添加數(shù)據(jù)
               -->
               <property name="hibernate.hbm2ddl.auto">update</property>
               
               <!-- 映射配置文件辛馆,需要引入映射的配置文件 -->
               <mapping resource="com/itheima/domain/Customer.hbm.xml"/>
               
           </session-factory>
      
       </hibernate-configuration>  
      
  7. 編寫 Hibernate 入門代碼

    • 具體的代碼如下:

        /**
         * 測試保存客戶
         */
        @Test
        public void testSave(){
            /**
             *  1. 先加載配置文件
             *  2. 創(chuàng)建SessionFactory對象映屋,生成Session對象
             *  3. 創(chuàng)建session對象
             *  4. 開啟事務(wù)
             *  5. 編寫保存的代碼
             *  6. 提交事務(wù)
             *  7. 釋放資源
             */
            // 1. 先加載配置文件
            // 簡寫的方法,默認(rèn)加載src目錄下hibernate.cfg.xml的配置文件
            Configuration config = new Configuration().configure();
            
            // 2. 創(chuàng)建SessionFactory對象
            SessionFactory factory = config.buildSessionFactory();
            // 3. 創(chuàng)建session對象
            Session session = factory.openSession();
            // 4. 開啟事務(wù)
            Transaction tr = session.beginTransaction();
            
            // 5. 編寫保存的代碼
            Customer c = new Customer();
            // c.setCust_id(cust_id);   // 主鍵是自動(dòng)遞增的葡缰,所以不用編寫
            c.setCust_name("測試3");
            c.setCust_level("2");
            c.setCust_phone("110");
            
            // 保存數(shù)據(jù)付燥,操作對象就相當(dāng)于操作數(shù)據(jù)庫的表結(jié)構(gòu)
            session.save(c);
            
            // 6. 提交事務(wù)
            tr.commit();
            // 7. 釋放資源
            session.close();
            factory.close();
        }
      
    • 如果在 hibernate.cfg.xml 中不引入映射配置文件嗦嗡,則需要在上述代碼的第1點(diǎn)中這樣編寫:

        // 1. 先加載配置文件
        Configuration config = new Configuration();
        // 默認(rèn)加載src目錄下hibernate.cfg.xml的配置文件
        config.configure();
        // 手動(dòng)加載(了解即可)
        config.addResource("com/itheima/domain/Customer.hbm.xml");
      

回憶:快速入門

1. 下載 Hibernate 框架的開發(fā)包
2. 編寫數(shù)據(jù)庫和表結(jié)構(gòu)
3. 創(chuàng)建WEB的項(xiàng)目,導(dǎo)入了開發(fā)的 jar 包
    * MySQL 驅(qū)動(dòng)包饭玲、Hibernate 開發(fā)的必須要有的 jar 包侥祭、日志的 jar 包
4. 編寫 JavaBean,以后不使用基本數(shù)據(jù)類型茄厘,使用包裝類
5. 編寫映射的配置文件(核心)矮冬,先導(dǎo)入開發(fā)的約束,里面正常配置標(biāo)簽
6. 編寫 hibernate 的核心的配置文件次哈,里面的內(nèi)容是固定的
7. 編寫代碼欢伏,使用的類和方法

4、Hibernate 常用的配置文件

  1. 映射配置文件

    • 映射文件亿乳,即 Customer.hbm.xml 的配置文件

      • <class>標(biāo)簽 -- 用來將類與數(shù)據(jù)庫表建立映射關(guān)系

        • name -- 類的全路徑
        • table -- 表名(如果類名與表名一致,那么 table 屬性也可以省略)
        • catalog -- 數(shù)據(jù)庫的名稱,基本上都會(huì)省略不寫
      • <id>標(biāo)簽 -- 用來將類中的屬性與表中的主鍵建立映射径筏,id 標(biāo)簽就是用來配置主鍵的葛假。

        • name -- 類中屬性名
        • column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
        • length -- 字段的程度,如果數(shù)據(jù)庫已經(jīng)創(chuàng)建好了滋恬,那么 length 可以不寫聊训。如果沒有創(chuàng)建好,生成表結(jié)構(gòu)時(shí)恢氯,length 最好指定带斑。
      • <property> -- 用來將類中的普通屬性與表中的字段建立映射.

        • name -- 類中屬性名
        • column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
        • length -- 數(shù)據(jù)長度
        • type -- 數(shù)據(jù)類型(一般都不需要編寫,如果寫需要按著規(guī)則來編寫)
          • Hibernate的數(shù)據(jù)類型 type="string"
          • Java的數(shù)據(jù)類型 type="java.lang.String"
          • 數(shù)據(jù)庫字段的數(shù)據(jù)類型 <column name="name" sql-type="varchar"/>
  2. 核心配置文件

    • 核心配置文件的兩種方式

      • 第一種方式是屬性文件的形式勋拟,即properties的配置文件

        • hibernate.properties
          • hibernate.connection.driver_class=com.mysql.jdbc.Driver
        • 缺點(diǎn)
          • 不能加載映射的配置文件勋磕,需要手動(dòng)編寫代碼去加載
      • 第二種方式是 XML 文件的形式,開發(fā)基本都會(huì)選擇這種方式

        • hibernate.cfg.xml
          <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
        • 優(yōu)點(diǎn)
          • 格式比較清晰
          • 編寫有提示
          • 可以在該配置文件中加載映射的配置文件(最主要的優(yōu)點(diǎn))
    • 關(guān)于 hibernate.cfg.xml 的配置文件方式

      • 必須有的配置

        • 數(shù)據(jù)庫連接信息:

          hibernate.connection.driver_class -- 連接數(shù)據(jù)庫驅(qū)動(dòng)程序
          hibernate.connection.url -- 連接數(shù)據(jù)庫 URL
          hibernate.connection.username -- 數(shù)據(jù)庫用戶名
          hibernate.connection.password -- 數(shù)據(jù)庫密碼

        • 方言:

          hibernate.dialect -- 操作數(shù)據(jù)庫方言

      • 可選的配置

        • hibernate.show_sql -- 顯示 SQL
        • hibernate.format_sql -- 格式化 SQL
        • hibernate.hbm2ddl.auto -- 通過映射轉(zhuǎn)成 DDL 語句敢靡,常用: update
          • create -- 每次都會(huì)創(chuàng)建一個(gè)新的表 --- 測試的時(shí)候
          • create-drop -- 每次都會(huì)創(chuàng)建一個(gè)新的表挂滓,當(dāng)執(zhí)行結(jié)束之后,將創(chuàng)建的這個(gè)表刪除 --- 測試的時(shí)候
          • update -- 如果有表,使用原來的表啸胧。沒有表,創(chuàng)建一個(gè)新的表赶站,同時(shí)更新表結(jié)構(gòu)(比如新增一個(gè)字段,但是不能刪除字段)
          • validate -- 如果有表,使用原來的表纺念。同時(shí)校驗(yàn)映射文件與表中字段是否一致贝椿,如果不一致就會(huì)報(bào)錯(cuò)。
      • 加載映射

        • 如果XML方式:

            <mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />
          

5陷谱、Hibernate 常用的接口和類

  1. Configuration 類和作用

    • Configuration 類

      • Configuration 對象用于配置并且啟動(dòng) Hibernate烙博。

      • Hibernate 應(yīng)用通過該對象來獲得對象-關(guān)系映射文件中的元數(shù)據(jù),以及動(dòng)態(tài)配置 Hibernate 的屬性,然后創(chuàng)建 SessionFactory 對象习勤。

      • 簡單一句話:加載 Hibernate 的配置文件踪栋,可以獲取 SessionFactory 對象。

    • Configuration 類的其他應(yīng)用(了解)

      • 加載配置文件的種類图毕,Hibernate 支持 xml 和 properties 類型的配置文件夷都,在開發(fā)中基本都使用 XML 配置文件的方式。
        • 如果采用的是 properties 的配置文件予颤,那么通過:

            Configuration configuration = new Configuration();
          

          就可以自動(dòng)配置文件囤官,但是還需要自己手動(dòng)加載映射文件(xxx.hbm.xml):

            config.addResource("cn/itcast/domain/Student.hbm.xml");
          
        • 如果采用的XML的配置文件,通過:

            Configuration configuration = new Configuration().configure();
          

          加載配置文件蛤虐。

  2. SessionFactory:重要

    • SessionFactory 是工廠類党饮,是生成 Session 對象的工廠類
    • SessionFactory 類的特點(diǎn)
      • 由 Configuration 通過加載配置文件創(chuàng)建該對象。

      • SessionFactory 對象中保存了當(dāng)前的數(shù)據(jù)庫配置信息和所有映射關(guān)系以及預(yù)定義的 SQL 語句驳庭。同時(shí)刑顺,SessionFactory 還負(fù)責(zé)維護(hù) Hibernate 的二級(jí)緩存。

        • 預(yù)定義SQL語句
          • 使用 Configuration 類創(chuàng)建了 SessionFactory 對象是饲常,已經(jīng)在SessionFacotry 對象中緩存了一些 SQL 語句
          • 常見的 SQL 語句是增刪改查(通過主鍵來查詢)
          • 這樣做的目的是效率更高
      • 一個(gè) SessionFactory 實(shí)例對應(yīng)一個(gè)數(shù)據(jù)庫蹲堂,應(yīng)用從該對象中獲得 Session 實(shí)例。

      • SessionFactory 是線程安全的贝淤,意味著它的一個(gè)實(shí)例可以被應(yīng)用的多個(gè)線程共享柒竞。

      • SessionFactory 是重量級(jí)的,意味著不能隨意創(chuàng)建或銷毀它的實(shí)例播聪。如果只訪問一個(gè)數(shù)據(jù)庫朽基,只需要?jiǎng)?chuàng)建一個(gè) SessionFactory 實(shí)例,且在應(yīng)用初始化的時(shí)候完成离陶。

      • SessionFactory 需要一個(gè)較大的緩存稼虎,用來存放預(yù)定義的SQL語句及實(shí)體的映射信息。另外可以配置一個(gè)緩存插件招刨,這個(gè)插件被稱之為 Hibernate 的二級(jí)緩存渡蜻,被多線程所共享

    1. 總結(jié)

      • 一般應(yīng)用使用一個(gè) SessionFactory,最好是應(yīng)用啟動(dòng)時(shí)就完成初始化。
  3. 編寫HibernateUtil的工具類

    • 正因?yàn)?SessionFactory 比較特別计济,每次使用時(shí)都是固定的代碼茸苇,所以可以把代碼抽取出來,編寫工具類沦寂。

    • 具體代碼如下

        public class HibernateUtil {
            private static final Configuration cfg;
            private static final SessionFactory factory;
            static{
                // 給常量賦值 
                // 加載配置文件
                cfg = new Configuration().configure();
                // 生成factory對象
                factory = cfg.buildSessionFactory();
            }
            // 獲取Session對象
            public static Session openSession(){
                return factory.openSession();
            }
        }
      
  4. Session 接口

    • 概述

      • Session 是在 Hibernate 中使用最頻繁的接口学密。也被稱之為持久化管理器。它提供了和持久化有關(guān)的操作传藏,比如添加腻暮、修改彤守、刪除、加載和查詢實(shí)體對象

      • Session 是應(yīng)用程序與數(shù)據(jù)庫之間交互操作的一個(gè)單線程對象哭靖,是 Hibernate 運(yùn)作的中心

      • Session是線程不安全的

      • 所有持久化對象必須在 session 的管理下才可以進(jìn)行持久化操作

      • Session 對象有一個(gè)一級(jí)緩存具垫,顯式執(zhí)行 flush 之前,所有的持久化操作的數(shù)據(jù)都緩存在 session 對象處

      • 持久化類與 Session 關(guān)聯(lián)起來后就具有了持久化的能力

    • 特點(diǎn)

      • 不是線程安全的试幽。應(yīng)避免多個(gè)線程使用同一個(gè) Session 實(shí)例

      • Session 是輕量級(jí)的筝蚕,它的創(chuàng)建和銷毀不會(huì)消耗太多的資源。應(yīng)為每次客戶請求分配獨(dú)立的 Session 實(shí)例

      • Session 有一個(gè)緩存铺坞,被稱之為 Hibernate 的一級(jí)緩存起宽。每個(gè) Session 實(shí)例都有自己的緩存

    • 常用的方法

      • save(obj)

          /**
           * 測試工具類
           */
          @Test
          public void testSave2(){
              // 使用工具類簡化代碼
              Session session = HibernateUtils.getSession();
              Transaction tr = session.beginTransaction();
        
              Customer c = new Customer();
              c.setCust_name("小風(fēng)");
              session.save(c);
        
              // 提交事務(wù)
              tr.commit();
              // 釋放資源
              session.close();
          }
        
      • get(Class,id)

        2個(gè)參數(shù):class 表示要查詢的 JavaBean 的 class 對象,id 為主鍵的值济榨。

        例如坯沪,需要查 Customer 對應(yīng)的表中主鍵值為7(Long 類型)的記錄,代碼如下:

          Customer c = session.get(Customer.class, 7L);
        
      • delete(obj)

        注意:在這里是對數(shù)據(jù)庫進(jìn)行操作擒滑,所以刪除的是數(shù)據(jù)庫的表中的某一行記錄腐晾,所以首先要調(diào)用上面的 get 方法,得到對象后丐一,再刪除赴魁。

          Customer c = session.get(Customer.class, 7L);
          
          // 刪除客戶
          session.delete(c);
        
      • update(obj)

          Customer c = session.get(Customer.class, 95L);
          
          // 設(shè)置客戶的信息
          c.setCust_name("小蒼");
          c.setCust_level("3");
          
          // 修改
          session.update(c);
        
      • saveOrUpdate(obj) -- 保存或者修改(如果沒有數(shù)據(jù),保存數(shù)據(jù)钝诚。如果有,修改數(shù)據(jù))

        • 保存

            Customer c = new Customer();
            // c.setCust_id(10L);   這是錯(cuò)誤做法榄棵!千萬不能自己設(shè)置主鍵去保存凝颇!
            c.setCust_name("測試");
            session.saveOrUpdate(c);
          
        • 修改

            // 先查詢再改
            Customer c = session.get(Customer.class, 6L);
            c.setCust_name("小澤");
            session.saveOrUpdate(c);
          
      • createQuery() -- HQL語句的查詢的方式

          // 創(chuàng)建查詢的接口
          Query query = session.createQuery("from Customer");
          // 查詢該表所有的數(shù)據(jù)
          List<Customer> list = query.list();
          for (Customer customer : list) {
              System.out.println(customer);
          }
        
  5. Transaction 接口

    • Transaction 是事務(wù)的接口

    • 常用的方法

      • commit() -- 提交事務(wù)

      • rollback() -- 回滾事務(wù)

    • 特點(diǎn)

      • Hibernate 框架默認(rèn)情況下事務(wù)不自動(dòng)提交.需要手動(dòng)提交事務(wù)

      • 如果沒有開啟事務(wù),那么每個(gè) Session 的操作疹鳄,都相當(dāng)于一個(gè)獨(dú)立的事務(wù)

      在如上的代碼中拧略,都開啟了事務(wù),并且手動(dòng)提交了事務(wù)瘪弓。

    • 示例:

        /**
         * 測試保存
         */
        @Test
        public void testSave3(){
            Session session = null;
            Transaction tr = null;
            try {
                // 獲取session
                session = HibernateUtils.getSession();
                // 開啟事務(wù)
                tr = session.beginTransaction();
                // 執(zhí)行代碼
                Customer c = new Customer();
                c.setCust_name("哈哈");
                // 保存
                session.save(c);
                // 提交事務(wù)事務(wù)
                tr.commit();
            } catch (Exception e) {
                // 回滾事務(wù)
                tr.rollback();
                e.printStackTrace();
            }finally{
                // 釋放資源
                session.close();
            }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垫蛆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腺怯,更是在濱河造成了極大的恐慌袱饭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛占,死亡現(xiàn)場離奇詭異虑乖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晾虑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門疹味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅叫,“玉大人,你說我怎么就攤上這事糙捺〗朐郏” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵洪灯,是天一觀的道長坎缭。 經(jīng)常有香客問我,道長婴渡,這世上最難降的妖魔是什么幻锁? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮边臼,結(jié)果婚禮上哄尔,老公的妹妹穿的比我還像新娘。我一直安慰自己柠并,他們只是感情好岭接,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臼予,像睡著了一般鸣戴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粘拾,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天窄锅,我揣著相機(jī)與錄音,去河邊找鬼缰雇。 笑死入偷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的械哟。 我是一名探鬼主播疏之,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暇咆!你這毒婦竟也來了锋爪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤爸业,失蹤者是張志新(化名)和其女友劉穎其骄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扯旷,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡年栓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薄霜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片某抓。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纸兔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出否副,到底是詐尸還是另有隱情汉矿,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布备禀,位于F島的核電站洲拇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏曲尸。R本人自食惡果不足惜赋续,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望另患。 院中可真熱鬧纽乱,春花似錦、人聲如沸昆箕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹏倘。三九已至薯嗤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纤泵,已是汗流浹背骆姐。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏题,地道東北人玻褪。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像涉馅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子黄虱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容