【JAVAEE學習筆記】hibernate01:簡介、搭建、配置文件詳解、API詳解和CRM練習:保存客戶

来源:http://www.cnblogs.com/xieyupeng/archive/2017/06/05/6942621.html
-Advertisement-
Play Games

今日學習:hibernate是什麼 一、hibernate是什麼 框架是什麼: 1.框架是用來提高開發效率的 2.封裝了好了一些功能.我們需要使用這些功能時,調用即可.不需要再手動實現. 3.所以框架可以理解成是一個半成品的項目.只要懂得如何駕馭這些功能即可. hibernate框架是什麼: hib ...


今日學習:hibernate是什麼

 

一、hibernate是什麼

框架是什麼:

1.框架是用來提高開發效率的

2.封裝了好了一些功能.我們需要使用這些功能時,調用即可.不需要再手動實現.

3.所以框架可以理解成是一個半成品的項目.只要懂得如何駕馭這些功能即可.

hibernate框架是什麼:

hibernate的好處:

 操作資料庫的時候,可以以面向對象的方式來完成.不需要書寫SQL語句

hibernate是一款orm框架:

 orm:object relationg mapping. 對象關係映射

orm分4級:

hibernate屬於4級:完全面向對象操作資料庫

mybatis屬於2級

dbutils屬於1級

 

二、hibernate框架的搭建

1.導包

驅動包

2.創建資料庫,準備表,實體

3.書寫orm元數據(對象與表的映射配置文件)

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>
    <session-factory>
    
        <!-- 
        #hibernate.dialect org.hibernate.dialect.MySQLDialect
        #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
        #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password
         -->
         <!-- 資料庫驅動 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 資料庫url -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
         <!-- 資料庫連接用戶名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 資料庫連接密碼 -->
        <property name="hibernate.connection.password">1234</property>
        <!-- 資料庫方言
            不同的資料庫中,sql語法略有區別. 指定方言可以讓hibernate框架在生成sql語句時.針對資料庫的方言生成.
            sql99標準: DDL 定義語言  庫表的增刪改查
                      DCL 控制語言  事務 許可權
                      DML 操縱語言  增刪改查
            註意: MYSQL在選擇方言時,請選擇最短的方言.
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        
        <!-- #hibernate.show_sql true 
             #hibernate.format_sql true
        -->
        <!-- 將hibernate生成的sql語句列印到控制台 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 將hibernate生成的sql語句格式化(語法縮進) -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
        ## auto schema export  自動導出表結構. 自動建表
        #hibernate.hbm2ddl.auto create        自動建表.每次框架運行都會創建新的表.以前表將會被覆蓋,表數據會丟失.(開發環境中測試使用)
        #hibernate.hbm2ddl.auto create-drop 自動建表.每次框架運行結束都會將所有表刪除.(開發環境中測試使用)
        #hibernate.hbm2ddl.auto update(推薦使用) 自動生成表.如果已經存在不會再生成.如果表有變動.自動更新表(不會刪除任何數據).
        #hibernate.hbm2ddl.auto validate    校驗.不自動生成表.每次啟動會校驗資料庫中表是否正確.校驗失敗.
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 引入orm元數據
            路徑書寫: 填寫src下的路徑
         -->
        <mapping resource="cn/itheima/domain/Customer.hbm.xml" />
        
    </session-factory>
</hibernate-configuration>

5.書寫代碼測試

//測試Hibernate框架
public class Demo {
    

    @Test
    //保存客戶
    public void fun1(){
        Configuration conf = new Configuration().configure();
        
        SessionFactory sessionFactory = conf.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
    
        Transaction tx = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();
        c.setCust_name("google公司");
        
        session.save(c);//執行保存
        
        //----------------------------------------------
        tx.commit();
        session.close();
        sessionFactory.close();
    }
}

 

三、配置文件詳解

orm元數據

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

hibernate主配置:

必選屬性配置(5個)

 <!-- 資料庫驅動 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 資料庫url -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
         <!-- 資料庫連接用戶名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 資料庫連接密碼 -->
        <property name="hibernate.connection.password">1234</property>
        <!-- 資料庫方言
            不同的資料庫中,sql語法略有區別. 指定方言可以讓hibernate框架在生成sql語句時.針對資料庫的方言生成.
            sql99標準: DDL 定義語言  庫表的增刪改查
                      DCL 控制語言  事務 許可權
                      DML 操縱語言  增刪改查
            註意: MYSQL在選擇方言時,請選擇最短的方言.
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可選屬性配置(3個)

<!-- #hibernate.show_sql true 
             #hibernate.format_sql true
        -->
        <!-- 將hibernate生成的sql語句列印到控制台 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 將hibernate生成的sql語句格式化(語法縮進) -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
        ## auto schema export  自動導出表結構. 自動建表
        #hibernate.hbm2ddl.auto create        自動建表.每次框架運行都會創建新的表.以前表將會被覆蓋,表數據會丟失.(開發環境中測試使用)
        #hibernate.hbm2ddl.auto create-drop 自動建表.每次框架運行結束都會將所有表刪除.(開發環境中測試使用)
        #hibernate.hbm2ddl.auto update(推薦使用) 自動生成表.如果已經存在不會再生成.如果表有變動.自動更新表(不會刪除任何數據).
        #hibernate.hbm2ddl.auto validate    校驗.不自動生成表.每次啟動會校驗資料庫中表是否正確.校驗失敗.
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>

 

元數據引入配置

        <!-- 引入orm元數據
            路徑書寫: 填寫src下的路徑
         -->
        <mapping resource="cn/itheima/domain/Customer.hbm.xml" />

四、hibernateAPI詳解

學習Configuration對象

//學習Configuration對象
// Configuration功能: 配置載入類.用於載入主配置,orm元數據載入
public class Demo {

    @Test
    public void fun1(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration();
        //2 讀取指定主配置文件 => 空參載入方法,載入src下的hibernate.cfg.xml文件
        conf.configure();
        //3 讀取指定orm元數據(擴展),如果主配置中已經引入映射配置.不需要手動載入
        //conf.addResource(resourceName);
        //conf.addClass(persistentClass);
        
        //4 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        
    }
}

學習SessionFactory對象

//學習SessionFactory對象
// SessionFactory功能: 用於創建操作資料庫核心對象session對象的工廠.
//                     簡單說功能就一個---創建session對象
//註意:1.sessionfactory 負責保存和使用所有配置信息.消耗記憶體資源非常大.
//      2.sessionFactory屬於線程安全的對象設計.
//結論: 保證在web項目中,只創建一個sessionFactory.
public class Demo2 {

    @Test
    public void fun1(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration();
        //2 讀取指定主配置文件 => 空參載入方法,載入src下的hibernate.cfg.xml文件
        conf.configure();
        //3 讀取指定orm元數據(擴展),如果主配置中已經引入映射配置.不需要手動載入
        //conf.addResource(resourceName);
        //conf.addClass(persistentClass);
        
        //4 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //--------------------------------------------------
        //5 獲得session
        //打開一個新的session對象
        sf.openSession();
        //獲得一個與線程綁定的session對象(明天講解)
        sf.getCurrentSession();
    }
}

學習Session對象:增刪查改

//學習Session對象
//session對象功能: 表達hibernate框架與資料庫之間的連接(會話).session類似於
//                JDBC年代的connection對象. 還可以完成對資料庫中數據的增刪改查操作.
//                session是hibernate操作資料庫的核心對象
public class Demo3 {

    @Test
    //事務操作
    public void fun1(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //3 獲得session
        Session session = sf.openSession();
        //4 session獲得操作事務的Transaction對象
        //獲得操作事務的tx對象
        //Transaction tx = session.getTransaction();
        //開啟事務並獲得操作事務的tx對象(建議使用)
        Transaction tx2 = session.beginTransaction();
        //----------------------------------------------
        
        
        //----------------------------------------------
        tx2.commit();//提交事務
        tx2.rollback();//回滾事務
        session.close();//釋放資源
        sf.close();//釋放資源
    }
    
    @Test
    //session的新增
    public void fun2(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //3 獲得session
        Session session = sf.openSession();
        //4 session獲得操作事務的Transaction對象
        //獲得操作事務的tx對象
        //Transaction tx = session.getTransaction();
        //開啟事務並獲得操作事務的tx對象(建議使用)
        Transaction tx2 = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();
        c.setCust_name("傳智播客");
        
        session.save(c);
        //----------------------------------------------
        tx2.commit();//提交事務
        session.close();//釋放資源
        sf.close();//釋放資源
    }
    @Test
    //session的查詢
    //查詢id為1的customer對象
    public void fun3(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //3 獲得session
        Session session = sf.openSession();
        //4 session獲得操作事務的Transaction對象
        //獲得操作事務的tx對象
        //Transaction tx = session.getTransaction();
        //開啟事務並獲得操作事務的tx對象(建議使用)
        Transaction tx2 = session.beginTransaction();
        //----------------------------------------------
        
        Customer customer = session.get(Customer.class, 1l);
        
        System.out.println(customer);
        //----------------------------------------------
        tx2.commit();//提交事務
        session.close();//釋放資源
        sf.close();//釋放資源
    }
    @Test
    //session的修改
    //修改id為1的customer對象的name屬性為黑馬程式員
    public void fun4(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //3 獲得session
        Session session = sf.openSession();
        //4 session獲得操作事務的Transaction對象
        //獲得操作事務的tx對象
        //Transaction tx = session.getTransaction();
        //開啟事務並獲得操作事務的tx對象(建議使用)
        Transaction tx2 = session.beginTransaction();
        //----------------------------------------------
        //1 獲得要修改的對象
        Customer c = session.get(Customer.class, 1l);
        //2 修改
        c.setCust_name("黑馬程式員");
        //3 執行update
        session.update(c);
        //----------------------------------------------
        tx2.commit();//提交事務
        session.close();//釋放資源
        sf.close();//釋放資源
    }
    @Test
    //session的刪除
    //刪除id為1的customer對象
    public void fun5(){
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
        SessionFactory sf = conf.buildSessionFactory();
        //3 獲得session
        Session session = sf.openSession();
        //4 session獲得操作事務的Transaction對象
        //獲得操作事務的tx對象
        Transaction tx = session.getTransaction();
        tx.begin();
        //開啟事務並獲得操作事務的tx對象(建議使用)
        Transaction tx2 = session.beginTransaction();
        //----------------------------------------------
        //1 獲得要修改的對象
        Customer c = session.get(Customer.class, 1l);
        //2 調用delete刪除對象
        session.delete(c);
        //----------------------------------------------
        tx2.commit();//提交事務
        session.close();//釋放資源
        sf.close();//釋放資源
    }
}

 

 

 

五、CRM練習:保存客戶

前面的步驟參考前面的筆記。

5.思路分析

在完成作業之前可以先編寫一個方便操作的工具類,免去重覆的代碼:

public class HibernateUtils {
    private static SessionFactory sf;
    
    static{
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
         sf = conf.buildSessionFactory();
    }
    
    //獲得session => 獲得全新session
    public static Session openSession(){
                //3 獲得session
                Session session = sf.openSession();
                
                return session;
        
    }
    //獲得session => 獲得與線程綁定的session
    public static Session getCurrentSession(){
        //3 獲得session
        Session session = sf.getCurrentSession();
        
        return session;
    }
    public static void main(String[] args) {
        System.out.println(HibernateUtils.openSession());
    }
    
}

作業核心代碼:

web層:

/**
 * Servlet implementation class AddCustomerServlet
 */
public class AddCustomerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    private CustomerService customerService  = new CustomerServiceImpl();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 獲得參數並封裝到Customer對象
        Customer c = new Customer();
        try {
            BeanUtils.populate(c, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //2 調用Service保存客戶
        customerService.save(c);
        //3 重定向到客戶列表
        response.sendRedirect(request.getContextPath()+"/ListCustomerServlet");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

service層:

public class CustomerServiceImpl implements CustomerService {

    private CustomerDao customerDao = new CustomerDaoImpl();

    public void save(Customer c) {
        //調用Dao保存客戶
        customerDao .save(c);
    }

}

dao層:

public class CustomerDaoImpl implements CustomerDao {

    public void save(Customer c) {
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 打開事務
        Transaction tx = session.beginTransaction();
        //3 執行保存
        session.save(c);
        //4 提交事務
        tx.commit();
        //5 關閉資源
        session.close();
    }
}

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 網上商城實戰3 今日任務 完成購物模塊的功能 完成訂單模塊的功能 1.1 購物模塊: 1.1.1 功能演示: 商品詳情: 購物車模塊: 1.1.2 代碼實現: 1.在商品詳情的頁面中點擊【加入購物車】鏈及. 2.提交到Servlet中: * 提交購買的商品的數量. * 提交購買的商品的ID. 3.將 ...
  • 一、後臺日期類型解析到前端 1.在springmvc的配置文件中添加這個.annotation-driven在配置文件中只配置一次 (此方法全局作用)<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springfra ...
  • 原創聲明:本文為本人原創作品,絕非他處摘取,轉載請聯繫博主 相信大家在各大網站都會遇到,登錄時,在登錄框出現下次免登陸/一個月免登陸的類似選項,本次博文就是講解如何實現,在這記錄一下,也算是做個備忘錄合集,如果文中有錯,歡迎大家指出 為啥說自登陸一次呢,因為當訪問某個頁面時,如果第一次自動登錄失敗時 ...
  • 序列標註(sequence labelling),輸入序列每一幀預測一個類別。OCR(Optical Character Recognition 光學字元識別)。 MIT口語系統研究組Rob Kassel收集,斯坦福大學人工智慧實驗室Ben Taskar預處理OCR數據集(http://ai.sta ...
  • 一開始,我得向Libuv庫和Libuv庫開發者以及相關粉絲們道一個歉,對不起,我錯怪你們了。深深感到自己的無知,是多麼羞愧的事情!! 事情的經過是這樣的。 原先按照公司要求,我在開發Windows版的TCP伺服器時,使用了Libuv庫。正是因為Libuv庫的強大,才讓我們老大推薦使用。我們老大學識淵 ...
  • 作業二:多級菜單 (1)三級菜單 (2)可以次選擇進入各子菜單 (3)所需新知識點:列表、字典 要求:輸入back返回上一層,輸入quit退出整個程式 思路: (1)首先定義好三級菜單字典; (2)提取第一級省的編號,列印包含哪些省份,讓用戶輸入省份的編號,能夠顯示對應的省,這個過程需要創建一個字典 ...
  • 今天我做JUnit關於MySQL測試時發現,類似於assertNull(tu)之類的代碼不知道什麼意思,因此稍微總結如下。 org.springframework.util.AssertAssert翻譯為中文為"斷言".大概來說,就是斷定某一個實際的值就為自己預期想得到的,如果不一樣就拋出異常. s ...
  • 環境配置1:安裝mysql,環境變數添加mysql的bin目錄 環境配置2:python安裝MySQL-Python 請根據自身操作系統下載安裝,否則會報c ++ compile 9.0,import _mysql等錯誤 windows10 64位操作系統可到 http://www.lfd.uci. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...