Hibernate初見

[TOC]

Hibernate

1 直譯:冬眠 數(shù)據(jù)持久化框架 ORM框架
2 用處: 最終將JDBC 替換

Hibernate.png

uniqueResult 唯一結(jié)果
lazy 延遲加載
cascade 級(jí)聯(lián)
inverse 反轉(zhuǎn)

3 Hibernate 實(shí)現(xiàn)的步驟

  • 導(dǎo)包

  • 主配置文件和映射文件<將實(shí)體和表映射>

  • 測(cè)試類 TestHibernste
    測(cè)試類步驟:

    • 獲取配置 創(chuàng)建工廠 獲取session 執(zhí)行方法 處理結(jié)果 關(guān)閉session

具體操作

設(shè)置主配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
               
<hibernate-configuration>
    <!--主配置  -->
    <session-factory>
    
        <property name="connection.url">
            jdbc:mysql://localhost:3306/user
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="dialect">
             org.hibernate.dialect.MySQLDialect
        </property>
 
 <mapping resource="com/wxb/bean/User.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

映射文件設(shè)置

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 模型和表映射 -->
   
   <class name="com.wxb.bean.User" table="user">
   <id name="uid" column="uid" type="java.lang.Integer">
   <generator class="increment" ></generator>
   </id>
   <property name="name" column="name" type="java.lang.String"></property>
   
   </class>
</hibernate-mapping>

測(cè)試類

//獲取配置
    Configuration cf=new Configuration().configure();
    //創(chuàng)建工廠  
    SessionFactory sf = cf.buildSessionFactory();
    //獲取session  
    Session session = sf.openSession();
    
    //hql 語句獲取用戶信息
    List<User> list = session.createQuery("from User").list();
    

顯示sql語句 格式化配置

  • 顯示sql語句
<property name="hibernate.show_sql">true</property>
  • 格式化
<property name="hibernate.format_sql">true</property>

session常用的方法

  • save
  • update
  • delete
  • saveOrUpdate 如果配置文件中設(shè)置的是自增長(zhǎng),新增是無需編號(hào) ,修改則需要編號(hào)

對(duì)象實(shí)體的三個(gè)狀態(tài)

  • 自由狀態(tài)
  • 持久狀態(tài)
  • 游離狀態(tài)

get/load 區(qū)別

User us = (User) session.get(User.class, 46);
User use=  (User) session.load(User.class, 46)
  • 同樣都是可以通過編號(hào)獲取對(duì)象
    區(qū)別在于編號(hào)不存在是,get返回null,而load則會(huì)報(bào)異常ObjectNotFoundException(需打印異常信息)

唯一結(jié)果 uniqueResult

 
    Object object = session.createQuery("select count(*) from User").uniqueResult();

HQL-Hibernate 查詢語句 OOP+SQL

hq語句

          /***
          * hq語句查詢
          * 
          */
         
        String hql1="from User order by  uid desc"; //降序排列
         
        String hql1="from User where name like'%云%'"; //模糊查詢
         
        String hql1="from User where uid=1";   // 通過ID查詢

占位符

          /**
          * 占位符的三種方式
          * 
          */
         - 使用 ?                 填充序號(hào)從0開始
       - 使用 :ui               填充參數(shù)序號(hào)從0開始
       - 使用 :屬性             填充參數(shù)一樣是屬性   優(yōu)點(diǎn):和順序無關(guān)

``` java
       String hql2="from User where uid=? or name=?";
        List<User> list =session.createQuery(hql2)
           .setParameter(0,29)
           .setParameter(1,"齊天大圣")
           .list();

         for (User user : list) {
           System.out.println(user);
         }
       String hql3="from User where uid=:ui and name=:na";
        List<User> list =session.createQuery(hql3)
           .setParameter("ui", 29)
           .setParameter("na","齊天大圣")
           .list();

         for (User user : list) {
           System.out.println(user);
         }
String hql4="from User where uid=:uid and name=:name";
List<User> list =session.createQuery(hql3)
           .setProperties(new User(29,"齊天大圣"))
           .setFirstResult(0)
           .list();

            for (User user : list) {
           System.out.println(user);
         }

分頁

String hql1="from User order by  uid desc"; //降序排列

List<User> list = session.createQuery(hql1)
                  .setFirstResult(0)
                  .setMaxResults(5)
                  .list();

         for (User user : list) {
             
           System.out.println(user);
         }

原生SQL

方式1

           /**
           * 原生sql
           */
          
          String sql="select * from user";
          
          List<Object[]> list = session.createSQLQuery(sql).list();
        
          for (Object[] objects : list) {
      System.out.println(Arrays.toString(objects));
    }

方式2

    List<User> list2 = session.createSQLQuery(sql).addEntity(User.class).list();
          for (User user2 : list2) {
          System.out.println(user2);
            
    }

HQL 與SQL比較

  • HQL

  • 優(yōu)點(diǎn):增刪改有專用的方法 ;輸出比較方便

  • 缺點(diǎn):hql專用語法;屬性需要在模型;里面

  • 原生 SQL

    • 優(yōu)點(diǎn):使用靈活;獲取的數(shù)據(jù)不受限制;可用于復(fù)雜統(tǒng)計(jì)查詢;同樣支持增刪改

    • 缺點(diǎn):輸出無法直接進(jìn)行模型化

    • 注: 復(fù)雜查詢建議使用(子查詢/連接查詢)

ER 關(guān)系

映射文件的屬性

lazy 懶加載

lazy="true"/ 延遲加載
lazy="false" 立加載

立加載 就是在session 關(guān)閉之前,就會(huì)執(zhí)行完sql/hql 語句,在多對(duì)一(many- to-one)的情況下,需要設(shè)置為false,否則會(huì)報(bào)錯(cuò)

延遲加載 就是在session關(guān)閉前執(zhí)行一部分sql/hql語句,一對(duì)多(one-to-many)默認(rèn)為true

<!-- 一對(duì)多  -->
   <set name="set" lazy="false" cascade="all">
   <key column="deptno"></key>
   <one-to-many class="com.wxb.bean.User"/>
   </set>
<!-- 多對(duì)一 -->
<many-to-one name="dept" class="com.wxb.bean.Department"  lazy="false"> 
    <column name="deptno" ></column>
   </many-to-one>

cascade 級(jí)聯(lián)

級(jí)聯(lián)新增

 Department department=new Department("開天辟地");
 User user=new User("盤古");
 department.getSet().add(user);
  user.setDept(department)   
  session.save(department);    
  tac.commit();
    
009.png

反轉(zhuǎn) inverse

一般默認(rèn)為false

當(dāng)設(shè)置為false 的時(shí)候,此時(shí)為不反轉(zhuǎn),為系統(tǒng)的智能模式,此時(shí)只需說明部分關(guān)系 即一對(duì)多的關(guān)系

當(dāng)設(shè)置為true的時(shí)候,為不反轉(zhuǎn) 需要程序員自己手動(dòng)維護(hù),說明全部關(guān)系 即一對(duì)多和多對(duì)一的關(guān)系

命名查詢

優(yōu)點(diǎn):sql或hql集中管理,方便發(fā)布之后維護(hù)

List <Object []>list = session.getNamedQuery("getMoneyMMA").setProperties(new User("%天%"))

           .list();
      
      for (Object[] objects : list) {
      System.out.println(Arrays.toString(objects));
    }

使用方法getNameQuery

sql 語句

<sql-query name="getMoneyMMA">
   
      select max(money),min(money),avg(money) from user
    
   </sql-query>
   
List <Object []>list = session.getNamedQuery("getMoneyMMA").list();
      
      for (Object[] objects : list) {
      System.out.println(Arrays.toString(objects));
    }

hql 語句

 <query name="getMoneyHQL">
   
  <![CDATA[from User]]>
   </query>
List list = session.getNamedQuery("getMoneyHQL").list();
      for (Object object : list) {
      System.out.println(object);
    }

緩存

Hibernate實(shí)現(xiàn)了良好的Cache機(jī)制,可以借助Hibernate內(nèi)部的Cache迅速提高系統(tǒng)的數(shù)據(jù)讀取性能。Hibernate中的Cache可分為兩層:一級(jí)Cache和二級(jí)Cache。

一級(jí)Cache:

同一個(gè)session 查詢兩次 sql語句執(zhí)行一次

二級(jí)Cache:

工廠級(jí)別的緩存(sessionFactory)同一個(gè)sessionFactroy

實(shí)現(xiàn)步驟:

  • 同一個(gè)seesionFactory
  • 打開二級(jí)緩存設(shè)置
<property name="hibernate.cache.use_second_level_cache">true</property>
  • 打開第三方插件支持
<property name="hibernate.cache.provider_class">
        org.hibernate.cache.EhCacheProvider
        </property>

  • 相應(yīng)的對(duì)象映射文件配置

   <cache usage="read-write"/>
  • 導(dǎo)包 commons-lonning-1.1.1jar
  • lazy設(shè)置為默認(rèn) proxy

緩存查詢

<property name="hibernate.cache.use_query_cache">true</property>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Hibernate: 一個(gè)持久化框架 一個(gè)ORM框架 加載:根據(jù)特定的OID,把一個(gè)對(duì)象從數(shù)據(jù)庫加載到內(nèi)存中OID...
    JHMichael閱讀 2,000評(píng)論 0 27
  • 這部分主要是開源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis、Spring、Spring ...
    雜貨鋪老板閱讀 1,433評(píng)論 0 2
  • 本文包括:1、Hibernate 的查詢方式2、HQL (Hibernate Query Language) 查詢...
    廖少少閱讀 2,688評(píng)論 0 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評(píng)論 18 399
  • Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫...
    蘭緣小妖閱讀 1,222評(píng)論 1 18