Hibernate怎么用

一.为什么用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关闭情况下进行历史查询

    导入第三方包

    在配置文件里添加开启配置