9.3. Hibernate框架
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框架的更多相关文章
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)
引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...
- 2.0、Hibernate框架的简单搭建
一.Hibernate:是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句 ...
- 【Hibernate框架】对象的三种持久化状态
一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...
- hibernate框架int和Integer类型区别
hibernate 框架在定义实体时,int类型最好定义为Inttger类型,因为在注入时int是值类型不允许为空.
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
- Hibernate框架简单应用
Hibernate框架简单应用 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...
- Hibernate框架(未完待续······)
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...
- Hibernate框架之get和load方法的区别
我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get ...
随机推荐
- DOM0级与DOM2级的区别
1.DOM0级和DOM2级的共同优点:能添加多个事件处理程序,按顺序执行,HTML事件处理程序无法做到~2.关于dom0级和dom2级的区别DOM0级事件处理:同时绑定几个不同的事件,例如在绑定on ...
- React的行内样式与CSS
如何为组件添加 CSS 的 class? 传递一个字符串作为 className 属性: render() { return <span className="menu navigat ...
- Web前端开发必看的100道大厂面试题
1. 说说gulp和webpack的区别 开放式题目 Gulp强调的是前端开发的工作流程.我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并.雪碧图.启动server.版本控制 ...
- 这个小项目,上周被国外 AI 新闻网站报道,前些天又上了 github 热榜
疫情期间在校花了几个月时间,写了这个小项目,是关于音频特征提取和分析的,自己是 AI 专业研究音频的,但受限于对音频特征的理解,做研究时总感觉缺乏"底料",所以当做是学习练手做了这 ...
- C# 自定义并动态切换光标
系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs 本章介绍如何自定义光标.并动态切换光标类型. 动态切换光标类型 以白板书写为例 ...
- [OpenCV-Python] 5 视频
文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 5 视频 5.1 用摄像头捕获视频 5.2 从文件中播放视频 5.3 保存视频 OpenCV-Python: II Op ...
- 用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径
嘿嘿嘿.嘿嘿,俺又回来了! github代码地址 https://github.com/Tom-shushu/work-study 接口文档有道云 https://note.youdao.com/s/ ...
- IDP中的黄金路径究竟是什么?
在云原生时代,开发人员面临着越来越多的工具.技术.思维方式的选择,给他们带来了极大的认知负担和工作量.为了提高开发人员的开发效率与开发体验,一些头部科技公司开始建立自己的内部开发者平台(IDP).在之 ...
- Nuxt3.0中使用EChart可视化图表📊
在Nuxt3.0项目中用到了可视化图表,于是我用了EChart可视化图表库.但是在官网我没有找到针对在Nuxt3.0中使用EChart的方法,于是在这里记录我的引入EChart并简单使用的步骤.需要声 ...
- CTFShow 反序列化 Web 255-266
CTFShow 反序列化 255-266 漏洞原理 未队用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等后果. 触发条件 unserialize ...