Java Web之Hibernate的基础解析及使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Java Web之Hibernate的基础解析及使用

前言


面向对象(OO)思想是软件开发的基本思想 关系型数据库又是应用系统必不可少的一环,但是面向对象是从软件工程的基本原则发展而来,而关系型数据库却是从数学理论的基础诞生的,两者区别非常大,ORM(object relational mapping)于是应运而生


ORM是对象到关系的映射,它的作用是在关系型数据库和对象之间做一个自动映射,将数据库中的数据库映射成为对象,也就是持久化类,对关系型数据以对象的形式进行操作,减少应用开发过程中数据持久化的编程任务,可以把ORM理解成关系型数据和对象的一个纽带。开发人员只需要关注纽带一端映射的对象即可


Hibernate是众多ORM工具中的佼佼者。


一、Hibernate简介


作为一个优秀的持久层框架 Hibernate充分体现了ORM的设计理念,提供了高效的对象到关系型数据库的持久化服务,它将持久化服务从软件业务层中完全抽取出来,让业务逻辑的处理更加简单,程序之间的各种业务并非紧密耦合(UML的设计理念)


Hibernate体系概念图如下

image.png

Hibernate中有非常重要的三个类


1:配置类


主要负责管理Hibernate的配置信息以及启动Hibernate 在Hibernate运行时配置类会读取一些底层实现的基本信息,包括数据库的各种配置


2:会话工厂类


会话工厂类是生成Session的工厂,它保存了当前数据库中所有的映射关系,可能只有一个可选的二级数据缓存,并且它是线程安全的,但是会话工厂是一个重量级对象,它的初始化创建过程会耗费大量的系统资源


3:会话类


会话类是Hibernate中数据库持久化操作的核心,它将负责Hibernate所有的持久化核心,通过它可以对数据库进行增删改查,但它不是线程安全的。


二、Hibernate入门


1:获取Hibernate


从官方网站下载所需的jar包 网址如下


Hibernate


2:Hibernate配置文件


Hibernate通过读取默认的XML配置文件hibernate.cfg.xml加载数据库的配置信息,该配置文件被默认放于项目的classpath根目录下


连接mysql数据库配置如下

<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="connection.url">jdbc:mysql://localhost:3306/db_database16</property>
 <propert name="connection.username">root</property>
 <property name="connection.password">111</property>
 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 <property name="show_sql">true</property>
 <mapping resource="com/mr/employee/Employee.hbm.xml"/>
 <mapping resource="com/mr/user/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>


3:了解并编写持久化类


Hibernate中的持久化类有四条编程规则


1:实现一个默认的构造函数


所有的持久化类都必须含有一个默认的无参数构造方法


2:提供一个标识属性


3:使用非fianl类


4:为属性声明访问器


4:Hibernate映射


Hibernate的核心就是对象关系映射,对象和关系型数据库之间的映射通常是用XML文档来实现的,这个映射文档被设计成易读的,并且手工修改 示例如下

<?xml version="1.0" encoding="utf-8">
<DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<hibernate-mapping>
<class name="com.mr.User" table="tb_user">
  <id name="id" column="id" type="int">
  <generator class="native"/>
 </id>
 <property name="name" type="string" not-null="true" length="50">
 <column name="name"/>
 </property>
<property name="password" type="string" not-null="true" length="50">
<columnn name="password"/>
</property>
</class>
</hibernate-mapping>


三:Hibernate数据持久化


Hibernate实例状态分为三种


1:瞬时状态(transient)


通过java中的new关键字开辟内存空间创建的java对象,但是它并没有纳入Hibernate Session的管理中,如果没有变量对它引用,它将被JVM回收。


2:持久化状态(persistent)


与数据库中的数据关联,它总是与会话状态和事务关联在一起,当持久化状态对象发生改动时并不会立即执行数据库操作。只有当事务结束时,才会更新数据库


3:脱管状态(detached)


当持久化状态对象的session关闭后,这个对象就从持久化状态变为脱管状态,但是它仍然存在与数据库中的数据关联


三种状态关系如下

image.png

Hibernate初始化类

Configuration cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();


保存数据


Hibernate的数据持久化过程如下图所示

image.png



四:使用Hibernate的缓存


缓存是数据库数据在内存中的临时容器 是数据库与应用程序的中间件  如下图所示

1666441948414.jpg

1:一级缓存


一级缓存属于Session级缓存 所以它的声明周期与Session相同,它随Session创建而创建,随Session销毁而销毁


(Session间缓存不能共享,所以不能访问其他session的缓存)


下面实例中Hibernate只访问了一次数据库,第二次对象加载是从一级缓存中将该对象的缓存实例以结果的形式直接返回

Session session=null;
try{
 session=HibernateInitialize.getSession();
Product product=(Product)session.get(Product.class,new Integet("1"));
 System.out.printIn("第一次装载对象");
Product product2=(Product)session.get(Product.class,new Integet("1"));
  System.out.printIn("第二次装载对象");
}
catch(Exception e){
 e.printStackTrace();
}
finally{
HibernateInitialize.closeSession();
}


2:配置并使用二级缓存


Hibernate的二级缓存将由从属于一个SessionFactory的所有Session对象共享,当程序使用Session加载持久化对象时,Session首先会根据加载的数据类和唯一性标识在缓存中查找是否存在此对象的缓存实例 没有再向二级缓存中查找实例对象,如果还没有就直接访问数据库


配置二级缓存

<hibernate-configuration>
<session-factory>
 ...
<property name="hibernate.cache.use_second_level_cache">true</property> //开启二级缓存
<property name="hibernate.cache.provider_calss">//指定缓存产品提供商
org.hibernate.cache.EhCacheProvider</property>
</session-factory>
</hibernate-configuration>


在持久化的映射文件中需要指定缓存的同步策略

<hibernate-mapping>
 <class name="com.mr.product.Product" table="tab_product">
 <cache usage="read-only"/>
...
</class>
</hibernate-mapping>



相关文章
|
5天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
35 6
|
2天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
12 4
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2
|
6天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
5天前
|
Java 编译器 数据库连接
Java中的异常处理机制深度解析####
本文深入探讨了Java编程语言中异常处理机制的核心原理、类型及其最佳实践,旨在帮助开发者更好地理解和应用这一关键特性。通过实例分析,揭示了try-catch-finally结构的重要性,以及如何利用自定义异常提升代码的健壮性和可读性。文章还讨论了异常处理在大型项目中的最佳实践,为提高软件质量提供指导。 ####
|
6天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
17 3
|
8天前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
|
8天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
24 0
|
8天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
10 0
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
95 3

推荐镜像

更多