• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Hibernater入門-01

    框架和CRM項目的整體介紹

    什么是CRM

    • CRM(==Customer Relationship Management==)客戶關系管理,是利用相應的信息技術以及互聯網技術來協調企業與顧客間在銷售、營銷和服務上的交互,向客戶提供創新式的個性化的客戶交互和服務的過程
    • 其最終目標是將面向客戶的各項信息和活動集成起來,組建一個以客戶為中心的企業,實現對面向客戶的活動的全面管理

    CRM的模塊

    • CRM系統實現了對企業銷售、營銷、服務等各階段的客戶信息、客戶活動進行統一管理。
    • CRM系統功能涵蓋企業銷售、營銷、用戶服務等各各業務流程,業務流程中與客戶相關活動都會在CRM系統統一管理。
    • 下邊列出一些基本的功能模塊,包括:
      • 客戶信息管理
      • 聯系人管理
      • 商機管理
      • 統計分析等
        image

    模塊的具體功能

    • 客戶信息管理

      • 對客戶信息統一維護,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的數據資源。
    • 聯系人管理

      • 對客戶的聯系人信息統一管理,聯系人是指客戶企業的聯系人,即企業的業務人員和客戶的哪些人在打交道。
    • 客戶拜訪管理

      • 業務員要開發客戶需要去拜訪客戶,客戶拜訪信息記錄了業務員與客戶溝通交流方面的不足、采取的策略不當、有待改進的地方或值得分享的溝通技巧等方面的信息。
    • 綜合查詢

      • 客戶相關信息查詢,包括:客戶信息查詢、聯系人信息查詢、商機信息查詢等
    • 統計分析

      • 按分類統計客戶信息,包括:客戶信息來源統計、按行業統計客戶、客戶發展數量統計等
    • 系統管理
      系統管理屬于crm系統基礎功能模塊,包括:數據字典、賬戶管理、角色管理、權限管理、操作日志管理等

    image

    Hibernate框架的學習路線

    1. 注意:Hibernate框架知識點非常多,比較雜亂,大家要做好筆記記錄的工作
    2. 學習的路線
        * 第一天:主要是學習框架的入門,自己搭建框架,完成增刪改查的操作 
        * 第二天:主要學習一級緩存、事務管理和基本的查詢
        * 第三天:主要學習一對多和多對多的操作等
        * 第四天:基本查詢和查詢的優化
    

    image

    Hibernate框架的概述

    Hibernate框架的概述

    • Hibernate是一個開放源代碼的對象關系映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
    • Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用。
    • Hibernate是輕量級JavaEE應用的持久層解決方案,是一個關系數據庫ORM框架

    • ==記住:Hibernate是一個持久層的ORM框架==!!!

    什么是ORM(對象關系映射)

    • ORM映射:Object Relational Mapping
      • O:面向對象領域的Object(JavaBean對象)
      • R:關系數據庫領域的Relational(表的結構)
      • M:映射Mapping(XML的配置文件)

    簡單一句話:Hibernate使程序員通過操作對象的方式來操作數據庫表記錄

    image

    Hibernate優點

    • Hibernate對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼
    • Hibernate是一個基于jdbc的主流持久化框架,是一個優秀的orm實現,它很大程度的簡化了dao層編碼工作
    • Hibernate的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系

    Hibernate框架的快速入門

    案例一:完成客戶的CRUD的操作

    需求分析

    1. CRM系統中客戶信息管理模塊功能包括

    * 新增客戶信息
    * 客戶信息查詢
    * 修改客戶信息
    * 刪除客戶信息
    

    2. 要實現客戶的新增功能

    第一步:下載Hibernate5的運行環境

    下載相應的jar包等

    http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download    

    解壓后對目錄結構有一定的了解

    第二步:創建表結構

    Create database hibernate_day01;
    Use hibernate_day01;
    CREATE TABLE `cst_customer` (
      `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
      `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
      `cust_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id',
      `cust_create_id` bigint(32) DEFAULT NULL COMMENT '創建人id',
      `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
      `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
      `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
      `cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯系人',
      `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
      `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話',
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;

    第三步:搭建Hibernate的開發環境

    創建WEB工程,引入Hibernate開發所需要的jar包
    * MySQL的驅動jar包
    * Hibernate開發需要的jar包(資料/hibernate-release-5.0.7.Final/lib/required/所有jar包)
    * 日志jar包(資料/jar包/log4j/所有jar包)

    第四步:編寫JavaBean實體類

    Customer類的代碼如下:

    public class Customer {
        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方法
    }

    第五步:創建類與表結構的映射

    1. 在JavaBean所在的包下創建映射的配置文件
    * 默認的命名規則為:實體類名.hbm.xml
    * 在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. 如果不能上網,編寫配置文件是沒有提示的,需要自己來配置

    先復制http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window
    --> preferences --> 搜索xml --> 選擇xml catalog --> 點擊add --> 現在URI
    --> 粘貼復制的地址 --> 選擇location,選擇本地的DTD的路徑

    3. 編寫映射的配置文件

    <?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>
    
        <!-- 配置類和表結構的映射 -->
        <class name="com.itheima.domain.Customer" table="cst_customer">
            <!-- 配置id(主鍵) 
                見到name屬性,JavaBean的屬性
                見到column屬性,是表結構的字段
            -->
            <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>    

    第六步:編寫Hibernate核心的配置文件

    • 在src目錄下,創建名稱為hibernate.cfg.xml的配置文件(名稱位置都固定)
    • 在XML中引入DTD約束
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    • 配置信息
      ?可以打開:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,查看具體的配置信息
    * 必須配置的4大參數(根據空格劃分) 
        hibernate.connection.driver_class com.mysql.jdbc.Driver
        hibernate.connection.url jdbc:mysql:///test  <!--訪問本機-->
        hibernate.connection.username gavin
        hibernate.connection.password
    
    * 數據庫的方言(必須配置的)
        hibernate.dialect org.hibernate.dialect.MySQLDialect
    
    * 可選的配置
        hibernate.show_sql true
        hibernate.format_sql true
        hibernate.hbm2ddl.auto update
    
    * 引入映射配置文件(一定要注意,要引入映射文件,框架需要加載映射文件)
        * <mapping resource="com/itheima/domain/Customer.hbm.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>
    <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">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
    <mapping resource="com/itheima/domain/Customer.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    第七步:編寫Hibernate入門代碼

    1. 具體的代碼如下
    
    /**
     * 測試保存客戶
     */
    @Test
    public void testSave(){
        // 先加載配置文件
        Configuration config = new Configuration();
        // 默認加載src目錄下的配置文件
        config.configure();
        // 創建SessionFactory對象
        SessionFactory factory = config.buildSessionFactory();
        // 創建session對象
        Session session = factory.openSession();
        // 開啟事務
        Transaction tr = session.beginTransaction();
        // 編寫保存代碼
        Customer c = new Customer();
        // c.setCust_id(cust_id);   已經自動遞增
        c.setCust_name("測試名稱");
        c.setCust_mobile("110");
        // 保存客戶
        session.save(c);
        // 提交事務
        tr.commit();
        // 釋放資源
        session.close();
        factory.close();
    }

    回憶:快速入門

    • 下載Hibernate框架的開發包
    • 編寫數據庫和表結構
    • 創建WEB的項目,導入了開發的jar包
      • MySQL驅動包、Hibernate開發的必須要有的jar包、日志的jar包
    • 編寫JavaBean,以后不使用基本數據類型,使用包裝類
    • 編寫映射的配置文件(核心),先導入開發的約束,里面正常配置標簽
    • 編寫hibernate的核心的配置文件,里面的內容是固定的
    • 編寫代碼,使用的類和方法

    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>
    
        <!-- 記住:先配置SessionFactory標簽,一個數據庫對應一個SessionFactory標簽 -->
        <session-factory>
    
    <!--      必須配置的元素
        1.數據庫方言
            #hibernate.dialect org.hibernate.dialect.MySQLDialect
            #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
            #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        2.配置數據庫的4大參數
            #hibernate.connection.driver_class com.mysql.jdbc.Driver
            #hibernate.connection.url jdbc:mysql:///test
            #hibernate.connection.username gavin
            #hibernate.connection.password
     -->
            <!-- 必須要配置的參數有5個,4大參數,數據庫的方言 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
    
    
    <!--    可選配置
               #hibernate.show_sql true 打印sql語句
               #hibernate.format_sql true 格式化sql語句
            ## auto schema export  自動導出表結構. 自動建表(分為4個選項)
                #hibernate.hbm2ddl.auto create
                        自動建表.每次框架運行都會創建新的表.以前表將會被覆蓋,表數據會丟失.(開發環境中測試使用)
                #hibernate.hbm2ddl.auto create-drop
                        自動建表.每次框架運行結束都會將所有表刪除.(開發環境中測試使用)
                #hibernate.hbm2ddl.auto update
                        (推薦使用) 自動生成表.如果已經存在不會再生成.如果表有變動.自動更新表(不會刪除任何數據).
                #hibernate.hbm2ddl.auto validate
                        校驗.不自動生成表.每次啟動會校驗數據庫中表是否正確.校驗失敗拋出異常
     -->
    
    
            <!-- 數據庫的方言(盡量選擇這個 這個所有引擎都兼容) -->
            <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>
            <!--生成數據庫的表結構-->
            <!--
                update:如果有表就不會創建,直接操作數據;
                       如果沒表創建該表;
                       還支持更改表結構(只能添加不能刪除);
            -->
            <property name="hibernate.hbm2ddl.auto">update</property>
    
            <!--
                設置數據庫的隔離級別,就使用默認值就OK
                <property name="hibernate.connection.isolation">4</property>
            -->
    
            <!--開啟綁定本地的Session(固定寫法)-->
            <property name="hibernate.current_session_context_class">thread</property>
    
    
            <!--引入映射配置文件-->
            <mapping resource="com/xiaoming/day01/domain/Customer.hbm.xml"></mapping>
            <mapping resource="com/xiaoming/day01/domain/Linkman.hbm.xml"/>
            <mapping resource="com/xiaoming/day01/domain/User.hbm.xml"/>
            <mapping resource="com/xiaoming/day01/domain/Role.hbm.xml"/>
    
    
        </session-factory>
    
    </hibernate-configuration>

    映射配置文件hbm.xml

    • 標簽– 用來將類與數據庫表建立映射關系

      • name – 類的全路徑
      • table – 表名.(類名與表名一致,那么table屬性也可以省略)
      • catalog– 數據庫的名稱,基本上都會省略不寫
    • 標簽 – 用來將類中的屬性與表中的主鍵建立映射,id標簽就是用來配置主鍵的。

      • name – 類中屬性名
      • column – 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么column可以省略.)
      • length– 字段的程度,如果數據庫已經創建好了,那么length可以不寫。如果沒有創建好,生成表結構時,length最好指定。
    • – 用來將類中的普通屬性與表中的字段建立映射.

      • name – 類中屬性名
      • column– 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么column可以省略.)
      • length– 數據長度
      • type – 數據類型(一般都不需要編寫,如果寫需要按著規則來編寫)
        • Hibernate的數據類型 type=”string”
        • Java的數據類型type=”java.lang.String”
        • 數據庫字段的數據類型

    配置如下

    <?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">
    
    
       <!-- 配置表與實體對象的關系 -->
       <!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. -->
    <hibernate-mapping package="cn.itheima.domain" >
        <!-- 
            class元素: 配置實體與表的對應關系的
                name: 完整類名
                table:數據庫表名
         -->
        <class name="Customer" table="cst_customer" >
            <!-- id元素:配置主鍵映射的屬性
                    name: 填寫主鍵對應屬性名
                    column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名
                    type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                            每個類型有三種填法: java類型|hibernate類型|數據庫類型
                    not-null(可選):配置該屬性(列)是否不能為空. 默認值:false
                    length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
             -->
            <id name="cust_id"  >
                <!-- generator:主鍵生成策略(明天講) -->
                <generator class="native"></generator>
            </id>
            <!-- property元素:除id之外的普通屬性映射
                    name: 填寫屬性名
                    column(可選): 填寫列名,默認使用屬性名
                    type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                            每個類型有三種填法: java類型|hibernate類型|數據庫類型
                    not-null(可選):配置該屬性(列)是否不能為空. 默認值:false
                    length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
             -->
            <property name="cust_name" column="cust_name" >
                <!--  <column name="cust_name" sql-type="varchar" ></column> -->
            </property>
            <property name="cust_source" column="cust_source" ></property>
            <property name="cust_industry" column="cust_industry" ></property>
            <property name="cust_level" column="cust_level" ></property>
            <property name="cust_linkman" column="cust_linkman" ></property>
            <property name="cust_phone" column="cust_phone" ></property>
            <property name="cust_mobile" column="cust_mobile" ></property>
        </class>
    </hibernate-mapping>

    核心配置文件

    核心配置文件的兩種方式

    1.屬性文件的方式(properties配置文件)

    • hibernate.properties
        hibernate.connection.driver_class=com.mysql.jdbc.Driver
    • 缺點

    不能加載映射的配置文件,需要手動編寫代碼去加載

    2.XML配置方式(推薦)

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

    hibernate.cfg.xml的配置詳解

    必須有的配置
    • 數據庫連接信息:
    hibernate.connection.driver_class   -- 連接數據庫驅動程序
    hibernate.connection.url    -- 連接數據庫URL
    hibernate.connection.username  -- 數據庫用戶名
    hibernate.connection.password       -- 數據庫密碼
    • 方言:
    hibernate.dialect   -- 操作數據庫方言
    可選的配置
    * hibernate.show_sql    -- 顯示SQL
    * hibernate.format_sql  -- 格式化SQL
    * hibernate.hbm2ddl.auto-- 通過映射轉成DDL語句
        * create-- 每次都會創建一個新的表.---測試的時候
        * create-drop   -- 每次都會創建一個新的表,當執行結束之后,將創建的這個表刪除.---測試的時候
        * update-- 如果有表,使用原來的表.沒有表,創建一個新的表.同時更新表結構.
        * validate-- 如果有表,使用原來的表.同時校驗映射文件與表中字段是否一致如果不一致就會報錯.
    
    * 加載映射
        * 如果XML方式:<mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />
    

    Hibernate常用的接口和類

    Configuration類和作用

    Configuration類

    • Configuration對象用于配置并且啟動Hibernate。
    • Hibernate應用通過該對象來獲得對象-關系映射文件中的元數據,以及動態配置Hibernate的屬性,然后創建SessionFactory對象。

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

    Configuration類的其他應用(了解)

    • 加載配置文件的種類,Hibernate支持xml和properties類型的配置文件,在開發中基本都使用XML配置文件的方式。

      • 如果采用的是properties的配置文件,那么通過Configuration configuration = new Configuration();就可以加載配置文件

        • 但是需要自己手動加載映射文件
        • 例如:config.addResource(“cn/itcast/domain/Student.hbm.xml”);
      • 如果采用的XML的配置文件,通過Configuration configuration = new Configuration().configure();加載配置文件

    SessionFactory:(重要)

    概述

    image
    是工廠類,是生成Session對象的工廠類

    SessionFactory類的特點

    • 由Configuration通過加載配置文件創建該對象。
    • SessionFactory對象中保存了當前的數據庫配置信息和所有映射關系以及預定義的SQL語句。同時,SessionFactory還負責維護Hibernate的二級緩存。
    * 預定義SQL語句
        * 使用Configuration類創建了SessionFactory對象是,已經在SessionFacotry對象中緩存了一些SQL語句
        * 常見的SQL語句是增刪改查(通過主鍵來查詢)
        * 這樣做的目的是效率更高
    • 一個SessionFactory實例對應一個數據庫,應用從該對象中獲得Session實例。
    • SessionFactory是線程安全的,意味著它的一個實例可以被應用的多個線程共享。
    • SessionFactory是重量級的,意味著不能隨意創建或銷毀它的實例。如果只訪問一個數據庫,只需要創建一個SessionFactory實例,且在應用初始化的時候完成。
    • SessionFactory需要一個較大的緩存,用來存放預定義的SQL語句及實體的映射信息。另外可以配置一個緩存插件,這個插件被稱之為Hibernate的二級緩存,被多線程所共享

    總結

    一般應用使用一個SessionFactory,最好是應用啟動時就完成初始化。

    編寫HibernateUtil的工具類

    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();
        }
    }
    

    Session接口(很重要)

    概述

    • Session是在Hibernate中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象
    • Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心
    • Session是線程不安全的
    • 所有持久化對象必須在 session 的管理下才可以進行持久化操作
    • Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處
    • 持久化類與 Session 關聯起來后就具有了持久化的能力

    特點

    • 不是線程安全的。應避免多個線程使用同一個Session實例
    • Session是輕量級的,它的創建和銷毀不會消耗太多的資源。應為每次客戶請求分配獨立的Session實例
    • Session有一個緩存,被稱之為Hibernate的一級緩存。每個Session實例都有自己的緩存

    常用的方法

    • save(obj)
    • delete(obj)
    • get(Class,id)
    • update(obj)
    • saveOrUpdate(obj)? –保存或者修改(如果沒有數據,保存數據。如果有,修改數據)
    • createQuery() ? – HQL語句的查詢的方式

    Transaction接口

    概述

    • Transaction是事務的接口
    • 常用的方法
    commit()-- 提交事務
    rollback()  -- 回滾事務
    • 特點
      • Hibernate框架默認情況下事務不自動提交.需要手動提交事務
      • 如果沒有開啟事務,那么每個Session的操作,都相當于一個獨立的事務

    測試代碼

    package com.itheima.test;
    
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import com.itheima.domain.Customer;
    import com.itheima.utils.HibernateUtils;
    
    /**
     * 測試Hibernate框架
     * @author Administrator
     */
    public class Demo1 {
    
        /**
         * 測試保存
         */
        @Test
        public void testSave3(){
            Session session = null;
            Transaction tr = null;
            try {
                // 獲取session
                session = HibernateUtils.getSession();
                // 開啟事務
                tr = session.beginTransaction();
                // 執行代碼
                Customer c = new Customer();
                c.setCust_name("哈哈");
                // 保存
                session.save(c);
                // 提交事務事務
                tr.commit();
            } catch (Exception e) {
                // 回滾事務
                tr.rollback();
                e.printStackTrace();
            }finally{
                // 釋放資源
                session.close();
            }
        }
    
    
        /**
         * 測試查詢的方法
         */
        @Test
        public void testSel(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
            // 創建查詢的接口
            Query query = session.createQuery("from Customer");
            // 查詢所有的數據 select * from 表
            List<Customer> list = query.list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
    
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試添加或者修改
         */
        @Test
        public void testSaveOrUpdate(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
    
            /*// 演示錯誤
            Customer c = new Customer();
            // c.setCust_id(10L);   千萬不能自己設置
            c.setCust_name("測試");
    
            // 保存或者修改
            session.saveOrUpdate(c);*/
    
            // 先查詢再改
            Customer c = session.get(Customer.class, 6L);
            c.setCust_name("小澤");
    
            session.saveOrUpdate(c);
    
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試修改
         */
        @Test
        public void testUpdate(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
            // 測試查詢的方法 2個參數:arg0查詢JavaBean的class對象 arg1主鍵的值
            Customer c = session.get(Customer.class, 6L);
    
            // 設置客戶的信息
            c.setCust_name("小蒼");
            c.setCust_level("3");
    
            // 修改
            session.update(c);
    
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試刪除的方法
         * 注意:刪除或者修改,先查詢再刪除或者修改
         */
        @Test
        public void testDel(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
            // 測試查詢的方法 2個參數:arg0查詢JavaBean的class對象 arg1主鍵的值
            Customer c = session.get(Customer.class, 7L);
    
            // 刪除客戶
            session.delete(c);
    
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試get()方法,獲取查詢,通過主鍵來查詢一條記錄
         */
        @Test
        public void testGet(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
            // 測試查詢的方法 2個參數:arg0查詢JavaBean的class對象 arg1主鍵的值
            Customer c = session.get(Customer.class, 7L);
            System.out.println(c);
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試工具類
         */
        @Test
        public void testSave2(){
            // 原來:加載配置文件,獲取Factory對象,獲取session
            Session session = HibernateUtils.getSession();
            Transaction tr = session.beginTransaction();
            Customer c = new Customer();
            c.setCust_name("小風");
            session.save(c);
            // 提交事務
            tr.commit();
            // 釋放資源
            session.close();
        }
    
        /**
         * 測試保存客戶
         */
        @Test
        public void testSave(){
            /**
             *  1. 先加載配置文件
             *  2. 創建SessionFactory對象,生成Session對象
             *  3. 創建session對象
             *  4. 開啟事務
             *  5. 編寫保存的代碼
             *  6. 提交事務
             *  7. 釋放資源
             */
            /*// 1. 先加載配置文件
            Configuration config = new Configuration();
            // 默認加載src目錄下hibernate.cfg.xml的配置文件
            config.configure();
            // 了解,手動加載
            // config.addResource("com/itheima/domain/Customer.hbm.xml");
             */     
    
            // 簡寫的方法
            Configuration config = new Configuration().configure();
    
            // 2. 創建SessionFactory對象
            SessionFactory factory = config.buildSessionFactory();
            // 3. 創建session對象
            Session session = factory.openSession();
            // 4. 開啟事務
            Transaction tr = session.beginTransaction();
    
            // 5. 編寫保存的代碼
            Customer c = new Customer();
            // c.setCust_id(cust_id);   主鍵是自動遞增了
            c.setCust_name("測試3");
            c.setCust_level("2");
            c.setCust_phone("110");
    
            // 保存數據,操作對象就相當于操作數據庫的表結構
            session.save(c);
    
            // 6. 提交事務
            tr.commit();
            // 7. 釋放資源
            session.close();
            factory.close();
        }
    
    }
    
    版權聲明:本文為qq_36974281原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_36974281/article/details/81369715

    智能推薦

    01-mysql入門

    MySQL語句分類 先看幾張圖,對數據庫結構有個大概的了解 - 為什么要學數據庫 常用數據庫分類 MySQL中的注解 1.單行: – 2.多行: /**/ - MySQL不區分大小寫嗎? 如何連接數據庫? 進入dos系統,輸入mysql -u root -p 回車 提示輸入密碼,密碼輸入之后,即可建立連接(注意MySQL中的sql的結束用”;”號結束) 數據庫定...

    Django-01-入門

    Django-01-入門 一、Django安裝 首先是安裝Django的框架,Django實際上就是一些包裝好的python庫,方便我們開發網站,直接使用pip命令安裝就行(前提是你已經安裝好了python)。 我們要知道我們使用的python的版本,找到對應的Django版本進行安裝,如下圖所示。 可以使用下面命令查看python版本(我的是python版本3.6) 然后使用使用管理員身份打開命...

    01、RabbitMQ之入門

    RabbitMQ之入門 一、什么是MQ? 消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已 二、主流MQ框架 MQ框架非常之多,比較流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里開源的RocketMQ。 區別: 本文主要介紹RabbitMQ 三、應用場景 主要解決異步處理、應...

    Vue入門01

    NodeJS&npm(了解) 1.安裝nodejs NodeJs下載:https://nodejs.org/en/download/ 安裝完成Node應該自帶了NPM了,在控制臺輸入npm -v查看安裝后的版本 2.idea安裝nodejs插件 設置里Plugins中搜索nodejs插件,idea新版自帶nodejs插件,不需要安裝nodejs插件 3.Npm常用命令 創建前端項目 ①初始...

    React_01_入門

    React 、Vue、 Angular三大框架對比 React的特點: 1. JSX 2. 組件化 3. 虛擬dom 4. 單向綁定 5. 單向數據流 6. 聲明式 Facebook 于2013年開源 React當前最新版: v16.4.0 關于開源協議 最流行的六種----GPL、BSD、MIT、Mozilla、Apache和LGPL。 React官方教程: https://reactjs.or...

    猜你喜歡

    小程序01 入門

    準備工作 申請賬號 點擊 https://mp.weixin.qq.com/wxopen/waregister?action=step1 申請賬號,擁有自己的小程序賬號 安裝開發工具 前往 開發者工具下載頁面 下載開發工具并安裝 app.json app.json扮演的了靜態配置的角色,在小程序運行之前就決定了小程序一些表現,需要注意的是小程序是無法在運行過程中去動態更新JSON 配置文件從而發生...

    【Flutter】入門01

    1.Hello world 在程序的開頭我們使用import來引入非本文檔內的資源(工具類,部件等),'package:flutter/material.dart' 這個包則google提供的一套界面的設計規則(也可以說是一套基本部件); void main()是程序的入口,runApp則代表開始運行程序其內的參數表示要展示的部件; Center和Text會在后續進行介紹,這里只簡單說明...

    Flyway--01入門

    1.簡介 Flyway是一款開源的數據庫版本管理工具,Flyway可以實現自動化的數據庫版本管理,并且能夠記錄數據庫版本更新記錄;通常在項目開始時會針對數據庫進行全局設計,但在開發產品新特性過程中,難免會遇到需要更新數據庫Schema的情況,如:添加新表,添加新字段和約束等,這種情況在實際項目中也常發生。那么,當開發人員完成了對數據庫更的SQL腳本后,如何快速地在其他開發者機器上同步?并且如何在測...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡