Hibernate教程 ---簡單易懂


1 web內容回顧

1javaee三層結構

2mvc思想

2 hibernate概述

3 hibernate入門案例

4 hibernate配置文件

5 hibernateapi使用

Hibernate概述

什么是hibernate框架(重點)

1 hibernate框架應用在javaee三層結構中 dao層框架

2 dao層里面做對數據庫crud操作,使用hibernate實現crud操作,hibernate底層代碼就是jdbchibernatejdbc進行封裝,使用hibernate好處,不需要寫復雜jdbc代碼了,

不需要寫sql語句實現

3 hibernate開源的輕量級的框架

4 hibernate版本

Hibernate3.x

Hibernate4.x

Hibernate5.x(學習)

 

什么是orm思想(重點)

1 hibernate使用orm思想對數據庫進行crud操作

2 web階段學習 javabean,更正確的叫法 實體類

3 ormobject relational mapping,對象關系映射

文字描述:

1)讓實體類和數據庫表進行一一對應關系

讓實體類首先和數據庫表對應

讓實體類屬性 表里面字段對應

2)不需要直接操作數據庫表,而操作表對應實體類對象

 

畫圖描述

 

 

 

 

 

 

Hibernate入門

搭建hibernate環境(重點)

第一步 導入hibernatejar

 

 

 

 

 

 因為使用hibernate時候,有日志信息輸出,hibernate本身沒有日志輸出的jar包,導入其他日志的jar

不要忘記還有mysql驅動的jar

 

 

 

 

 

 第二步創建實體類

package cn.itcast.entity;

public class User {

    /*hibernate要求實體類有一個屬性唯一的*/
//    private int uid;
    
    private String uid;
    private String username;
    private String password;
    private String address;
//    public int getUid() {
//        return uid;
//    }
//    public void setUid(int uid) {
//        this.uid = uid;
//    }
    
    public String getUsername() {
        return username;
    }
    public String getUid() {
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

 

 

 

 1)使用hibernate時候,不需要自己手動創建表,hibernate幫把表創建

 

第三步 配置實體類和數據庫表一一對應關系(映射關系)

使用配置文件實現映射關系

1)創建xml格式的配置文件

- 映射配置文件名稱和位置沒有固定要求

- 建議:在實體類所在包里面創建,實體類名稱.hbm.xml

2)配置是是xml格式,在配置文件中首先引入xml約束

- 學過約束dtdschema,在hibernate里面引入的約束dtd約束

 

 

 

 

 

 3)配置映射關系

 

<hibernate-mapping>
    <!-- 1 配置類和表對應 
        class標簽
        name屬性:實體類全路徑
        table屬性:數據庫表名稱
    -->
    <class name="cn.itcast.entity.User" table="t_user">
        <!-- 2 配置實體類id和表id對應 
            hibernate要求實體類有一個屬性唯一值
            hibernate要求表有字段作為唯一值
        -->
        <!-- id標簽
            name屬性:實體類里面id屬性名稱
            column屬性:生成的表字段名稱
         -->
        <id name="uid" column="uid">
            <!-- 設置數據庫表id增長策略 
                native:生成表id值就是主鍵自動增長
            -->
            <generator class="native"></generator>
        </id>
        <!-- 配置其他屬性和表字段對應 
            name屬性:實體類屬性名稱
            column屬性:生成表字段名稱
        -->
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
    </class>
</hibernate-mapping>

 

第四步 創建hibernate的核心配置文件

1)核心配置文件格式xml,但是核心配置文件名稱和位置固定的

- 位置:必須src下面

- 名稱:必須hibernate.cfg.xml

 

 

 2)引入dtd約束

 

 

 

 3hibernate操作過程中,只會加載核心配置文件,其他配置文件不會加載

第一部分: 配置數據庫信息 必須的

 

 

 

 第二部分:配置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>
    <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>
        
        <!-- 第二部分: 配置hibernate信息  可選的-->
        <!-- 輸出底層sql語句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 輸出底層sql語句格式 -->
        <property name="hibernate.format_sql">true</property>
        <!-- hibernate幫創建表,需要配置之后 
            update: 如果已經有表,更新,如果沒有,創建
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 配置數據庫方言
            在mysql里面實現分頁 關鍵字 limit,只能使用mysql里面
            在oracle數據庫,實現分頁rownum
            讓hibernate框架識別不同數據庫的自己特有的語句
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!-- 第三部分: 把映射文件放到核心配置文件中 必須的-->
        <mapping resource="cn/itcast/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

 

實現添加操作

第一步 加載hibernate核心配置文件

第二步 創建SessionFactory對象

第三步 使用SessionFactory創建session對象

第四步 開啟事務

第五步 寫具體邏輯 crud操作

第六步 提交事務

第七步 關閉資源

@Test
    public void testAdd() {
//        第一步 加載hibernate核心配置文件
        // 到src下面找到名稱是hibernate.cfg.xml
        //在hibernate里面封裝對象
        Configuration cfg = new Configuration();
        cfg.configure();
        
//        第二步 創建SessionFactory對象
        //讀取hibernate核心配置文件內容,創建sessionFactory
        //在過程中,根據映射關系,在配置數據庫里面把表創建
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        
//        第三步 使用SessionFactory創建session對象
        // 類似於連接
        Session session = sessionFactory.openSession();
        
//        第四步 開啟事務
        Transaction tx = session.beginTransaction();

//        第五步 寫具體邏輯 crud操作
        //添加功能
        User user = new User();
        user.setUsername("小王");
        user.setPassword("250");
        user.setAddress("日本");
        //調用session的方法實現添加
        session.save(user);
        
//        第六步 提交事務
        tx.commit();

//        第七步 關閉資源
        session.close();
        sessionFactory.close();
    }

 

內容目錄

1 實體類編寫規則

2 hibernate主鍵生成策略

1native

2uuid

3 實體類操作

1crud操作

2)實體類對象狀態

4 hibernate的一級緩存

5 hibernate的事務操作

1)事務代碼規范寫法

6 hibernate其他的api(查詢)

1Query

2Criteria

3SQLQuery

 

實體類編寫規則

1 實體類里面屬性私有的

2 私有屬性使用公開的setget方法操作

3 要求實體類有屬性作為唯一值(一般使用id值)

4 實體類屬性建議不使用基本數據類型,使用基本數據類型對應的包裝類

1)八個基本數據類型對應的包裝類

- int  Integer

- charCharacter

- 其他的都是首字母大寫 比如 double  Double

2)比如 表示學生的分數,假如 int score;

- 比如學生得了0分 ,int score = 0;

- 如果表示學生沒有參加考試,int score = 0;不能准確表示學生是否參加考試

解決:使用包裝類可以了, Integer score = 0,表示學生得了0分,

表示學生沒有參加考試,Integer score = null;

Hibernate主鍵生成策略

1 hibernate要求實體類里面有一個屬性作為唯一值,對應表主鍵,主鍵可以不同生成策略

2 hibernate主鍵生成策略有很多的值

 

 

 3 class屬性里面有很多值

1native: 根據使用的數據庫幫選擇哪個值

2uuid:之前web階段寫代碼生成uuid值,hibernate幫我們生成uuid

實體類操作

對實體類crud操作

添加操作

1 調用session里面的save方法實現

 

 

 根據id查詢

1 調用session里面的get方法實現

 

 

 修改操作

1 首先查詢,修改值

1)根據id查詢,返回對象

 

 

 刪除操作

1 調用session里面delete方法實現

 

 

 

實體類對象狀態(概念)

1 實體類狀態有三種

1)瞬時態:對象里面沒有id值,對象與session沒有關聯

 

 

 2)持久態:對象里面有id值,對象與session關聯

 

 

 3)托管態:對象有id值,對象與session沒有關聯

 

 

 2 演示操作實體類對象的方法

1saveOrUpdate方法:實現添加、實現修改

Hibernate的一級緩存

什么是緩存

1 數據存到數據庫里面,數據庫本身是文件系統,使用流方式操作文件效率不是很高。

1)把數據存到內存里面,不需要使用流方式,可以直接讀取內存中數據

2)把數據放到內存中,提供讀取效率

Hibernate緩存

1 hibernate框架中提供很多優化方式,hibernate的緩存就是一個優化方式

2 hibernate緩存特點:

第一類 hibernate的一級緩存

1hibernate的一級緩存默認打開的

2hibernate的一級緩存使用范圍,是session范圍,從session創建到session關閉范圍

3hibernate的一級緩存中,存儲數據必須 持久態數據

第二類 hibernate的二級緩存

1)目前已經不使用了,替代技術 redis

2)二級緩存默認不是打開的,需要配置

3)二級緩存使用范圍,是sessionFactory范圍

驗證一級緩存存在

1 驗證方式

1)首先根據uid=1查詢,返回對象

2)其次再根據uid=1查詢,返回對象

 

 

 第一步執行get方法之后,發送sql語句查詢數據庫

第二個執行get方法之后,沒有發送sql語句,查詢一級緩存內容

Hibernate一級緩存執行過程

 

 

Hibernate一級緩存特性

1 持久態自動更新數據庫

Hibernate事務操作

事務相關概念

1 什么是事務

2 事務特性

3 不考慮隔離性產生問題

1)臟讀

2)不可重復讀

3)虛讀

4 設置事務隔離級別

1mysql默認隔離級別 repeatable read

Hibernate事務代碼規范寫法

1 代碼結構

try {

  開啟事務

  提交事務

}catch() {

  回滾事務

}finally {

  關閉

}

@Test
    public void testTx() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            //開啟事務
            tx = session.beginTransaction();
            
            //添加
            User user = new User();
            user.setUsername("小馬");
            user.setPassword("250");
            user.setAddress("美國");
            
            session.save(user);
            
            int i = 10/0;
            //提交事務
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            //回滾事務
            tx.rollback();
        }finally {
            //關閉操作
            session.close();
            sessionFactory.close();
        }
    }

Hibernate綁定session

 session類似於jdbcconnection,之前web階段學過 ThreadLocal

2 幫實現與本地線程綁定session

3 獲取與本地線程session

1)在hibernate核心配置文件中配置

 

 

 2)調用sessionFactory里面的方法得到

 

 

 

 

 4 獲取與本地線程綁定session時候,關閉session報錯,不需要手動關閉了

 

 

 

 

Hibernateapi使用

Query對象

1 使用query對象,不需要寫sql語句,但是寫hql語句

1hqlhibernate query languagehibernate提供查詢語言,這個hql語句和普通sql語句很相似

2hqlsql語句區別:

- 使用sql操作表和表字段

- 使用hql操作實體類和屬性

2 查詢所有hql語句:

1from 實體類名稱

3 Query對象使用

1)創建Query對象

2)調用query對象里面的方法得到結果

 

 

 

 

Criteria對象

1 使用這個對象查詢操作,但是使用這個對象時候,不需要寫語句,直接調用方法實現

2 實現過程

1)創建criteria對象

2)調用對象里面的方法得到結果

 

 

 

SQLQuery對象

1 使用hibernate時候,調用底層sql實現

2 實現過程

1)創建對象

2)調用對象的方法得到結果

 

 

 

 返回list集合每部分是數組

 

 

 返回list中每部分是對象形式

 

 

 

 

 

 

1 表與表之間關系回顧

1)一對多(客戶和聯系人)

2)多對多(用戶和角色)

2 hibernate一對多操作

1)一對多映射配置

2)一對多級聯保存

3)一對多級聯刪除

4inverse屬性

3 hibernate多對多操作

1)多對多映射配置

2)多對多級聯保存(重點)

3)多對多級聯刪除

4)維護第三張表

 

客戶列表功能

1 sessionFactory已經關閉了,不需要關閉

 

 

 

 

 

 2 dao里面代碼

 

//使用hibernate實現查詢列表
    public List<Customer> findAll() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //開啟事務
            tx = session.beginTransaction();
            
            //查詢所有記錄
            Criteria criteria = session.createCriteria(Customer.class);
            List<Customer> list = criteria.list();
            
            //提交事務
            tx.commit();
            return list;
        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要關閉
//            sessionFactory.close();
        }
        return null;
    }

 

表與表之間關系回顧(重點)

1 一對多

1)分類和商品關系,一個分類里面有多個商品,一個商品只能屬於一個分類

2)客戶和聯系人是一對多關系

- 客戶:與公司有業務往來,百度、新浪、360

- 聯系人:公司里面的員工,百度里面有很多員工,聯系員工

** 公司和公司員工的關系

- 客戶是一,聯系人是多

- 一個客戶里面有多個聯系人,一個聯系人只能屬於一個客戶

3)一對多建表:通過外鍵建立關系

 

 

 2 多對多

1)訂單和商品關系,一個訂單里面有多個商品,一個商品屬於多個訂單

2)用戶和角色多對多關系

- 用戶: 小王、小馬、小宋

- 角色:總經理、秘書、司機、保安

** 比如小王 可以 是總經理,可以是司機

** 比如小宋 可以是司機,可以是秘書,可以保安

** 比如小馬 可以是 秘書,可以是總經理

一個用戶里面可以有多個角色,一個角色里面可以有多個用戶

3)多對多建表:創建第三張表維護關系

 

 

 3 一對一

1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫

Hibernate的一對多操作(重點)

一對多映射配置(重點)

以客戶和聯系人為例:客戶是一,聯系人是多

第一步 創建兩個實體類,客戶和聯系人

第二步 讓兩個實體類之間互相表示

1)在客戶實體類里面表示多個聯系人

- 一個客戶里面有多個聯系人

 

 

 2)在聯系人實體類里面表示所屬客戶

- 一個聯系人只能屬於一個客戶

 

 

 第三步配置映射關系

1)一般一個實體類對應一個映射文件

2)把映射最基本配置完成

3)在映射文件中,配置一對多關系

- 在客戶映射文件中,表示所有聯系人

 

 

 - 在聯系人映射文件中,表示所屬客戶

 

 

 第四步創建核心配置文件,把映射文件引入到核心配置文件中

 

 

 

一對多級聯操作

級聯操作

1 級聯保存

1)添加一個客戶,為這個客戶添加多個聯系人

2 級聯刪除

1)刪除某一個客戶,這個客戶里面的所有的聯系人也刪除

一對多級聯保存

1 添加客戶,為這個客戶添加一個聯系人

1)復雜寫法:

 

//演示一對多級聯保存
    @Test
    public void testAddDemo1() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //開啟事務
            tx = session.beginTransaction();
            
            // 添加一個客戶,為這個客戶添加一個聯系人
            //1 創建客戶和聯系人對象
            Customer customer = new Customer();
            customer.setCustName("傳智播客");
            customer.setCustLevel("vip");
            customer.setCustSource("網絡");
            customer.setCustPhone("110");
            customer.setCustMobile("999");
            
            LinkMan linkman = new LinkMan();
            linkman.setLkm_name("lucy");
            linkman.setLkm_gender("男");
            linkman.setLkm_phone("911");
            
            //2 在客戶表示所有聯系人,在聯系人表示客戶        
            // 建立客戶對象和聯系人對象關系
            //2.1 把聯系人對象 放到客戶對象的set集合里面
            customer.getSetLinkMan().add(linkman);
            //2.2 把客戶對象放到聯系人里面
            linkman.setCustomer(customer);
            
            //3 保存到數據庫
            session.save(customer);
            session.save(linkman);
            
            //提交事務
            tx.commit();

        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要關閉
            sessionFactory.close();
        }
    }

 

2)簡化寫法

- 一般根據客戶添加聯系人

第一步 在客戶映射文件中進行配置

- 在客戶映射文件里面set標簽進行配置

 

 

 第二步創建客戶和聯系人對象,只需要把聯系人放到客戶里面就可以了,最終只需要保存客戶就可以了

 

//演示一對多級聯保存
    @Test
    public void testAddDemo2() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //開啟事務
            tx = session.beginTransaction();
            // 添加一個客戶,為這個客戶添加一個聯系人
            //1 創建客戶和聯系人對象
            Customer customer = new Customer();
            customer.setCustName("百度");
            customer.setCustLevel("普通客戶");
            customer.setCustSource("網絡");
            customer.setCustPhone("110");
            customer.setCustMobile("999");
        
            LinkMan linkman = new LinkMan();
            linkman.setLkm_name("小宏");
            linkman.setLkm_gender("男");
            linkman.setLkm_phone("911");
            //2 把聯系人放到客戶里面
            customer.getSetLinkMan().add(linkman);
            //3 保存客戶
            session.save(customer);
            
            //提交事務
            tx.commit();
        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要關閉
            sessionFactory.close();
        }
    }

 

一對多級聯刪除

1 刪除某個客戶,把客戶里面所有的聯系人刪除

2 具體實現

第一步 在客戶映射文件set標簽,進行配置

1)使用屬性cascade屬性值 delete

 

 

 第二步在代碼中直接刪除客戶

1)根據id查詢對象,調用session里面delete方法刪除

 

 

 

一對多修改操作(inverse屬性)

 

 

 2 inverse屬性

1)因為hibernate雙向維護外鍵,在客戶和聯系人里面都需要維護外鍵,修改客戶時候修改一次外鍵,修改聯系人時候也修改一次外鍵,造成效率問題

2)解決方式:讓其中的一方不維護外鍵

- 一對多里面,讓其中一方放棄外鍵維護

- 一個國家有總統,國家有很多人,總統不能認識國家所有人,國家所有人可以認識總統

3)具體實現:

在放棄關系維護映射文件中,進行配置,在set標簽上使用inverse屬性

 

 

 

Hibernate多對多操作

多對多映射配置

以用戶和角色為例演示

第一步 創建實體類,用戶和角色

第二步 讓兩個實體類之間互相表示

1)一個用戶里面表示所有角色,使用set集合

 

 

 2)一個角色有多個用戶,使用set集合

 

 

 第三步配置映射關系

1)基本配置

2)配置多對多關系

- 在用戶里面表示所有角色,使用set標簽

 

 

 - 在角色里面表示所有用戶,使用set標簽

 

 

 

 

 第四步在核心配置文件中引入映射文件

 

 

 

多對多級聯保存

根據用戶保存角色

第一步 在用戶配置文件中set標簽進行配置,cascadesave-update

 

 

 第二步寫代碼實現

1)創建用戶和角色對象,把角色放到用戶里面,最終保存用戶就可以了

 

//演示多對多修級聯保存
    @Test
    public void testSave() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //開啟事務
            tx = session.beginTransaction();
            
            //添加兩個用戶,為每個用戶添加兩個角色
            //1 創建對象
            User user1 = new User();
            user1.setUser_name("lucy");
            user1.setUser_password("123");
            
            User user2 = new User();
            user2.setUser_name("mary");
            user2.setUser_password("456");
            
            Role r1 = new Role();
            r1.setRole_name("總經理");
            r1.setRole_memo("總經理");
            
            Role r2 = new Role();
            r2.setRole_name("秘書");
            r2.setRole_memo("秘書");
            
            Role r3 = new Role();
            r3.setRole_name("保安");
            r3.setRole_memo("保安");
            
            //2 建立關系,把角色放到用戶里面
            // user1 -- r1/r2
            user1.getSetRole().add(r1);
            user1.getSetRole().add(r2);
            
            // user2 -- r2/r3
            user2.getSetRole().add(r2);
            user2.getSetRole().add(r3);
            
            //3 保存用戶
            session.save(user1);
            session.save(user2);
            
            //提交事務
            tx.commit();

        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要關閉
            sessionFactory.close();
        }
    }

 

多對多級聯刪除(了解)

第一步 set標簽進行配置,cascadedelete

第二步 刪除用戶

 

 

 

 

 

維護第三張表關系

1 用戶和角色多對多關系,維護關系通過第三張表維護

2 讓某個用戶有某個角色

第一步 根據id查詢用戶和角色

第二步 把角色放到用戶里面

1)把角色對象放到用戶set集合

3 讓某個用戶沒有某個角色

第一步 根據id查詢用戶和角色

 

 

 第二步從用戶里面把角色去掉

1)從set集合里面把角色移除

 

Hibernate五種查詢方式

1 對象導航查詢

1)根據id查詢某個客戶,再查詢這個客戶里面所有的聯系人

2 OID查詢

1)根據id查詢某一條記錄,返回對象

3 HQL查詢

1Query對象,寫hql語句實現查詢

4 QBC查詢

1Criteria對象

5 本地sql查詢

1SQLQuery對象,使用普通sql實現查詢

 

對象導航查詢

1 查詢某個客戶里面所有聯系人過程,使用對象導航實現

2 代碼

OID查詢

1 根據id查詢記錄

1)調用session里面的get方法實現

 

 

 HQL查詢

1 hqlhibernate query languagehibernate提供一種查詢語言,hql語言和普通sql很相似,區別:普通sql操作數據庫表和字段,hql操作實體類和屬性

2 常用的hql語句

1)查詢所有: from 實體類名稱

2)條件查詢: from 實體類名稱 where 屬性名稱=?

3)排序查詢: from 實體類名稱 order by 實體類屬性名稱 asc/desc

3 使用hql查詢操作時候,使用Query對象

1)創建Query對象,寫hql語句

2)調用query對象里面的方法得到結果

Query query = session.createQuery(

“from User user where user.group.name=‘zte’”);

 查詢所有

1 查詢所有客戶記錄

1)創建Query對象,寫hql語句

2)調用query對象里面的方法得到結果

2 查詢所有: from 實體類名稱

 條件查詢

1 hql條件查詢語句寫法:

1)  from  實體類名稱 where 實體類屬性名稱=? and實體類屬性名稱=?

from  實體類名稱 where 實體類屬性名稱 like ?

2 代碼

 

 

 

 模糊查詢

排序查詢

1 hql排序語句寫法

1from 實體類名稱 order by 實體類屬性名稱 asc/desc

分頁查詢

1 mysql實現分頁

1)使用關鍵字 limit實現

 2 hql中實現分頁

1)在hql操作中,在語句里面不能寫limithibernateQuery對象封裝兩個方法實現分頁操作

投影查詢

1 投影查詢:查詢不是所有字段值,而是部分字段的值

2 投影查詢hql語句寫法:

1select 實體類屬性名稱1, 實體類屬性名稱2  from 實體類名稱

2select 后面不能寫 * ,不支持的

3 具體實現

 聚集函數使用

1 常用的聚集函數

1countsumavgmaxmin

2 hql聚集函數語句寫法

1)查詢表記錄數

- select count(*) from 實體類名稱

 

QBC查詢

1 使用hql查詢需要寫hql語句實現,但是使用qbc時候,不需要寫語句了,使用方法實現

2 使用qbc時候,操作實體類和屬性

3 使用qbc,使用Criteria對象實現

查詢所有

1 創建Criteria對象

2 調用方法得到結果

 條件查詢

1 沒有語句,使用封裝的方法實現

 

 

 

排序查詢

 

 

 

分頁查詢

 

 

 開始位置計算公式:(當前頁-1*每頁記錄數

統計查詢

離線查詢

1 servlet調用serviceservice調用dao

1)在dao里面對數據庫crud操作

2)在dao里面使用hibernate框架,使用hibernate框架時候,調用session里面的方法實現功能

 

本地SQL查詢

 SQLQuery sql=session.createSQLQuery("select * from user where id=1 ");
 sql.addEntity(User.class);
 List<User> list=sql.list();
 System.out.println(list);

 

 

HQL多表查詢

Mysql里面多表查詢

1 內連接

 

 

 2 左外連接

 

 

 3 右外連接

 

 

 HQL實現多表查詢

Hql多表查詢

1)內連接

2)左外連接

3)右外連接

4)迫切內連接

5)迫切左外連接

HQL內連接

1 內連接查詢hql語句寫法:以客戶和聯系人為例

1from  Customer  c  inner  join  c.setLinkMan

 

 

 返回listlist里面每部分是數組形式

 

 

 2 演示迫切內連接

1)迫切內連接和內連接底層實現一樣的

2)區別:使用內連接返回list中每部分是數組,迫切內連接返回list每部分是對象

3hql語句寫法

- from  Customer  c  inner  join  fetch  c.setLinkMan

HQL左外連接

1 左外連接hql語句:

1from  Customer  c  left  outer  join  c.setLinkMan

2)迫切左外連接from  Customer  c  left  outer  join  fetch  c.setLinkMan

2 左外連接返回list中每部分是數組,迫切左外連接返回list每部分是對象

 

 

 

 

 1 右外連接hql語句:

1from  Customer  c  right  outer  join  c.setLinkMan

Hibernate檢索策略

檢索策略的概念

1 hibernate檢索策略分為兩類:

1)立即查詢:根據id查詢,調用get方法,一調用get方法馬上發送語句查詢數據庫

 

 

 2)延遲查詢:根據id查詢,還有load方法,調用load方法不會馬上發送語句查詢數據,只有得到對象里面的值時候才會發送語句查詢數據庫

 

 

 2 延遲查詢分成兩類:

1)類級別延遲:根據id查詢返回實體類對象,調用load方法不會馬上發送語句

2)關聯級別延遲:

- 查詢某個客戶,再查詢這個客戶的所有聯系人,查詢客戶的所有聯系人的過程是否需要延遲,這個過程稱為關聯級別延遲

 

 

 關聯級別延遲操作

1 在映射文件中進行配置實現

1)根據客戶得到所有的聯系人,在客戶映射文件中配置

2 set標簽上使用屬性

1fetch:值select(默認)

2lazy:值

- true:延遲(默認)

- false:不延遲

- extra:極其延遲

 

 

 

 

 1)調用get之后,發送兩條sql語句

 

 

 1)極其懶惰,要什么值給什么值

批量抓取

1 查詢所有的客戶,返回list集合,遍歷list集合,得到每個客戶,得到每個客戶的所有聯系人

1)上面操作代碼,發送多條sql語句

 2 在客戶的映射文件中,set標簽配置

1batch-size值,值越大發送語句越少

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM