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

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

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

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

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

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...