Hibernate 是一个用来连接和操作数据库的 Java 框架,它最大的优点是使用了 ORM 技术。并且在企业开发中经常使用,那hibernate框架如何入门?下面来我们就来给大家讲解一下hibernate框架入门教程之hibernate核心接口。
1. Configuration
正如其名,Configuration 主要用于管理 Hibernate 配置信息,并在启动 Hibernate 应用时,创建 SessionFactory 实例。
在 Hibernate 应用启动时,需要获取一些基本信息,例如,数据库 URL、数据库用户名、数据库用户密码、数据库驱动程序和数据库方言等等。这些属性都可以在 Hibernate 的核心配置文件(hiberntae.cfg.xml)中进行设置。
创建 Configuration 实例
Hibernate 通常使用以下方式创建 Configuration 实例,此时 Hibernate 会自动在当前项目的类路径(CLASSPATH)中,搜索核心配置文件 hibernate.cfg.xml 并将其加载到内存中,作为后续操作的基础配置 。
Configuration configuration = new Configuration().configure();
若 Hibernate 核心配置文件没有在项目的类路径( src 目录)下,则需要在 configure() 方法中传入一个参数指定配置文件位置,示例代码如下:
Configuration configuration = new Configuration().configure("/net/biancheng/www/mapping/hibernate.cfg.xml");
加载映射文件
我们知道,在 Hibernate 的核心配置文件中,
1. 调用 Configuration 提供的 addResource() 方法,并在该方法中传入一个参数指定映射文件的位置,示例代码如下。
configuration.addResource("net/biancheng/www/mapping/User.hbm.xml");
2. 调用 Configuration 提供的 addClass() 方法,并将与映射文件对应的实体类以参数的形式传入该方法中,示例代码如下。
configuration.addClass(User.class);
使用 addClass() 方法加载映射文件时,需要同时满足以下 2 个条件,否则将无法加载映射文件。
映射文件的命名要规范,即映射文件要完全按照“实体类.hbm.xml ”的形式命名;
映射文件要与实体类在同一个包下。
需要注意的是,Configuration 对象只存在于系统的初始化阶段,将 SessionFactory 创建完成后,它的使命就完成了。
2. SessionFactory
SessionFactory 对象用来读取和解析映射文件,并负责创建和管理 Session 对象。
SessionFactory 对象中保存了当前的数据库配置信息、所有映射关系以及 Hibernate 自动生成的预定义 SQL 语句,同时它还维护了 Hibernate 的二级缓存。
一个 SessionFactory 实例对应一个数据库存储源,Hibernate 应用可以从 SessionFactory 实例中获取 Session 实例。
SessionFactory 具有以下特点:
SessionFactory 是线程安全的,它的同一个实例可以被应用多个不同的线程共享。
SessionFactory 是重量级的,不能随意创建和销毁它的实例。如果应用只访问一个数据库,那么在应用初始化时就只需创建一个 SessionFactory 实例;如果应用需要同时访问多个数据库,那么则需要为每一个数据库创建一个单独的 SesssionFactory 实例。
SessionFactory 之所以是重量级的,是因为它需要一个很大的缓存,用来存放预定义 SQL 语句以及映射关系数据等内容。我们可以为 SessionFactory 配置一个缓存插件,它被称为 Hiernate 的二级缓存,此处了解即可,我们会在后面详细介绍。
创建 SessionFactory 对象
通常情况下,我们通过 Configuration 的 buildSessionFactory() 方法来创建 SessionFactory 的实例对象,示例代码如下。
SessionFactory sessionFactory = configuration.buildSessionFactory();
抽取工具类
由于 SessionFactory 是重量级的,它的实例不能随意创建和销毁,因此在实际开发时,我们通常会抽取出一个工具类,将 SessionFactory 对象的创建过程放在静态代码快中,以避免 SessionFactory 对象被多次创建。
例如,在 hibernate-demo 项目的 net.biancheng.www.utils 包下,创建一个工具类 HibernateUtils,代码如下。
package net.biancheng.www.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * 工具类 */ public class HibernateUtils { private static final Configuration configuration; private static final SessionFactory sessionFactory; //在静态代码块中创建 SessionFactory 对象 static { configuration = new Configuration() .configure(); sessionFactory = configuration.buildSessionFactory(); } //通过 SessionFactory 对象创建 Session 对象 public static Session openSession() { return sessionFactory.openSession(); } public static void main(String[] args) { // openSession(); HibernateUtils hibernateUtils = new HibernateUtils(); } }
由以上代码可知,我们直接调用 HibernateUtils 的 getSession() 的方式,便可以获取 Session 对象。
3. Session
Session 是 Hibernate 应用程序与数据库进行交互时,使用最广泛的接口,它也被称为 Hibernate 的持久化管理器,所有持久化对象必须在 Session 的管理下才可以进行持久化操作。持久化类只有与 Session 关联起来后,才具有了持久化的能力。
Session 具有以下特点:
不是线程安全的,因此应该避免多个线程共享同一个 Session 实例;
Session 实例是轻量级的,它的创建和销毁不需要消耗太多的资源。通常我们会将每一个Session 实例和一个数据库事务绑定,每执行一个数据库事务,不论执行成功与否,最后都因该调用 Session 的 Close() 方法,关闭 Session 释放占用的资源。
Session 对象维护了 Hibernate 的一级缓存,在显式执行 flush 之前,所有的持久化操作的数据都缓存在 Session 对象中。
这里的持久化指的是对数据库数据的保存、更新、删除和查询。持久化类指与数据库表建立了映射关系的实体类,持久化对象指的是持久化类的对象。
关于持久化以及一级缓存的概念,这里了解即可,我们会在 Hibernate 持久化类和 Hibernate 一级缓存中详细讲解。
创建 Session 对象
我们可以通过以下 2 个方法创建 Session 对象:
1.调用 SessionFactrory 提供的 openSession() 方法,来获取 Session 对象,示例代码如下。
//采用 openSession() 方法获取 Session 对象 Session session = sessionFactory.openSession();
2. 调用SessionFactrory 提供的 getCurrentSession() 方法,获取 Session 对象,示例代码如下。
//采用 getCurrentSession() 方法获取 Session 对象 Session session = sessionFactory.getCurrentSession();
以上 2 种方式都能获取 Session 对象,但两者的区别在于:
采用 openSession() 方法获取 Session 对象时,SessionFactory 直接创建一个新的 Session 实例,且在使用完成后需要调用 close() 方法进行手动关闭。
采用 getCurrentSession() 方法创建的 Session 实例会被绑定到当前线程中,它在事务提交或回滚后会自动关闭。
4. Transaction
Transaction 是 Hibernate 提供的数据库事务管理接口,它对底层的事务接口进行了封装。所有的持久化操作(即使是只读操作)都应该在事务管理下进行,因此在进行 CRUD 持久化操作之前,必须获得 Trasaction 对象并开启事务。
获取 Transaction 对象
我们可以通过 Session 提供的以下两个方法来获取 Transaction 对象:
1. 调用 Session 提供的 beginTransaction() 方法获取 Transaction 对象,示例代码如下。
Transaction transaction = session.beginTransaction();
2. 调用 Session 提供的 getTransaction() 方法获取 Transaction 对象,示例代码如下。
Transaction transaction1 = session.getTransaction();
以上两个方法均可以获取 Transaction 对象,但两者存在以下不同:
getTransaction() 方法:根据 Session 获得一个 Transaction 对象,但是并没有开启事务。
beginTransaction() 方法:是在根据 Session 获得一个 Transaction 对象后,又继续调用 Transaction 的 begin() 方法,开启了事务。
提交或回滚事务
持久化操作执行完成后,需要调用了 Transaction 接口的 commit() 方法进行事务提交,只有在事务提交后,才能真正地将数据同步到数据库中。当发生异常时,则需要调用 rollback() 方法进行事务回滚,以避免数据发生错误,示例代码如下。
@Test public void test() { User user = new User(); Session session = HibernateUtils.openSession(); //获取事务对象 Transaction transaction = session.getTransaction(); //开启事务 transaction.begin(); try { //执行持久化操作 Serializable save = session.save(user); //提交事务 transaction.commit(); } catch (Exception e) { //发生异常回滚事务 transaction.rollback(); } finally { //释放资源 session.close(); } }
5. Query
Query 是 Hibernate 提供的查询接口,主要用执行 Hinernate 的查询操作。Query 对象中通常包装了一个 HQL(Hibernate Query Language)语句,HQL 语句与 SQL 语句存在相似之处,但 HQL 语句是面向对象的,它使用的是类名和类的属性名,而不是表名和表中的字段名。HQL 能够提供更加丰富灵活、更为强大的查询能力,因此 Hibernate 官方推荐使用 HQL 进行查询。
在 Hibernate 应用中使用 Query 对象进行查询,通常需要以下步骤:
1. 获得 Hibernate 的 Sesssin 对象;
2. 定义 HQL 语句;
3. 调用 Session 接口提供的 createQuery() 方法创建 Query 对象,并将 HQL 语句以参数的形式传入到该方法中;
4. 若 HQL 语句中包含参数,则调用 Query 接口提供的 setXxx() 方法设置参数;
5. 调用 Query 的 getResultList() 方法,进行查询,并获取查询结果集。
除了数据库查询外,HQL 语句还可以进行更新和删除操操作,需要注意的是 HQL 并不支持 insert 操作,想要保存数据请使用 Session 接口提供的 save() 或 saveOrUpate() 方法。
下面我们通过一个实例,演示如何使用 HQL 进行更新和删除操作,代码如下。
@Test public void testHqlInsert() { //获取 Session 对象 Session session = HibernateUtils.openSession(); //获取事务对象 Transaction transaction = session.getTransaction(); //开启事务 transaction.begin(); //更新操作 Query query = session.createQuery("update User SET userName=:username,userId=:userId,email=:email where id=:id"); //为更新语句设置参数 query.setParameter("username", "HQL"); query.setParameter("userId", "HQL"); query.setParameter("email", "HQL"); query.setParameter("id", 4); //执行更新操作 int i = query.executeUpdate(); if (i > 0) { System.out.println("成功修改了 " + i + " 条记录"); } //删除操作 Query query1 = session.createQuery("delete from User WHERE userId=?1"); //为删除语句设置参数 query1.setParameter(1, "005"); //执行删除操作 int d = query1.executeUpdate(); if (d > 0) { System.out.println("成功删除了 " + d + " 条记录"); } //提交事务 transaction.commit(); //释放资源 session.close(); }
执行该测试方法,控制台输出如下。
Hibernate: update user set user_name = ? , user_id = ? , email = ? where id = ? 成功修改了 1 条记录 Hibernate: delete from user where user_id = ? 成功删除了 1 条记录
查看数据库 user 表,结果如下。
Hibernate 有 Configuration 接口、SessionFactory 接口、Session 接口、Transaction 接口和 Query 接口这5个接口,并且这些接口是开发中常用的,所以我们需要了解每个接口的使用方法以及作用哦!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。
推荐阅读: