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

Hibernate 详细教程_hibernate入门教程

mhr18 2025-02-19 13:04 21 浏览 0 评论

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 的应用程序。

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

相关推荐

甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入

IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...

甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云

IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...

Spring Boot 自定义数据源设置,这些坑你踩过吗?

你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...

一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

低代码建模平台-数据挖掘平台(低代码平台的实现方式)

现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...

navicat 17.2.7连接oracle数据库提示加载oracle库失败

系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...

开源“Windows”ReactOS更新:支持全屏应用

IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...

SSL 推出采用全模拟内置混音技术的模拟调音台Oracle

英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...

47道网络工程师常见面试题,看看有没有你不会的!

你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...

汉得信息:发布EBS系统安装启用JWS的高效解决方案

e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...

36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!

前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

手把手教你在嵌入式设备中使用SQLite3

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...

JAVA语言基础(java语言基础知识)

一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...

取消回复欢迎 发表评论: