0

0

Java常用数据库操作类库与Hibernate

P粉602998670

P粉602998670

发布时间:2026-01-10 11:10:50

|

539人浏览过

|

来源于php中文网

原创

不该直接用JDBC写增删改查,因其需手动管理连接、防空指针、拼SQL、处理异常与事务,易出错且难维护;MyBatis强调SQL优先,Hibernate强调对象优先,二者设计哲学相反,选错将导致返工。

java常用数据库操作类库与hibernate

为什么不该直接用 JDBC 写增删改查

手写 JDBC 代码做 ConnectionPreparedStatementResultSet 管理,90% 的重复劳动都在防 NullPointerException、关资源、拼 SQL 字符串。一旦涉及多表关联或动态条件,if-else 套 SQL 字符串就很难维护。

  • 每条语句都要手动处理 try-catch-finally 关闭 StatementConnection
  • ResultSet 映射到对象要写大量 rs.getString("xxx"),字段名写错不报错,运行时才 SQLException
  • SQL 注入风险全靠人工检查 setString() 是否漏掉参数
  • 事务边界需手动调用 conn.setAutoCommit(false)rollback(),出错容易漏回滚

MyBatis 和 Hibernate 的根本区别在哪

二者都封装了 JDBC,但设计哲学相反:MyBatis 是“SQL 优先”,Hibernate 是“对象优先”。选错会导致后期大量返工。

  • MyBatis:你写 SQL(XML 或注解),它只负责参数绑定和结果映射。适合复杂查询、分库分表、需要精细控制执行计划的场景
  • Hibernate:你定义实体类和关系(@Entity@OneToMany),它自动生成 SQL。适合业务模型稳定、CRUD 占比高、团队熟悉 JPA 规范的项目
  • 关键差异点:Hibernate 默认开启一级缓存(Session 级),MyBatis 默认无缓存;Hibernate 有 N+1 查询问题(未配 @Fetch(FetchMode.JOIN) 时),MyBatis 可显式控制嵌套查询次数

Hibernate 中 save()persist()merge() 到底该用哪个

这三个方法表面都是“存数据”,但触发时机、返回值、对 detached 对象行为完全不同,混用会引发 IdentifierGenerationException 或脏数据覆盖。

  • save():立即执行 INSERT,返回生成的主键(如 Long),仅适用于 transient 对象;若传入已持久化对象,抛 NonUniqueObjectException
  • persist():不保证立即 INSERT(可能延迟到 flush),不返回主键(返回 void),更符合 JPA 规范;传入 detached 对象会抛异常
  • merge():核心是“合并状态”。无论传入 transient 还是 detached 对象,都会先 SELECT 查是否存在,再 INSERT 或 UPDATE;慎用——它会无条件覆盖数据库中已有字段值,哪怕你只改了其中一列
// 错误:用 merge 更新单字段,却导致其他字段被 null 覆盖
User user = new User();
user.setId(123L);
user.setName("New Name"); // 其他字段为 null
userRepository.merge(user); // 数据库中 email、phone 全变 null!

// 正确:用 saveOrUpdate() 或 JPQL UPDATE(绕过实体生命周期)
userRepository.save(user); // 若 id 存在则 update,前提是 entity 已加载过

Hibernate 性能陷阱:懒加载失效与二级缓存配置

@ManyToOne(fetch = FetchType.LAZY) 写了不代表真懒加载——只要启用了 Open Session in View(Spring Boot 默认开启),toString() 或日志打印时仍会触发 N+1 查询,且难以定位。

LANUX蓝脑商务网站系统
LANUX蓝脑商务网站系统

LANUX V1.0 蓝脑商务网站系统 适用于网店、公司宣传自己的品牌和产品。 系统在代码、页面方面设计简约,浏览和后台管理操作效率高。 此版本带可见即可得的html编辑器, 方便直观添加和编辑要发布的内容。 安装: 1.解压后,更换logo、分类名称、幻灯片的图片及名称和链接、联系我们等等页面。 2.将dbconfig.php里面的数据库配置更改为你的mysql数据库配置 3.将整个文件夹上传至

下载

立即学习Java免费学习笔记(深入)”;

  • 验证懒加载是否生效:关闭 spring.jpa.open-in-view=true,然后在 service 层外访问 user.getDepartment().getName(),应抛 LazyInitializationException
  • 二级缓存(ehcache / redisson)必须显式启用:@Cacheable 注解 + spring.jpa.properties.hibernate.cache.use_second_level_cache=true,否则所有缓存配置无效
  • Query Cache 需额外开启:hibernate.cache.use_query_cache=true,且每个查询需调用 query.setCacheable(true),否则只缓存实体不缓存查询结果

真正难的是权衡:二级缓存能减数据库压力,但引入缓存一致性问题(如手动 evict() 不及时)、序列化开销(实体类必须实现 Serializable)、以及测试环境难复现的脏读。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

735

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.4万人学习

Java 教程
Java 教程

共578课时 | 44.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号