Hibernate整理

参考来源:
Hibernate框架概述

一. 概述

Hibernate可以作为模型层/数据访问层,通过配置文件(hibernate.properties或hibernate.cfg.xml)映射文件(.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。Hibernate核心包括:

  • Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
  • SessionFactory接口: 产生Session实例工厂。
  • Session接口:用来操作PO。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口。
  • Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
  • Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。

二. PO类的三个状态

持久化对象也是JavaBean, 但是PO会与Session相连,有三种状态:

  • 临时状态(transient): 当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这个JavaBeans对象就称为临时对象(Transient Object)。
  • 持久化状态(persistent): 当一个JavaBean对象与一个Session相关联时,就变成持久化对象(Persistent Object)
  • 脱管状态(detached): 在这个Session被关闭的同时,这个对象也会脱离持久化状态,就变成脱管状态(Detached Object),可以被应用程序的任何层自由使用,例如可以做与表示层打交道的数据舆对象(Data Transfer Object)。

三. 工作流程

Hibernate整理_第1张图片
Hibernate工作流程示意

如上图所示,应用程序首先用Configuration对象读取配置文件和映射文件,生成SessionFactory对象,通过SessionFactory对象生成Session对象,Session对象生成Query对象用于查询以及Transaction对象用于事务控制(提交或回滚)。

示例代码如下:
首先是数据库建表,

create table T_register (
 id int primary key, 
 userName varchar(30), 
 userPwd varchar(30), 
 sex varchar(10), 
 age int )

以登陆的页面为例,

<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>


    
        
        Insert title here
    
    

        
用户名:
密 码:
性 别:
年 龄:

PO类:

package hibernate.PO;
/**
 * 持久化类
 */

public class TRegister  implements java.io.Serializable {


    // Fields    

     private Integer id;
     private String userName;
     private String userPwd;
     private String sex;
     private Integer age;


    // Constructors

    /** default constructor */
    public TRegister() {
    }

    /** minimal constructor */
    public TRegister(Integer id) {
        this.id = id;
    }
    
    /** full constructor */
    public TRegister(Integer id, String userName, String userPwd, String sex, Integer age) {
        this.id = id;
        this.userName = userName;
        this.userPwd = userPwd;
        this.sex = sex;
        this.age = age;
    }

   
    // Property accessors

    public Integer getId() {
        return this.id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return this.userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return this.userPwd;
    }
    
    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }

    public String getSex() {
        return this.sex;
    }
    
    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return this.age;
    }
    
    public void setAge(Integer age) {
        this.age = age;
    }
}

Hibernate配置文件hibernate.cfg.xml,通常可由IDE自动生成。配置文件中定义SessionFactory的内容。






    
        root
        
            jdbc:mysql://localhost:3306/study
        
        
            org.hibernate.dialect.MySQLDialect
        
        MySQL5.0
        root
        
            org.gjt.mm.mysql.Driver
        
        true
        
    

映射文件TRegister.hbm.xml,映射文件将PO与数据库字段进行对应。





    
        
            
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

Hibernate基础类,HibernateUtil.java

package hibernate;

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

public class HibernateUtil {
    
    private static final SessionFactory sessionFactory;
    
    static
    {
        try
        {
            //Configuration获取配置文件,生成sessionFactory
            Configuration config = new Configuration().configure("/hibernate/hibernate.cfg.xml");
            sessionFactory = config.buildSessionFactory();
        }
        catch(Throwable e)
        {
            throw new ExceptionInInitializerError(e);
        }
    }
    
    public static final ThreadLocal session = new ThreadLocal();
    
    public static Session currentSession() throws HibernateException
    {
        Session s = (Session)session.get();
        //Open a new Session,if this Thread has none yet
        if(s == null || !s.isOpen())
        {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }
    
    public static void closeSession() throws HibernateException
    {
        Session s = (Session)session.get();
        session.set(null);
        if(s != null)
            s.close();
    }

}

控制类

package hibernate.servlet;

import hibernate.HibernateUtil;
import hibernate.PO.TRegister;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

public class RegisterServlet extends HttpServlet {

    private static final String CONTENT_TYPE = "text/html;charset=GBK";
    public void init() throws ServletException {
        // Put your code here
    }
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType(CONTENT_TYPE);
        request.setCharacterEncoding("GBK");
        
        PrintWriter out = response.getWriter();
        
        String userName = request.getParameter("userName");
        String userPwd = request.getParameter("userPwd");
        String sex = request.getParameter("sex");
        int age = Integer.parseInt(request.getParameter("age"));
        
        TRegister rg = new TRegister();
        rg.setAge(age);
        rg.setSex(sex);
        rg.setUserName(userName);
        rg.setUserPwd(userPwd);
        
        Session session = HibernateUtil.currentSession();//生成Session实例
        Transaction tx = session.beginTransaction();
        
        try
        {
            session.save(rg);    //保存持久类对象
            tx.commit();        //提交到数据库
            session.close();
            response.sendRedirect("registerOK.jsp");
        }
        catch(HibernateException e)
        {
            e.printStackTrace();
            tx.rollback();
        }
        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
        
    }
}

你可能感兴趣的:(Hibernate整理)