hibernate一


layout: post
title: hibernate
subtitle: 用法
date: 2018-05-08
author: ZL
header-img: img/20180508.jpg
catalog: true
tags:
- hibernate


介紹

hibernate是一個(gè)關(guān)于數(shù)據(jù)庫的框架。

好處

完全面向?qū)ο蟛僮鲾?shù)據(jù)庫
操作數(shù)據(jù)庫的時(shí)候,可以以面向?qū)ο蟮姆绞絹硗瓿?不需要書寫SQL語句


搭建demo

步驟

  1. 下載hibernate
    https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
    下載解壓后有l(wèi)ib文件夾泛烙,下面有required文件夾埃脏,里面有必須的jar包。

  2. 創(chuàng)建一個(gè)數(shù)據(jù)庫


    image
  3. 新建javaweb項(xiàng)目并導(dǎo)包


    image

    image
  4. 創(chuàng)建一個(gè)bean類,用于保存數(shù)據(jù)

    數(shù)據(jù)庫有什么字段,就創(chuàng)建對(duì)應(yīng)的變量鲁沥,然后添加set堤魁,get方法。

    package domain;
    
    public class Customer {
    
     private Long cust_id;
    
     private String cust_name;
     private String cust_source;
     private String cust_industry;
     private String cust_level;
     private String cust_linkman;
     private String cust_phone;
     private String cust_mobile;
     public Long getCust_id() {
       return cust_id;
     }
     public void setCust_id(Long cust_id) {
       this.cust_id = cust_id;
     }
     public String getCust_name() {
       return cust_name;
     }
     public void setCust_name(String cust_name) {
       this.cust_name = cust_name;
     }
     public String getCust_source() {
       return cust_source;
     }
     public void setCust_source(String cust_source) {
       this.cust_source = cust_source;
     }
     public String getCust_industry() {
       return cust_industry;
     }
     public void setCust_industry(String cust_industry) {
       this.cust_industry = cust_industry;
     }
     public String getCust_level() {
       return cust_level;
     }
     public void setCust_level(String cust_level) {
       this.cust_level = cust_level;
     }
     public String getCust_linkman() {
       return cust_linkman;
     }
     public void setCust_linkman(String cust_linkman) {
       this.cust_linkman = cust_linkman;
     }
     public String getCust_phone() {
       return cust_phone;
     }
     public void setCust_phone(String cust_phone) {
       this.cust_phone = cust_phone;
     }
     public String getCust_mobile() {
       return cust_mobile;
     }
     public void setCust_mobile(String cust_mobile) {
       this.cust_mobile = cust_mobile;
     }
     @Override
     public String toString() {
       return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]";
     }
    }
    
    
  5. 在bean類customer的統(tǒng)計(jì)目錄下铐姚,創(chuàng)建Customer.hbm.xml

    這個(gè)文件的作用是一個(gè)映射的作用策肝,將數(shù)據(jù)庫中的內(nèi)容和bean類customer對(duì)應(yīng)起來。

    <?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">
        <!-- 這部分是約束內(nèi)容 -->
    
    
    
       <!-- 配置表與實(shí)體對(duì)象的關(guān)系 -->
       <!-- package屬性:填寫一個(gè)包名.在元素內(nèi)部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. -->
    <hibernate-mapping package="domain" >
    
    
        <!--
            class元素: 配置實(shí)體與表的對(duì)應(yīng)關(guān)系的
                name: 完整類名
                table:數(shù)據(jù)庫表名
         -->
        <class name="Customer" table="cst_customer" >
    
    
    
            <!-- id元素:配置主鍵映射的屬性
                    name: 填寫主鍵對(duì)應(yīng)屬性名
                    column(可選): 填寫表中的主鍵列名.默認(rèn)值:列名會(huì)默認(rèn)使用屬性名
                    type(可選):填寫列(屬性)的類型.hibernate會(huì)自動(dòng)檢測實(shí)體的屬性類型.
                            每個(gè)類型有三種填法: java類型|hibernate類型|數(shù)據(jù)庫類型
                    not-null(可選):配置該屬性(列)是否不能為空. 默認(rèn)值:false
                    length(可選):配置數(shù)據(jù)庫中列的長度. 默認(rèn)值:使用數(shù)據(jù)庫類型的最大長度
             -->
            <id name="cust_id"  >
                <!-- generator:主鍵生成策略
                后面介紹生成策略
         -->
                <generator class="native"></generator>
            </id>
    
    
    
    
            <!-- property元素:除id之外的普通屬性映射
                    name: 填寫屬性名
                    column(可選): 填寫列名
                    type(可選):填寫列(屬性)的類型.hibernate會(huì)自動(dòng)檢測實(shí)體的屬性類型.
                            每個(gè)類型有三種填法: java類型|hibernate類型|數(shù)據(jù)庫類型
                    not-null(可選):配置該屬性(列)是否不能為空. 默認(rèn)值:false
                    length(可選):配置數(shù)據(jù)庫中列的長度. 默認(rèn)值:使用數(shù)據(jù)庫類型的最大長度
             -->
            <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>
    
  6. 書寫主配置文件

    在src目錄下創(chuàng)建hibernate.cfg.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>
    
             <!-- 數(shù)據(jù)庫驅(qū)動(dòng) -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
             <!-- 數(shù)據(jù)庫url -->
            <property name="hibernate.connection.url">jdbc:mysql:///test01</property>
             <!-- 數(shù)據(jù)庫連接用戶名 -->
            <property name="hibernate.connection.username">root</property>
             <!-- 數(shù)據(jù)庫連接密碼 -->
            <property name="hibernate.connection.password">123456</property>
    
    
    
            <!-- 數(shù)據(jù)庫方言
                不同的數(shù)據(jù)庫中,sql語法略有區(qū)別. 指定方言可以讓hibernate框架在生成sql語句時(shí).針對(duì)數(shù)據(jù)庫的方言生成.
                sql99標(biāo)準(zhǔn): DDL 定義語言  庫表的增刪改查
                          DCL 控制語言  事務(wù) 權(quán)限
                          DML 操縱語言  增刪改查
                注意: MYSQL在選擇方言時(shí),請(qǐng)選擇最短的方言.
             -->
    
            <!--
            #hibernate.dialect org.hibernate.dialect.MySQLDialect
            #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
            #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
             -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
    
    
    
            <!-- 將hibernate生成的sql語句打印到控制臺(tái) -->
            <property name="hibernate.show_sql">true</property>
            <!-- 將hibernate生成的sql語句格式化(語法縮進(jìn)) -->
            <property name="hibernate.format_sql">true</property>
    
    
    
            <!--
            ## auto schema export  自動(dòng)導(dǎo)出表結(jié)構(gòu). 自動(dòng)建表
            #hibernate.hbm2ddl.auto create      自動(dòng)建表.每次框架運(yùn)行都會(huì)創(chuàng)建新的表.以前表將會(huì)被覆蓋,表數(shù)據(jù)會(huì)丟失.(開發(fā)環(huán)境中測試使用)
            #hibernate.hbm2ddl.auto create-drop 自動(dòng)建表.每次框架運(yùn)行結(jié)束都會(huì)將所有表刪除.(開發(fā)環(huán)境中測試使用)
            #hibernate.hbm2ddl.auto update(推薦使用) 自動(dòng)生成表.如果已經(jīng)存在不會(huì)再生成.如果表有變動(dòng).自動(dòng)更新表(不會(huì)刪除任何數(shù)據(jù)).
            #hibernate.hbm2ddl.auto validate    校驗(yàn).不自動(dòng)生成表.每次啟動(dòng)會(huì)校驗(yàn)數(shù)據(jù)庫中表是否正確.校驗(yàn)失敗.
             -->
            <property name="hibernate.hbm2ddl.auto">update</property>
    
    
    
            <!-- 引入orm元數(shù)據(jù)
                路徑書寫: 填寫src下的路徑
             -->
            <mapping resource="domain/Customer.hbm.xml" />
    
        </session-factory>
    </hibernate-configuration>
    
  1. 代碼測試(往數(shù)據(jù)庫中插入一條數(shù)據(jù))
    package domain;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import domain.Customer;
    
    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();
        }
    }
    
    

注意

如果本地配置的是java9隐绵,那么需要在額外導(dǎo)入幾個(gè)包之众。這幾個(gè)包新版本java9沒有。


image

hibernate的API介紹

示例:

//事務(wù)操作
public void fun1(){
  //1 創(chuàng)建,調(diào)用空參構(gòu)造
  Configuration conf = new Configuration().configure();
  //2 根據(jù)配置信息,創(chuàng)建 SessionFactory對(duì)象
  SessionFactory sf = conf.buildSessionFactory();
  //3 獲得session
  Session session = sf.openSession();
  //4 session獲得操作事務(wù)的Transaction對(duì)象
  //開啟事務(wù)并獲得操作事務(wù)的tx對(duì)象(建議使用)
  Transaction tx2 = session.beginTransaction();
  //----------------------------------------------
  增刪改查操作
  //----------------------------------------------
  tx2.commit();//提交事務(wù)
  tx2.rollback();//回滾事務(wù)
  session.close();//釋放資源
  sf.close();//釋放資源
}

Configuration類

兩個(gè)作用:

  • 加載主配置src下的hibernate.cfg.xml文件
    Configuration conf = new Configuration();
        conf.configure();
    
  • 創(chuàng)建 SessionFactory對(duì)象
    SessionFactory sf = conf.buildSessionFactory();

SessionFactory類

作用:
創(chuàng)建session對(duì)象
Session session = sf.openSession();

注意:

  • sessionfactory 負(fù)責(zé)保存和使用所有配置信息.消耗內(nèi)存資源非常大.
  • sessionFactory屬于線程安全的對(duì)象設(shè)計(jì).

所以保證在web項(xiàng)目中,只創(chuàng)建一個(gè)sessionFactory.

Session類

最核心的東西依许,增刪改查都靠它棺禾。

作用:

  • 獲取事物:
    • 方式一:
      Transaction tx = session.getTransaction();
      tx.begin();
      
    • 方式二:
      Transaction tx2 = session.beginTransaction();
  • 增刪改查(這里是最簡單的的增刪改查)

  1. image
  2. 刪(刪除id為1的數(shù)據(jù),第二個(gè)參數(shù)是id峭跳,類型是long)


    image

  3. image

  4. image

Transaction類

作用:事物

獲取方式:

  • 方式一:
    Transaction tx = session.getTransaction();
    tx.begin();
    
  • 方式二:
    Transaction tx2 = session.beginTransaction();

提交:
tx2.commit();//提交事務(wù)

回滾:
tx2.rollback();//回滾事務(wù)


HibernateUtils

增刪改查有一些重復(fù)代碼膘婶,按照J(rèn)ava的一貫作風(fēng),肯定是要封裝的蛀醉。

這里提供一個(gè)封裝的代碼:

package cn.itheima.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static SessionFactory sf;
    
    static{
        //1 創(chuàng)建,調(diào)用空參構(gòu)造
        Configuration conf = new Configuration().configure();
        //2 根據(jù)配置信息,創(chuàng)建 SessionFactory對(duì)象
         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());
    }
    
}

使用:

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

hibernate中的實(shí)體規(guī)則(就是上面的bean類customer的注意事項(xiàng))

  1. 持久化類提供無參數(shù)構(gòu)造(默認(rèn)不寫就是)
  2. 成員變量私有,提供共有g(shù)et/set方法訪問(bean類都這樣子的呀)
  3. 持久化類中的屬性,應(yīng)盡量使用包裝類型(就是說用Double悬襟,Long,Integer而不是double拯刁,long脊岳,int)
  4. 持久化類需要提供oid.與數(shù)據(jù)庫中的主鍵列對(duì)應(yīng)(就是說數(shù)據(jù)庫中的主鍵在bean類中一定要有屬性對(duì)應(yīng),沒有主鍵的數(shù)據(jù)庫不能使用hibernate)
  5. 不要用final修飾class(就是說Customer不要用final修飾)

關(guān)于主鍵

在 Customer.hbm.xml中有配置主鍵生成策略垛玻。

<id name="cust_id"  >
  <!-- generator:主鍵生成策略-->
  <generator class="native"></generator>
</id>

這里為了介紹主鍵生成策略就把主鍵也全部介紹一下逸绎。

主鍵要求

主鍵要求一個(gè)不能為空,必須要有夭谤,二個(gè)主鍵不能重復(fù)棺牧。

主鍵分類

  • 如果一個(gè)表里面有一個(gè)列,他的值就滿足不為空且不重復(fù)朗儒,比如身份證號(hào)碼颊乘,然后就以這個(gè)列為主鍵的話,那么這種主鍵就叫做自然主鍵
  • 多數(shù)時(shí)候會(huì)在表里面創(chuàng)建一個(gè)沒有意義的列醉锄,這個(gè)列滿足主鍵的條件乏悄,以這個(gè)列為主鍵,這種主鍵就叫做代理主鍵

主鍵生成策略(對(duì)代理主鍵而言)

自然主鍵:assigned

這個(gè)是表中的一個(gè)列恳不,具體什么值就錄入什么值檩小。

代理主鍵:(并不需要錄入,自動(dòng)生成烟勋,所以會(huì)有生成策略)

  1. identity :

    主鍵自增.由數(shù)據(jù)庫來維護(hù)主鍵值.錄入時(shí)不需要指定主鍵.

  2. sequence:

    Oracle中的主鍵生成策略.

  3. increment(了解):

    主鍵自增.由hibernate來維護(hù).每次插入前會(huì)先查詢表中id最大值.+1作為新主鍵值.

  4. hilo(了解):

    高低位算法.主鍵自增.由hibernate來維護(hù).開發(fā)時(shí)不使用.

  5. native:

    hilo+sequence+identity 自動(dòng)三選一策略.

  6. uuid:

    產(chǎn)生隨機(jī)字符串作為主鍵. 主鍵類型必須為string 類型.

  7. assigned:

    自然主鍵生成策略(就是沒有策略),hibernate不會(huì)管理主鍵规求,由開發(fā)人員自己錄入筐付。


hibernate中的對(duì)象狀態(tài)

三種狀態(tài)

順勢狀態(tài)

沒有id,沒有在session緩存中,在內(nèi)存中是孤立存在的阻肿,與數(shù)據(jù)庫中的數(shù)據(jù)沒有任何關(guān)聯(lián)瓦戚。

持久化狀態(tài)

有id,在session緩存中

游離|托管狀態(tài)

有id,沒有在session緩存中

這里的有id是指有與數(shù)據(jù)中對(duì)應(yīng)的id,當(dāng)調(diào)用save方法以后就在數(shù)據(jù)庫中有了id

例子

public void fun1(){
        Configuration conf = new Configuration().configure();
        
        SessionFactory sessionFactory = conf.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
    
        Transaction tx = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();//瞬時(shí)狀態(tài)
        c.setCust_name("google公司");
        
        session.save(c);//持久化狀態(tài)丛塌,有id,在session緩存中
        
        //----------------------------------------------
        tx.commit();//游離|托管狀態(tài)
        session.close();
        sessionFactory.close();
    }

三種狀態(tài)的轉(zhuǎn)換

image

hibernate緩存

hibernate會(huì)有緩存的较解,不過這個(gè)理解一下就好,因?yàn)樵趯懘a的時(shí)候并沒有什么不一樣赴邻。

hibernate的一級(jí)緩存的作用就是減少對(duì)數(shù)據(jù)庫的訪問次數(shù)印衔。

hibernate的一級(jí)緩存有如下特點(diǎn):

  1. 當(dāng)應(yīng)用程序調(diào)用Session接口的save()、update()姥敛、saveOrUpdate()時(shí)当编、如果Session緩存中沒有相應(yīng)的對(duì)象,hibernate就會(huì)自動(dòng)的把從數(shù)據(jù)庫中查詢到的相應(yīng)對(duì)象信息加入到一級(jí)緩存中去徒溪。
  2. 當(dāng)調(diào)用Session接口的load()、get()方法以及Query接口的list()金顿、iterator()方法時(shí)臊泌,會(huì)判斷緩存中是否存在該對(duì)象,有則返回揍拆,不會(huì)查詢數(shù)據(jù)庫渠概,如果緩存中沒有要查詢對(duì)象,再去數(shù)據(jù)庫中查詢相應(yīng)對(duì)象嫂拴,并添加到一級(jí)緩存中播揪。
  3. 當(dāng)調(diào)用session的close()方法時(shí),session緩存會(huì)被清空筒狠。
image
image

比如:

Customer c1 = session.get(Customer,1l);
Customer c2 = session.get(Customer,1l);

這兩句代碼實(shí)際上只是查詢了一次數(shù)據(jù)庫猪狈。


hibernate指定事務(wù)的隔離級(jí)別

在數(shù)據(jù)庫的事務(wù)的那篇博客中有關(guān)于數(shù)據(jù)庫的事務(wù)的特性和隔離級(jí)別的介紹,這里就不再多加介紹了辩恼,就介紹一下如何在hibernate中指定數(shù)據(jù)庫的隔離級(jí)別

  • read uncommitted : 讀取尚未提交的數(shù)據(jù) :哪個(gè)問題都不能解決
  • read committed:讀取已經(jīng)提交的數(shù)據(jù) :可以解決臟讀 ---- oracle默認(rèn)的
  • repeatable read:重復(fù)讀裙兔怼:可以解決臟讀 和 不可重復(fù)讀 ---mysql默認(rèn)的
  • serializable:串行化:可以解決 臟讀 不可重復(fù)讀 和 虛讀---相當(dāng)于鎖表

在hibernate.cfg.xml中

image


在項(xiàng)目中確保使用同一個(gè)Session的例子:

在hibernate中,確保使用同一個(gè)session的問題,hibernate已經(jīng)幫我們解決了. 我們開發(fā)人員只需要調(diào)用sf.getCurrentSession()方法即可獲得與當(dāng)前線程綁定的session對(duì)象

注意:調(diào)用getCurrentSession方法必須配合主配置中的一段配置

image

注意2:通過getCurrentSession方法獲得的session對(duì)象.當(dāng)事務(wù)提交時(shí),session會(huì)自動(dòng)關(guān)閉.不要手動(dòng)調(diào)用close關(guān)閉.

service層:

image

dao層:

image


hibernate中的批量查詢(概述)

HQL: 多表查詢,但不復(fù)雜時(shí)使用
criteria:單表?xiàng)l件查詢
原生SQL:復(fù)雜業(yè)務(wù)查詢

HQL查詢

Hibernate獨(dú)家查詢語言,屬于面向?qū)ο蟮牟樵冋Z言

  1. 基本查詢(查詢所有記錄)

    //基本查詢
    public void fun1(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1> 書寫HQL語句
    //      String hql = " from cn.itheima.domain.Customer ";
      String hql = " from Customer "; // 查詢所有Customer對(duì)象
      //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象
      Query query = session.createQuery(hql);
      //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果
      List<Customer> list = query.list();   // 返回list結(jié)果
      //query.uniqueResult();//接收唯一的查詢結(jié)果
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

    如果查詢的結(jié)果只有一個(gè):query.uniqueResult();

    如果查詢的結(jié)果是一個(gè)集合:query.list();

  1. 條件查詢1.0

    public void fun2(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1> 書寫HQL語句
      String hql = " from Customer where cust_id = 1 ";
      //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象
      Query query = session.createQuery(hql);
      //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果
      Customer c = (Customer) query.uniqueResult();
      
      System.out.println(c);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

    from Customer where cust_id = 1中的cust_id是Customer類中的屬性的名字灶伊,而不是數(shù)據(jù)庫中cust_id字段的名字疆前。HQL語句中,不可能出現(xiàn)任何數(shù)據(jù)庫相關(guān)的信息的

  2. 條件查詢2.0(問號(hào)占位符)

    public void fun3(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1> 書寫HQL語句
      String hql = " from Customer where cust_id = ? "; 
      //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象
      Query query = session.createQuery(hql);
      //設(shè)置參數(shù)
      //query.setLong(0, 1l);
      query.setParameter(0, 1l);
      //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果
      Customer c = (Customer) query.uniqueResult();
      
      System.out.println(c);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

    設(shè)置參數(shù)的兩種寫法:

    • query.setLong、setboolean聘萨、setDouble等等竹椒,根據(jù)問號(hào)占位符的數(shù)據(jù)類型而選擇,參數(shù)1:第幾個(gè)問號(hào)米辐,從0開始計(jì)數(shù)胸完;參數(shù)二:該問號(hào)處的值书释。
    • query.setParameter(0, 1l);這種不用區(qū)分問號(hào)占位符的數(shù)據(jù)類型了,參數(shù)1:第幾個(gè)問號(hào)舶吗,從0開始計(jì)數(shù)征冷;參數(shù)二:該問號(hào)處的值。
  1. 條件查詢3.0(命令占位符)

    public void fun4(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1> 書寫HQL語句
      String hql = " from Customer where cust_id = :aaa and cust_name = :bbb"; 
      //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象
      Query query = session.createQuery(hql);
      //設(shè)置參數(shù)
      query.setParameter("aaa", 1l);
      query.setParameter("bbb", "張三");
      //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果
      Customer c = (Customer) query.uniqueResult();
      
      System.out.println(c);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

    用aaa誓琼,bbb取代了問號(hào)占位符检激,這樣在設(shè)置參數(shù)時(shí)就不用去數(shù)第幾個(gè)問號(hào)了。

  2. 分頁查詢

    public void fun5(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1> 書寫HQL語句
      String hql = " from Customer  ";
      //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象
      Query query = session.createQuery(hql);
      //設(shè)置分頁信息 limit ?,?
      query.setFirstResult(1);
      query.setMaxResults(1);
      //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果
      List<Customer> list =  query.list();
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

    query.setFirstResult(1);從第幾條記錄開始查詢腹侣,默認(rèn)0叔收;
    query.setMaxResults(1);查詢幾條數(shù)據(jù)。
    這兩個(gè)方法對(duì)應(yīng)了sql語句中l(wèi)imit ?,?的兩個(gè)問號(hào)傲隶。

Hibernate無語句面向?qū)ο蟛樵?/h2>
  1. 基本查詢(查詢所有)

    public void fun1(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      
      //查詢所有的Customer對(duì)象
      Criteria criteria = session.createCriteria(Customer.class);
      
      List<Customer> list = criteria.list();
      
      System.out.println(list);
      
    //Customer c = (Customer) criteria.uniqueResult();
      
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
  2. 條件查詢

    public void fun2(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //創(chuàng)建criteria查詢對(duì)象
      Criteria criteria = session.createCriteria(Customer.class);
      //添加查詢參數(shù) => 查詢cust_id為1的Customer對(duì)象
      criteria.add(Restrictions.eq("cust_id", 1l));
      //執(zhí)行查詢獲得結(jié)果
      Customer c = (Customer) criteria.uniqueResult();
      System.out.println(c);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
    sql條件 Restrictions.xx
    > gt
    >= ge
    < lt
    <= le
    == eq
    != ne
    in in
    between and between
    like like
    is not null isNotNull
    is null isNull
    or or
    and and
  1. 分頁查詢

    public void fun3(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //創(chuàng)建criteria查詢對(duì)象
      Criteria criteria = session.createCriteria(Customer.class);
      //設(shè)置分頁信息 limit ?,?
      criteria.setFirstResult(1);
      criteria.setMaxResults(2);
      //執(zhí)行查詢
      List<Customer> list = criteria.list();
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
  2. 查詢總記錄數(shù)

    public void fun4(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //創(chuàng)建criteria查詢對(duì)象
      Criteria criteria = session.createCriteria(Customer.class);
      //設(shè)置查詢的聚合函數(shù) => 總行數(shù)
      criteria.setProjection(Projections.rowCount());
      //執(zhí)行查詢
      Long count = (Long) criteria.uniqueResult();
      
      System.out.println(count);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    

原生SQL查詢

  1. 基本查詢(查詢所有)

    public void fun2(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1 書寫sql語句
      String sql = "select * from cst_customer";
      
      //2 創(chuàng)建sql查詢對(duì)象
      SQLQuery query = session.createSQLQuery(sql);
      //指定將結(jié)果集封裝到哪個(gè)對(duì)象中
      query.addEntity(Customer.class);
      
      //3 調(diào)用方法查詢結(jié)果
      List<Customer> list = query.list();
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
  2. 條件查詢

    public void fun3(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1 書寫sql語句
      String sql = "select * from cst_customer where cust_id = ? ";
      
      //2 創(chuàng)建sql查詢對(duì)象
      SQLQuery query = session.createSQLQuery(sql);
      
      query.setParameter(0, 1l);
      //指定將結(jié)果集封裝到哪個(gè)對(duì)象中
      query.addEntity(Customer.class);
      
      //3 調(diào)用方法查詢結(jié)果
      List<Customer> list = query.list();
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
  3. 分頁查詢

    public void fun4(){
      //1 獲得session
      Session session = HibernateUtils.openSession();
      //2 控制事務(wù)
      Transaction tx = session.beginTransaction();
      //3執(zhí)行操作
      //-------------------------------------------
      //1 書寫sql語句
      String sql = "select * from cst_customer  limit ?,? ";
      
      //2 創(chuàng)建sql查詢對(duì)象
      SQLQuery query = session.createSQLQuery(sql);
      
      query.setParameter(0, 0);
      query.setParameter(1, 1);
      //指定將結(jié)果集封裝到哪個(gè)對(duì)象中
      query.addEntity(Customer.class);
      
      //3 調(diào)用方法查詢結(jié)果
      List<Customer> list = query.list();
      
      System.out.println(list);
      //-------------------------------------------
      //4提交事務(wù).關(guān)閉資源
      tx.commit();
      session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饺律,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跺株,更是在濱河造成了極大的恐慌复濒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒省,死亡現(xiàn)場離奇詭異巧颈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)袖扛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門砸泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛆封,你說我怎么就攤上這事唇礁。” “怎么了惨篱?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盏筐,是天一觀的道長。 經(jīng)常有香客問我砸讳,道長机断,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任绣夺,我火速辦了婚禮吏奸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陶耍。我一直安慰自己奋蔚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泊碑,像睡著了一般坤按。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馒过,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天臭脓,我揣著相機(jī)與錄音,去河邊找鬼腹忽。 笑死来累,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窘奏。 我是一名探鬼主播嘹锁,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼着裹!你這毒婦竟也來了领猾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤骇扇,失蹤者是張志新(化名)和其女友劉穎摔竿,沒想到半個(gè)月后诬留,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锈候,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年涨醋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韭山。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冷溃,死狀恐怖钱磅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情似枕,我是刑警寧澤盖淡,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凿歼,受9級(jí)特大地震影響褪迟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜答憔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一味赃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虐拓,春花似錦心俗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揪利。三九已至,卻和暖如春狠持,著一層夾襖步出監(jiān)牢的瞬間疟位,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工喘垂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甜刻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓王污,卻偏偏與公主長得像罢吃,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昭齐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Heibernate概述 Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射(ORM)框架尿招,它對(duì)JDBC進(jìn)行了非常輕...
    文藝程序風(fēng)閱讀 695評(píng)論 0 1
  • 本文包括:1、Hibernate 的查詢方式2阱驾、HQL (Hibernate Query Language) 查詢...
    廖少少閱讀 2,658評(píng)論 0 15
  • 本文包括:1就谜、Hibernate的持久化類2、Hibernate 持久化對(duì)象的三個(gè)狀態(tài)(難點(diǎn))3里覆、Hibernat...
    廖少少閱讀 1,451評(píng)論 0 13
  • 目錄 1. Hibernate框架的概述 1.1 Hibernate簡介 1.2 為什么要學(xué)習(xí)Hibernate ...
    深海魚Q閱讀 1,023評(píng)論 0 14
  • 時(shí)不時(shí)會(huì)被人好奇為什么不結(jié)婚丧荐,口氣各異。有妄自揣測型的:“不結(jié)婚老了好孤單的喧枷『缤常”,有十萬個(gè)為什么型的:“你為什么...
    TamaraQ閱讀 883評(píng)論 1 3