Hibernate是一个开源的持久层框架,它可以帮助我们将Java对象映射到数据库表中,并实现对象的持久化操作。Hibernate提供了丰富的API,可以方便地进行CRUD(增删改查)操作,而无需手动编写复杂的JDBC代码。

9.3.1. Hibernate核心组件

Hibernate主要包含以下几个核心组件:

  • SessionFactory: 一个SessionFactory实例可以看作是一个数据库连接池,它的作用是创建Session实例。SessionFactory是线程安全的,通常情况下,在一个应用程序中只需要一个SessionFactory实例。
  • Session: Session是Hibernate的核心,它用于执行持久化操作。在Session中执行的所有操作都是线程不安全的,所以每个线程都应该有自己的Session实例。
  • Transaction: Transaction表示一个数据库事务。在Hibernate中,所有的持久化操作都应该在事务中进行。
  • Configuration: Configuration用于读取Hibernate的配置信息,包括数据库连接信息、映射文件等。

9.3.2. Hibernate配置

在使用Hibernate时,我们需要进行一些基本配置,包括数据库连接信息、映射文件等。这些配置可以通过XML或者Java注解的方式进行。

9.3.2.1. 使用XML配置

以下是一个简单的Hibernate XML配置文件(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/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="com/example/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

在这个配置文件中,我们配置了数据库连接信息、SQL方言、是否显示SQL语句等。此外,我们还注册了一个名为"User.hbm.xml"的映射文件。

接下来,我们需要创建User实体类对应的映射文件(User.hbm.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!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.example.entity.User" table="users">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>

这个映射文件定义了User实体类与数据库表"users"的映射关系。其中,<id>元素表示主键映射,<property>元素表示属性映射。

9.3.2.2. 使用Java注解配置

除了使用XML配置文件,我们还可以使用Java注解进行配置。首先,我们需要为User实体类添加相应的注解:

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; @Column(name = "name")
private String name; @Column(name = "age")
private int age; // getters and setters
// ...
}

接下来,我们需要创建一个配置类,以便获取SessionFactory实例

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry; public class HibernateUtil {
private static final SessionFactory sessionFactory; static {
try {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml"); // 加载Hibernate配置文件
configuration.addAnnotatedClass(User.class); // 注册注解类 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
} public static SessionFactory getSessionFactory() {
return sessionFactory;
}

9.3.3. Hibernate基本操作

在这一部分,我们将通过一个简单的CRUD示例来演示Hibernate的基本操作。

9.3.3.1. 创建(Create)

首先,我们需要创建一个User实例,并将其保存到数据库中。在保存之前,我们需要获取一个Session实例,然后开启一个事务。操作完成后,我们需要提交事务,并关闭Session。

import org.hibernate.Session;
import org.hibernate.Transaction; public class UserDao {
public void saveUser(User user) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null; try {
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (RuntimeException e) {
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
}
}
}
9.3.3.2. 读取(Read)

接下来,我们需要从数据库中读取一个User实例。这里我们通过get()方法来实现。

public User getUser(int id) {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
return (User) session.get(User.class, id);
} finally {
session.close();
}
}
9.3.3.3. 更新(Update)

接下来,我们需要更新一个User实例。我们可以通过update()方法来实现。

public void updateUser(User user) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null; try {
transaction = session.beginTransaction();
session.update(user);
transaction.commit();
} catch (RuntimeException e) {
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
}
}
9.3.3.4. 删除(Delete)

最后,我们需要删除一个User实例。我们可以通过delete()方法来实现。

public void deleteUser(User user) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null; try {
transaction = session.beginTransaction();
session.delete(user);
transaction.commit();
} catch (RuntimeException e) {
if (transaction != null) {
transaction.rollback();
}
throw e;
} finally {
session.close();
}
}

9.3.4. 小结

在本章节中,我们学习了Hibernate框架的基本概念、配置方法以及CRUD操作。通过使用Hibernate,我们可以更轻松地实现Java对象与数据库表的映射,无需关心底层的JDBC代码。

请务必熟悉这些基本概念和操作,并在实际项目中加以应用。在掌握基本操作后,你可以进一步学习Hibernate的高级功能,如查询语言(HQL)、关联映射、缓存等,以满足更复杂的业务需求。

推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

9.3. Hibernate框架的更多相关文章

  1. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  2. Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)

    引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...

  3. 2.0、Hibernate框架的简单搭建

    一.Hibernate:是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句 ...

  4. 【Hibernate框架】对象的三种持久化状态

    一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...

  5. hibernate框架int和Integer类型区别

    hibernate 框架在定义实体时,int类型最好定义为Inttger类型,因为在注入时int是值类型不允许为空.

  6. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  7. ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...

    (一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...

  8. Hibernate框架简单应用

    Hibernate框架简单应用 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...

  9. Hibernate框架(未完待续······)

        作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...

  10. Hibernate框架之get和load方法的区别

    我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get ...

随机推荐

  1. DOM0级与DOM2级的区别

     1.DOM0级和DOM2级的共同优点:能添加多个事件处理程序,按顺序执行,HTML事件处理程序无法做到~2.关于dom0级和dom2级的区别DOM0级事件处理:同时绑定几个不同的事件,例如在绑定on ...

  2. React的行内样式与CSS

    如何为组件添加 CSS 的 class? 传递一个字符串作为 className 属性: render() { return <span className="menu navigat ...

  3. Web前端开发必看的100道大厂面试题

    1. 说说gulp和webpack的区别 开放式题目 Gulp强调的是前端开发的工作流程.我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并.雪碧图.启动server.版本控制 ...

  4. 这个小项目,上周被国外 AI 新闻网站报道,前些天又上了 github 热榜

    疫情期间在校花了几个月时间,写了这个小项目,是关于音频特征提取和分析的,自己是 AI 专业研究音频的,但受限于对音频特征的理解,做研究时总感觉缺乏"底料",所以当做是学习练手做了这 ...

  5. C# 自定义并动态切换光标

    系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs 本章介绍如何自定义光标.并动态切换光标类型. 动态切换光标类型 以白板书写为例 ...

  6. [OpenCV-Python] 5 视频

    文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 5 视频 5.1 用摄像头捕获视频 5.2 从文件中播放视频 5.3 保存视频 OpenCV-Python: II Op ...

  7. 用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径

    嘿嘿嘿.嘿嘿,俺又回来了! github代码地址 https://github.com/Tom-shushu/work-study 接口文档有道云 https://note.youdao.com/s/ ...

  8. IDP中的黄金路径究竟是什么?

    在云原生时代,开发人员面临着越来越多的工具.技术.思维方式的选择,给他们带来了极大的认知负担和工作量.为了提高开发人员的开发效率与开发体验,一些头部科技公司开始建立自己的内部开发者平台(IDP).在之 ...

  9. Nuxt3.0中使用EChart可视化图表📊

    在Nuxt3.0项目中用到了可视化图表,于是我用了EChart可视化图表库.但是在官网我没有找到针对在Nuxt3.0中使用EChart的方法,于是在这里记录我的引入EChart并简单使用的步骤.需要声 ...

  10. CTFShow 反序列化 Web 255-266

    CTFShow 反序列化 255-266 漏洞原理 未队用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等后果. 触发条件 unserialize ...