当面试被问到Hibernate

45 篇文章 9 订阅
42 篇文章 1 订阅

前段时间去面试了一家公司,这个公司是做二次开发的,所有有一些项目的技术还是以老的为主,当时就被问道了Hibernate。
我直接是一脸懵,什么东西,没听过啊,只知道是以前SHH框架开发的东西,所有想跟大家分享一下我所认为的Hibernate。

前言

Hibernate是一个Java持久化框架,广泛用于Java EE系统中,它的主要目标是为了解决Java对象与关系型数据库之间的映射问题,从而可以简化数据访问层的开发。Hibernate不仅可以帮我们避免直接使用JDBC进行数据操作,还能够自动化地持久化Java对象到数据库中,并且是Hibernate创始人 Gavin King 于2001年发布的,至今已发展成为一个成熟、广泛应用的Java持久化框架。

准备工作

在开始使用Hibernate之前,我们需要下载并安装Hibernate框架。Hibernate提供了很多不同的版本,我们可以选择合适的版本下载。在本文中,我们使用Hibernate 5.x版本进行演示,并且需要将以下jar包加入我们的Java项目中:

  • hibernate-core.jar:Hibernate核心库;
  • hibernate-commons-annotations.jar:Hibernate注释库;
  • hibernate-jpa-api.jar:JPA API库;
  • hibernate-entitymanager.jar:Hibernate的实体管理器库。

除此之外,我们还需要将以下jar包加入我们的Java项目中,这些jar包是JDBC的驱动程序,实现了Java与关系型数据库的连接功能,我们选择MySQL数据库作为示例:

  • mysql-connector-java.jar:MySQL JDBC驱动程序;
  • c3p0.jar:c3p0数据库连接池。

创建Java对象

在使用Hibernate将Java对象映射到数据库表中之前,我们需要先创建Java对象。

在本文中,我们以一个简单的学生对象为例:

public class Student {
    private String id;
    private String name;
    private int age;
    // 省略getter与setter方法
}

创建Hibernate配置文件

接下来,我们需要创建Hibernate的配置文件hibernate.cfg.xml。该文件有很多可配置项,例如使用的数据库类型、用户名、密码、连接池等。以下是一个简单的配置文件示例:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.show_sql">true</property>
    </session-factory>
</hibernate-configuration>

在上面的配置文件中,我们指定了使用的数据库类型为MySQL,数据库连接URL为localhost:3306/test,用户名与密码分别为root123456,还指定了hibernate.dialect属性来指明使用MySQL5Dialect方言,以及hibernate.show_sql属性让Hibernate在输出SQL时打印更多的日志。

映射Java对象到数据库表

完成以上准备工作后,我们开始将Java对象映射到数据库表中。在Hibernate中,这需要使用Hibernate的映射文件来实现。Hibernate提供了三种类型的映射文件:映射Java类到SQL表映射文件(.hbm.xml)、注释映射文件和JPA Annotation。其中,本文使用注释映射文件。

我们在我们的学生类上添加Hibernate注释如下:

@Entity
@Table(name="student")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name ="age")
    private int age;

    // 省略getter与setter方法
}

在上面的代码中,我们使用了@Entity注释来标记该类为Hibernate实体类,@Table注释指定了映射的数据库表为student,@Id注释指定了我们使用id属性作为主键,@GeneratedValue注释指定了使用自动生成的策略来生成主键值,@Column注释指定了我们的属性对应数据库表中的列。

使用Hibernate进行数据操作

完成以上工作后,我们就可以开始使用Hibernate进行数据库操作了。以下是一个简单的Hibernate操作示例:

Session session = null;
Transaction transaction = null;
try {
    // 获取一个Session
    session = HibernateUtil.getSession();

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

    // 创建一个Student对象
    Student student = new Student();
    student.setName("Tom");
    student.setAge(18);

    // 将Student对象保存到数据库中
    session.save(student);

    // 提交事务
    transaction.commit();
} catch (Exception e) {
    // 回滚事务
    transaction.rollback();
} finally {
    // 关闭Session
    HibernateUtil.closeSession(session);
}

在上面的代码中,我们使用了HibernateUtil.getSession()静态方法来获取一个Session,然后开启了一个事务,创建了一个Student对象并将其保存到数据库中,最后提交事务并关闭Session。需要注意的是,我们使用了HibernateUtil.closeSession()静态方法来关闭Session,这里省略了该方法的具体实现,需要读者自行实现。

Hibernate的缓存机制

Hibernate的缓存是Hibernate对数据库进行缓存的机制,主要分为三级缓存和二级缓存。

三级缓存:

  • Session级别的缓存,即一级缓存。该级别的缓存是Session级别的,即Session结束或清除后缓存将被清除。
  • 二级缓存,即SessionFactory级别的缓存。该级别的缓存是SessionFactory级别的,即一个SessionFactory中的所有Session公用同一个缓存,当所有的SessionFactory和所有的Session都被销毁时,缓存将被清除。
  • Query级别的缓存,即三级缓存。该级别的缓存是Query级别的,即只缓存指定的查询结果,缓存的生命周期由查询参数和数据库更新控制。

总结

通过本文的介绍,我们了解了Hibernate的基础知识、配置及使用方法,并了解了Hibernate的缓存机制。希望本文能对读者有所帮助,使读者能够在以后的Java开发中更好地运用和掌握Hibernate框架。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漠真有鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值