1. 程式人生 > >Hibernate怎麽用

Hibernate怎麽用

stack 持久化 begin prop pack inf host gbk odin

一.為什麽用Hibernate?  【核心:對象關系映射】

  Hibernate是對jdbc的輕量級封裝,可以簡化數據庫連接操作,

  在該框架之前,數據庫的操作步驟是:

1.根據連接字串獲取連接
2.執行sql語句
3.獲取結果集
4.從結果集提取數據

二.Hibernate怎麽用?

  1.引入框架所需要的包

  2.配置 src/hibernate.cfg.xml,常用配置如下:  【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"
> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="hbm2ddl.auto">update</property>  //根據類自動建表 <property name="dialect">org.hibernate.dialect.MySQLDialect</property
> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">java</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</
property> <!-- 自定義配置 --> <property name="show_sql">true</property>  //顯示sql語句 <property name="format_sql">true</property>  //格式化顯示sql語句 <!-- 映射文件 --> <mapping resource="com/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>

  3.編寫實體類映射文件  User.hbm.xml 【文件名和實體類名字相同】

<?xml version="1.0"?>
<!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.bean.User" table="TEST_USER" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="uname"/>
        <property name="photo"/>
    </class>
</hibernate-mapping> 

  4.進行具體查詢的業務邏輯【軟件導入框架時會默認添加一個獲取session的類】

package com.dao.impl;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.bean.User;
import com.dao.IUserDao;
import com.util.HibernateSessionFactory;

public class UserDaoImpl implements IUserDao{

    @Override
    public Integer addUser(User u) {
        
        int result = -1;
        //獲取會話
        Session session = HibernateSessionFactory.getSession();
        Transaction tx = session.beginTransaction();
        
        try {
            //保存數據
            session.save(u);
            tx.commit();
            result=1;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //關閉
        session.close();
        return result;
    }

}

三,Hibernate高級知識:

  1.對象關系映射

    當一個類裏,把另一個類作為屬性使用時,怎麽用映射文件來反映這種關系?

    這就是對象關系映射,參考上一篇對象關系映射文章

  2.Hibernate查詢:Query查詢,Criteria查詢  [不常用的本地查詢,native查詢]

    Query查詢:

  //獲取會話 
  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();
String hql="from Admin as admin where admin.aname=:name";//使用命名參數,推薦使用,易讀。 Query query=session.createQuery(hql); query.setString("name", name);
List
<Admin> list=query.list(); for(Admin admin:list){   System.out.println(admin.getAname()); }

   Criteria查詢:

    Restrictions-條件查詢,默認獲取全部

    Projections-聚合查詢,如求和,平均值

  //獲取會話 
  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();


  Criteria c=session.createCriteria(Admin.class); c.add(Restrictions.eq("aname",name));//eq是等於,gt是大於,lt是小於,or是或 c.add(Restrictions.eq("apassword", password)); List<Admin> list=c.list(); for(Admin admin:list){ System.out.println(admin.getAname()); }

四,Hibernate查詢優化 

  1.延時加載:當一個類的屬性是另一個類的時候,只顯示本類屬性,

    用法:配置set-lazy屬性即可,默認開啟

<?xml version="1.0" encoding="GBK"?> 
 <!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="org.crazyit.app.domain">    <!-- 映射 Person 持久化類 -->    <class name="Person" table="person_inf">     <!-- 映射標識屬性 id -->     <id name="id" column="person_id">       <!-- 定義主鍵生成器策略 -->       <generator class="identity"/>     </id>     
     <!-- 用於映射普通屬性 -->     <property name="name" type="string"/>      <property name="age" type="int"/>   
    <!-- 映射集合屬性 -->     <set name="addresses" table="person_address" lazy="true">       。。。    </set>   </class> </hibernate-mapping>

  2.抓取策略:和延時差不多,

    用法:配置set-fetch屬性即可,默認開啟

五,Hibernate緩存

  1.一級緩存默認開啟,session不關閉同一查詢,語句只執行一次

   2.二級緩存,由第三方提供,可以於session關閉情況下進行歷史查詢

    導入第三方包

    在配置文件裏添加開啟配置

   

Hibernate怎麽用