百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Hibernate 详细教程(hibernate教程菜鸟教程)

csdh11 2025-03-26 11:13 29 浏览

Hibernate 详细教程

目录

  1. 简介
  2. 环境搭建
  3. 基本概念
  4. 实体类映射
  5. 配置文件
  6. CRUD 操作
  7. 查询语言(HQL)
  8. 关联映射
  9. 事务管理
  10. 性能优化
  11. 总结

1. 简介

Hibernate 是一个强大的对象关系映射(ORM)框架,用于将 Java 对象与关系型数据库进行映射。它简化了数据库操作,使得开发者可以专注于业务逻辑而不是复杂的 SQL 编写和结果集处理。

为什么选择 Hibernate?

  • 减少样板代码:通过 ORM,开发者不需要编写大量的 JDBC 代码。
  • 跨平台支持:Hibernate 支持多种数据库,如 MySQL、Oracle、PostgreSQL 等。
  • 查询优化:Hibernate 提供了缓存机制和查询优化功能。
  • 易于维护:通过配置文件或注解,代码更加简洁易读。

2. 环境搭建

依赖项

首先,确保你已经安装了以下工具:

  • JDK 8 或更高版本
  • Maven 或 Gradle 构建工具
  • 数据库(如 MySQL)

Maven 依赖

在 pom.xml 中添加 Hibernate 和数据库驱动依赖:

\\\`xml org.hibernatehibernate-core5.4.32.Final

mysqlmysql-connector-java8.0.26

javax.persistencejavax.persistence-api2.2 \\\`

数据库设置

创建一个名为 hibernate_tutorial 的数据库,并创建一个表 users:

\\\`sql CREATE DATABASE hibernate\_tutorial; USE hibernate\_tutorial;

CREATE TABLE users ( id INT AUTO\_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) ); \\\`


3. 基本概念

会话工厂(SessionFactory)

SessionFactory 是线程安全的,通常在整个应用程序中只有一个实例。它负责创建 Session 对象。

会话(Session)

Session 是非线程安全的,代表与数据库的一次对话。它用于执行 CRUD 操作。

事务(Transaction)

Transaction 用于管理一组数据库操作,确保它们要么全部成功,要么全部失败。


4. 实体类映射

使用注解映射实体类

创建一个名为 User.java 的实体类,并使用 JPA 注解进行映射:

\\\`java import javax.persistence.\*;

@Entity @Table(name = "users") public class User {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id;

@Column(name = "name", nullable = false) private String name;

@Column(name = "email", nullable = false, unique = true) private String email;

// Getters and Setters } \\\`

解释

  • @Entity:标识这是一个持久化实体类。
  • @Table:指定数据库中的表名。
  • @Id:标识主键字段。
  • @GeneratedValue:指定主键生成策略。
  • @Column:映射到数据库列,并设置约束条件。

5. 配置文件

hibernate.cfg.xml

创建一个 src/main/resources/hibernate.cfg.xml 文件来配置 Hibernate:




    
    
    	
    	root
    	123456
    	com.mysql.jdbc.Driver
    	jdbc:mysql:///hibernate

		
		
		org.hibernate.dialect.MySQLInnoDBDialect
	
		
    	true
    
    	
    	true
    
    	
    	update
    	
    	
    	2
    	
    	
    	true
    	
    	
    	10
    	5
    	2
    	
    	2000
    	2000
    	
    	10
    	
    	
    	100
    	
    	
    	30
    	
    	
    	
    	
    

    

解释

  • connection.driver_class:JDBC 驱动类。
  • connection.url:数据库连接 URL。
  • connection.username 和 connection.password:数据库用户名和密码。
  • dialect:指定数据库方言。
  • show_sql:是否显示执行的 SQL 语句。
  • hbm2ddl.auto:自动更新数据库表结构。
  • mapping:指定要映射的实体类。

6. CRUD 操作

创建 SessionFactory

在应用程序启动时创建 SessionFactory:

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration;
public class HibernateUtil { 
  private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() { 
  try { 
    return new Configuration().configure().buildSessionFactory(); 
      } catch (Throwable ex) { 
        System.err.println("Initial SessionFactory creation failed." + ex); 
        throw new ExceptionInInitializerError(ex);
      } 
}
public static SessionFactory getSessionFactory() { 
  return sessionFactory; 
} 
}

添加用户

import org.hibernate.Session; 
import org.hibernate.Transaction;
public class UserDao {
public void saveUser(User user) { 
  Transaction transaction = null; 
  try (Session session = HibernateUtil.getSessionFactory().openSession()) {
    transaction = session.beginTransaction(); 
    session.save(user);
    transaction.commit(); 
  } catch (Exception e) { 
    if (transaction != null) { 
      transaction.rollback(); 
    } e.printStackTrace();
  } 
} 
} 

查询用户

 import org.hibernate.query.Query; 
import java.util.List;
public List getAllUsers() {
  try (Session session = HibernateUtil.getSessionFactory().openSession()) { 
    Query query = session.createQuery("from User", User.class);
    return query.list(); 
  }
}

更新用户

 public void updateUser(User user) 
{ Transaction transaction = null; 
 try (Session session = HibernateUtil.getSessionFactory().openSession()) {
   transaction = session.beginTransaction();
   session.update(user); 
   transaction.commit(); } catch (Exception e) { 
     if (transaction != null) { 
       transaction.rollback(); 
     } e.printStackTrace(); 
   }
}

删除用户

 public void deleteUser(int userId) { 
   Transaction transaction = null; 
   try (Session session = HibernateUtil.getSessionFactory().openSession()) {
     transaction = session.beginTransaction();
     User user = session.get(User.class, userId); 
     if (user != null) { session.delete(user); } 
     transaction.commit();
   } catch (Exception e) { 
     if (transaction != null) {
       transaction.rollback(); } e.printStackTrace(); 
   } 
 }

7. 查询语言(HQL)

Hibernate 查询语言(HQL)是 Hibernate 提供的一种面向对象的查询语言。它类似于 SQL,但操作的是实体类而不是表。

示例:按名称查找用户

 public User getUserByName(String name) {
   try (Session session = HibernateUtil.getSessionFactory().openSession()) { 
     String hql = "FROM User u WHERE u.name = :name";
     Query query = session.createQuery(hql, User.class); 
     query.setParameter("name", name); 
     return query.uniqueResult(); 
   } 
 }

示例:分页查询

 public List getUsersWithPagination(int pageNumber, int pageSize) { 
   try (Session session = HibernateUtil.getSessionFactory().openSession()) { 
     String hql = "FROM User"; 
     Query query = session.createQuery(hql, User.class);
     query.setFirstResult((pageNumber - 1) * pageSize); 
     query.setMaxResults(pageSize); return query.list();
   } 
 }

8. 关联映射

一对一关联

假设我们有一个 Address 类,每个用户有一个地址:

 @Entity public class Address {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
   private int id;
private String street; 
   private String city;
@OneToOne(mappedBy = "address") 
   private User user;
// Getters and Setters 
 } 
@Entity public class User { 
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
  private int id;
@OneToOne(cascade = CascadeType.ALL) 
  @JoinColumn(name = "address\_id", referencedColumnName = "id") 
  private Address address;
// Getters and Setters 
} 

一对多关联

假设每个用户有多个订单:

 @Entity public class Order {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
   private int id;
private String product;
@ManyToOne @JoinColumn(name = "user_id") 
   private User user;
// Getters and Setters 
                            } 
@Entity public class User {
  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  private List orders;
// Getters and Setters 
} 

9. 事务管理

事务管理确保一组操作要么全部成功,要么全部失败。Hibernate 提供了简单的事务管理接口。

使用 Spring 进行声明式事务管理

如果你使用 Spring 框架,可以通过 @Transactional 注解简化事务管理:

 @Service @Transactional public class UserService {
@Autowired private UserDao userDao;
public void createUser(User user) { 
  userDao.saveUser(user);
}
// Other methods... 
 } 

10. 性能优化

一级缓存

Hibernate 默认启用了会话级别的缓存(一级缓存)。它会在同一个会话中缓存加载的对象,避免重复查询。

二级缓存

二级缓存是跨会话的缓存,适用于频繁读取的数据。你可以使用第三方缓存库(如 Ehcache)来实现二级缓存。

批量插入

对于大量数据插入,使用批量插入可以显著提高性能:

 public void batchInsertUsers(List users) { 
   Session session = HibernateUtil.getSessionFactory().openSession(); 
   Transaction transaction = session.beginTransaction();
for (int i = 0; i < users.size(); i++) { 
  session.save(users.get(i));
  if (i % 20 == 0) { // 20, same as the JDBC batch size 
    session.flush(); 
    session.clear(); 
  } 
}
transaction.commit();
   session.close();
 } 

11. 总结

通过本教程,我们学习了如何使用 Hibernate 进行基本的 CRUD 操作、查询、关联映射以及性能优化。Hibernate 是一个强大且灵活的 ORM 框架,能够帮助开发者更高效地开发基于 Java 的应用程序。

希望这篇教程对你有所帮助!如果有任何问题或建议,请随时提问。

相关推荐

NUS邵林团队发布DexSinGrasp基于强化学习实现物体分离与抓取统一

本文的作者均来自新加坡国立大学LinSLab。本文的共同第一作者为新加坡国立大学实习生许立昕和博士生刘子轩,主要研究方向为机器人学习和灵巧操纵,其余作者分别为硕士生桂哲玮、实习生郭京翔、江泽宇以及...

「PLC进阶」如何通过编写SCL语言程序实现物料分拣?

01、前言SCL作为IEC61131-3编程语言的一种,由于其高级语言的特性,特别适合复杂运算、复杂数学函数应用的场合。本文以FactoryIO软件中的物料分拣案例作为硬件基础,介绍如何通过SCL来实...

zk源码—5.请求的处理过程一(http1.1请求方法)

大纲1.服务器的请求处理链...

自己动手从0开始实现一个分布式 RPC 框架

前言为什么要自己写一个RPC框架,我觉得从个人成长上说,如果一个程序员能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信、异...

MLSys’25 | 极低内存消耗:用SGD的内存成本实现AdamW的优化性能

AIxiv专栏是机器之心发布学术、技术内容的栏目。过去数年,机器之心AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,...

线程池误用导致系统假死(线程池会自动销毁吗)

背景介绍在项目中,为了提高系统性能使用了RxJava实现异步方案,其中异步线程池是自建的。但是当QPS稍微增大之后却发现系统假死、无响应和返回,调用方出现大量超时现象。但是通过监控发现,系统线程数正常...

大型乘用车工厂布局规划(六大乘用车基地)

乘用车工厂的布局规划直接影响生产效率、物流成本、安全性和未来扩展能力。合理的布局应确保生产流程顺畅、物流高效、资源优化,并符合现代化智能制造和绿色工厂的要求。以下是详细的工厂布局规划要点:1.工厂布...

西门子 S7-200 SMART PLC 连接Factory IO的方法

有很多同学不清楚如何西门子200smart如何连接FactoryIO,本教程为您提供了如何使用西门子S7-200SMARTPLC连接FactoryIO的说明。设置PC和PLC之间的...

西门子博图高级仿真软件的应用(西门子博途软件仿真)

1.博图高级仿真软件(S7-PLCSIMAdvancedV2.0)S7-PLCSIMAdvancedV2.0包含大量仿真功能,通过创建虚拟控制器对S7-1500和ET200SP控制器进行仿真...

PLC编程必踩的6大坑——请对号入座,评论区见

一、缺乏整体规划:面条式代码问题实例:某快递分拣线项目初期未做流程图设计,工程师直接开始编写传送带控制程序。后期增加质检模块时发现I/O地址冲突,电机启停逻辑与传感器信号出现3处死循环,导致项目延期2...

统信UOS无需开发者模式安装软件包
统信UOS无需开发者模式安装软件包

原文链接:统信UOS无需开发者模式安装软件包...

2025-05-05 14:55 csdh11

100个Java工具类之76:数据指纹DigestUtils

为了提高数据安全性,保证数据的完整性和真实性,DigestUtils应运而生。正确恰当地使用DigestUtils的加密算法,可以实现数据的脱敏,防止数据泄露或篡改。...

麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包

#秋日生活打卡季#原文链接:...

Java常用工具类技术文档(java中工具类的作用)

一、概述Java工具类(UtilityClasses)是封装了通用功能的静态方法集合,能够简化代码、提高开发效率。本文整理Java原生及常用第三方库(如ApacheCommons、GoogleG...

软路由的用法(自动追剧配置)(软路由教学)

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:值友98958248861环境和需求...