使用hibernate完成持久化操作

为工程创建了Hibernate环境之后,就可以通过Hihbernate API来操作数据库。Hibernate内部也是采用JDBC来访问数据库的。如下图就是JDBC API及Hibernate API方式来访问数据库:


使用Hibernate操作数据库包括7个步骤:

(1)读取并解析配置文件

Configuration configuration = new Configuration().configure();

根据默认位置的Hibernate配置文件的配置信息,构建Configuration对象

Configuration负责管理Hibernate的配置信息。


(2)读取并解析映射信息,创建SessionFacory对象:

SessionFactory sessionFactory = configuration.buildSessionFactory();
SessionFactory负责创建Session对象。

Configuration会根据当前的数据库配置信息,构造SessionFactory对象

SessionFactory对象一旦构造完毕,则Configuration对象的任何变更将不会影响已创建的SessionFactory对象。

如果Hibernate配置信息有所改动,那么需要基于改动后的Configuration对象重新构建一个SessionFactory对象。


(3)打开Session:

Session session = sessionFactory.openSession(); // 或者使用 sessionFactory.getCurrentSession();
Session是Hibernate持久化操作的基础。Session负责完成对象的持久化操作,它相当于JDBC中的Connection。

Session作为贯穿Hibernate的持久化管理器的核心,提供了众多持久化操作,如save()、delete()、update()、get()、load()等。

通过这些方法,即可透明地完成对象的增删改查(crud)的操作。


(4)开始一个事物(增删改操作必须,查询操作可选):

Transaction transaction = session.beginTransaction(); // 打开事务


(5)数据库操作:

session.save(obj);     //将obj对象进行保存操作


(6)结束事物:

transaction.commit();      //提交事务


(7)关闭session:

session.close();         //关闭session


如果在hibernate配置文件中,参数current_session_context_class设置为thread,并采用SessionFactory的getCurrentSession()方法获得Session对象,则不需要执行session.close()方法。


资料:

在项目开发过程中,通常使用工具类来管理SessionFactory和Session,代码如图所示:

package com.geeksss.HibernateStudy.util;

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

public class HibernateUtil {
    // 初始化一个ThreadLocal对象,ThreadLocal对象有get()、set()方法
    private static final ThreadLocal sessionTL = new ThreadLocal();
    private static Configuration configuration;
    private static final SessionFactory sessionFactory;
    static{
        try{
            configuration = new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
        }catch(Throwable ex){
            ex.printStackTrace();
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static Session currentSession(){
        /* 
         * sessionTL的get()方法根据当前县城返回其对应的线程内部变量,即Session对象。
         * 多线程情况下共享数据库连接是不安全的。
         * ThreadLoca保证了每个线程都有自己独立的Session对象。
         */
        Session session = (Session)sessionTL.get();
        /*
         * 如果session为null,则打开一个新的session
         * 如果该线程是初次访问,session是null,则创建一个Session对象
         */
        if(session==null){
            session = sessionFactory.openSession();    // 创建一个Session对象
            sessionTL.set(session);    // 保存该Session对象到ThreadLocal中
        }
        return session;    // 如果当前线程已经访问过数据库,则从sessionTL中get()就可以获取该线程上次获取过的Session对象。
    }
    /**
     * 关闭session
     * 首先调用sessionTL.get()方法获取Session对象;
     * 接着调用sessionTL.set(null)方法,把sessionTL管理的Session对象置为null;
     * 最后关闭Session。
     */
    public static void closeSession(){
        Session session = (Session)sessionTL.get();
        sessionTL.set(null);
        session.close();
    }
}

HibernateUtil.java (Hibernate工具类)
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值