当前位置: 首页 > article >正文

Hibernate:让对象与数据库无缝对话的全自动ORM框架

一、为什么需要全自动ORM?

在手动编写SQL的时代,开发者需要在Java代码和数据库表之间来回切换:

// Java对象
public class User {private Long id;private String name;// getters and setters
}// SQL语句
SELECT * FROM user WHERE id = ?;

Hibernate就像一个智能翻译官,让开发者只需关注Java对象,数据库操作由框架自动完成。

二、核心概念:对象关系映射(ORM)

1. ORM的三大核心功能

  • 对象持久化:将Java对象保存到数据库
  • 透明化查询:通过HQL(Hibernate Query Language)操作对象
  • 自动schema生成:根据实体类自动创建数据库表

2. 核心组件

组件名称功能描述类比说明
SessionFactory数据库连接工厂餐厅总厨
Session数据库操作会话厨师团队
EntityManagerJPA规范的核心接口厨房主管(更现代的API)
Criteria API类型安全的查询构建器智能菜谱生成器

三、工作原理:对象与数据库的对话流程

  1. 定义实体类 → 标注@Entity@Table
  2. 配置映射关系 → 使用注解或XML
  3. 创建SessionFactory → 读取配置并初始化
  4. 开启事务 → 开始数据库操作
  5. 保存/查询对象 → Hibernate自动生成SQL
  6. 提交事务 → 持久化变更到数据库

四、快速上手:10分钟实现用户管理

1. 添加依赖

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.6.12.Final</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>

2. 定义实体类

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

3. 配置Hibernate

<?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.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123456</property><property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property><property name="hibernate.hbm2ddl.auto">update</property><mapping class="com.example.entity.User"/></session-factory>
</hibernate-configuration>

4. 执行CRUD操作

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();try (Session session = sessionFactory.openSession()) {Transaction tx = session.beginTransaction();// 创建用户User user = new User();user.setName("张三");session.persist(user);// 查询用户User foundUser = session.find(User.class, 1L);System.out.println(foundUser.getName());// 更新用户foundUser.setName("李四");session.merge(foundUser);// 删除用户session.remove(foundUser);tx.commit();
}

五、高级特性:应对复杂业务场景

1. 关联映射

@Entity
public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOne@JoinColumn(name = "user_id")private User user;// 其他字段
}

2. 缓存机制

  • 一级缓存:默认开启,基于Session的本地缓存
  • 二级缓存:全局缓存,需集成Ehcache或Redis
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

3. 动态查询

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
query.select(root).where(cb.equal(root.get("name"), "张三"));List<User> users = session.createQuery(query).getResultList();

六、与Spring Boot集成

  1. 添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  1. 配置数据源:
spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: 123456jpa:hibernate:ddl-auto: updateshow-sql: true
  1. 定义Repository接口:
public interface UserRepository extends JpaRepository<User, Long> {List<User> findByNameContaining(String keyword);
}

七、性能优化实践

  1. 使用批量插入:
for (int i = 0; i < 1000; i++) {User user = new User();user.setName("User" + i);session.persist(user);if (i % 100 == 0) {session.flush();session.clear();}
}
  1. 延迟加载配置:
@One(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private Order order;
  1. 使用二级缓存:
@Cacheable
@Entity
public class User {// ...
}

八、对比其他持久层框架

特性HibernateMyBatisSpring Data JPA
SQL控制自动生成完全自定义自动生成
学习曲线陡峭平缓平缓
复杂查询依赖HQL直接写SQL方法名推导
开发效率
性能优化较困难直接优化SQL依赖JPQL优化

九、总结

Hibernate通过全自动ORMJPA规范的支持,大幅提升了数据库操作的开发效率。它特别适合快速原型开发不需要复杂SQL的项目。但在需要精细控制SQL的场景下(如高并发或复杂报表),建议结合MyBatis使用。掌握Hibernate,你将拥有构建数据驱动型应用的核心能力。

十、推荐学习资源

  1. Hibernate官方文档
  2. JPA入门教程
  3. 《Java Persistence with Hibernate》
  4. Hibernate与Spring集成指南

现在就动手写一个简单的Hibernate应用吧!你会发现,原来操作数据库也可以像操作Java对象一样自然。🚀

相关文章:

Hibernate:让对象与数据库无缝对话的全自动ORM框架

一、为什么需要全自动ORM&#xff1f; 在手动编写SQL的时代&#xff0c;开发者需要在Java代码和数据库表之间来回切换&#xff1a; // Java对象 public class User {private Long id;private String name;// getters and setters }// SQL语句 SELECT * FROM user WHERE id ?…...

TDengine 语言连接器(C/C++)

简介 C/C 开发人员可以使用 TDengine 的客户端驱动&#xff0c;即 C/C 连接器&#xff08;以下都用 TDengine 客户端驱动表示&#xff09;&#xff0c;开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...

英伟达Llama-3.1-Nemotron-Ultra-253B-v1语言模型论文快读:FFN Fusion

FFN Fusion: Rethinking Sequential Computation in Large Language Models 代表模型&#xff1a;Llama-3.1-Nemotron-Ultra-253B-v1 1. 摘要 本文介绍了一种名为 FFN Fusion 的架构优化技术&#xff0c;旨在通过识别和利用自然并行化机会来减少大型语言模型&#xff08;LLM…...

云曦月末断网考核复现

Web 先看一个BUUCTF中的文件一个上传题 [BUUCTF] 2020新生赛 Upload 打开后是一个文件上传页面 随便上传一个txt一句话木马后出现js弹窗&#xff0c;提示只能上传图片格式文件 说明有前端验证。我的做法是把一句话改为.jpg格式&#xff0c; 然后上传 访问发现虽然上传成功了…...

Flutter常用组件实践

Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…...

MySQL MVCC 机制详解

MySQL MVCC 机制详解 1. MVCC 基本概念 MVCC 是一种并发控制的方法&#xff0c;主要用于数据库管理系统&#xff0c;允许多个事务同时读取数据库中的同一个数据项&#xff0c;而不需要加锁&#xff0c;从而提高了数据库的并发性能。 ┌──────────────────…...

【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景

文章目录 C面试&#xff1a;封装、继承、多态的具象示例1. 封装 (Encapsulation)2. 继承 (Inheritance)3. 多态 (Polymorphism)综合示例&#xff1a;封装、继承、多态 C模板编程的理解与应用场景我对模板编程的理解C中最常用的模板编程场景1. STL (标准模板库)2. 通用容器实现3…...

0.机器学习基础

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必备三要素&#xff1a; 数据算法计算力 CPU、GPU、TPUGPU和CPU对比&#xff1a; GPU主要适合计算密集型任务&#xff1b;CPU主要适合I/O密集型任务&#xff1b; 【笔试问题】什么类型程序适合在GPU上运行&#xff1…...

系统与网络安全------网络通信原理(4)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 网络层解析 IP 网络层概述 位于OSI模型第三层作用 定义网络设备的逻辑地址&#xff0c;俗称网络层地址&#xff08;如IP地址&#xff09; 在不同的网段之间选择最佳数据转发路径 协议 IP协议 IP数据包…...

Java基础 4.12

1.方法的重载&#xff08;OverLoad&#xff09; 基本介绍 Java中允许同一个类&#xff0c;多个同名方法的存在&#xff0c;但要求形参列表不一致&#xff01; 如 System.out.println(); out是PrintStream类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 2.重载的快速入…...

XILINX DDR3专题---(1)IP核时钟框架介绍

1.什么是Reference Clock&#xff0c;这个时钟一定是200MHz吗&#xff1f; 2.为什么APP_DATA是128bit&#xff0c;怎么算出来的&#xff1f; 3.APP &#xff1a;MEM的比值一定是1:4吗&#xff1f; 4.NO BUFFER是什么意思&#xff1f; 5.什么情况下Reference Clock的时钟源可…...

clickhouse注入手法总结

clickhouse 遇到一题clickhouse注入相关的&#xff0c;没有见过&#xff0c;于是来学习clickhouse的使用&#xff0c;并总结相关注入手法。 环境搭建 直接在docker运行 docker pull clickhouse/clickhouse-server docker run -d --name some-clickhouse-server --ulimit n…...

React 组件样式

在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...

利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)

参考文档&#xff1a;链接: link_pyecharts 官方文档 1、map() 传入省份全称&#xff0c;date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 传入省份简称&#xff0c;date_pair 是列表套元组 [ ( ),( ) … ] 1、准备数据 population_data&#xff1a;简称经纬度 population_da…...

解决 Elasticsearch 分页查询性能瓶颈——从10分钟到秒级的优化实践

大家好&#xff0c;我是铭毅天下&#xff0c;一名专注于 Elasticsearch &#xff08;以下简称ES&#xff09;技术栈的技术爱好者。 今天我们来聊聊球友提出的一个实际问题&#xff1a; ES分页查询性能很差&#xff0c;使用from/size方式检索居然需要10分钟&#xff01; 这是一个…...

记录IBM服务器检测到备份GPT损坏警告排查解决过程

服务器设备&#xff1a;IBM x3550 M4 Server IMM默认IP地址&#xff1a;192.168.70.125 用户名&#xff1a;USERID 密码&#xff1a;PASSW0RD&#xff08;注意是零0&#xff09; 操作系统&#xff1a;Windows Hyper-V Server 2016 IMM Web System Status Warning&#xff1…...

毫米波测试套装速递!高效赋能5G/6G、新材料及智能超表面(RIS)研发

德思特&#xff08;Tesight&#xff09;作为全球领先的测试测量解决方案提供商&#xff0c;始终致力于为前沿技术研发提供高精度、高效率的测试工具。 针对毫米波技术在高频通信、智能超表面&#xff08;RIS&#xff09;、新材料等领域的快速应用需求&#xff0c;我们推出毫米…...

Linux中卸载宝塔面板

输入命令 wget http://download.bt.cn/install/bt-uninstall.sh 执行脚本命令 sh bt-uninstall.sh 根据自己的情况选择1还是2 卸载完成校验 bt 这样我们的宝塔面板就卸载完了...

无人机的振动与噪声控制技术!

一、振动控制技术要点 1. 振动源分析 气动振动&#xff1a;旋翼桨叶涡脱落&#xff08;如叶尖涡干涉&#xff09;、动态失速&#xff08;Dynamic Stall&#xff09;引发的周期性气动激振力&#xff08;频率与转速相关&#xff09;。 机械振动&#xff1a;电机偏心、传动轴不…...

Linux(CentOS10) gcc编译

本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下&#xff09;编译出错&#xff0c;改正代码后发布此文章&#xff1a; #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…...

【蓝桥杯】第十六届蓝桥杯 JAVA B组记录

试题 A: 逃离高塔 很简单&#xff0c;签到题&#xff0c;但是需要注意精度&#xff0c;用int会有溢出风险 答案&#xff1a;202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…...

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型&#xff08;工作方式&#xff09;计时器BMA&#xff08;以太网&#xff09;broadcast &#xff0c;需要DR/BDR的选举hello&#xff1a;10s…...

微信小程序运行机制详解

微信小程序运行机制详解 微信小程序是介于 Web 和原生 App 之间的一种应用形态&#xff0c;具有无需安装、用完即走、体验流畅的特点。本文将从架构层面、运行环境、通信机制等方面深入剖析微信小程序的运行机制。 一、小程序运行架构概览 微信小程序采用双线程模型&#xff…...

python+requests接口自动化测试框架实例教程

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行…...

2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、空间-&#xff08;题解&#xff09;-字节单位转换 2、卡片-&#xff08;题解&#xff09;-可以不用当组合来写&#xff0c;思维题 3、直…...

spark课后总结

Spark运行架构 &#xff1a; 运行架构 Spark 采用master - slave&#xff08;主从&#xff09;结构。Driver 相当于master&#xff0c;负责管理集群中的作业任务调度&#xff1b;Executor 相当于slave&#xff0c;负责实际执行任务 核心组件 Driver&#xff1a;是Spark驱动…...

智能资源管理机制-重传机制

一、发送端资源管理的核心机制 1. 滑动窗口&#xff08;Sliding Window&#xff09; 这是TCP协议的核心优化设计&#xff1a; 窗口动态滑动&#xff1a;发送端不需要保留所有已发送的分组&#xff0c;只需维护一个"发送窗口"窗口大小&#xff1a;由接收方通告的接…...

设计模式 --- 原型模式

原型模式是创建型模式的一种&#xff0c;是在一个原型的基础上&#xff0c;建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销&#xff0c;我们可以使用原型模式来建立一个非常类似于复印机的…...

基于SiamFC的红外目标跟踪

基于SiamFC的红外目标跟踪 1,背景与原理2,SiamFC跟踪方法概述2.1 核心思想2.2 算法优势3,基于SiamFC的红外跟踪代码详解3.1 网络定义与交叉相关模块3.2 SiamFC 跟踪器实现3.3 主程序:利用 OpenCV 实现视频跟踪4,总结与展望在红外监控、无人机防御以及低光照场景中,红外图…...

多模态学习分析(MLA)驱动高中差异化教学策略研究

一、引言 1.1 研究背景 在当今时代&#xff0c;教育数字化转型的浪潮正席卷全球&#xff0c;深刻地改变着教育的面貌。这一转型不仅是技术的革新&#xff0c;更是教育理念、教学模式和教育管理的全面变革。随着互联网、大数据、人工智能等现代信息技术在教育领域的广泛应用&a…...