Hibernate之helloworld 案例

// ==================== 1. pom.xml 依赖配置 ====================
/*
<project><dependencies><!-- Hibernate Core --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.6.10.Final</version></dependency><!-- MySQL Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><!-- 日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.36</version></dependency></dependencies>
</project>
*/// ==================== 2. 实体类 User.java ====================
package com.example.entity;import java.util.Date;public class User {private Long id;private String username;private String email;private String phone;private Date createTime;// 无参构造函数(Hibernate 必需)public User() {}public User(String username, String email, String phone) {this.username = username;this.email = email;this.phone = phone;this.createTime = new Date();}// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}@Overridepublic String toString() {return "User{id=" + id + ", username='" + username + "', email='" + email + "', phone='" + phone + "', createTime=" + createTime + '}';}
}// ==================== 3. 实体映射文件 User.hbm.xml ====================
/*
放在 src/main/resources/com/example/entity/User.hbm.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.example.entity"><class name="User" table="users"><!-- 主键映射 --><id name="id" column="id"><generator class="identity"/></id><!-- 属性映射 --><property name="username" column="username" type="string" length="50" not-null="true"/><property name="email" column="email" type="string" length="100" not-null="true"/><property name="phone" column="phone" type="string" length="20"/><property name="createTime" column="create_time" type="timestamp" not-null="true"/></class>
</hibernate-mapping>
*/// ==================== 4. Hibernate 配置文件 hibernate.cfg.xml ====================
/*
放在 src/main/resources/hibernate.cfg.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/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/testdb?useSSL=false&serverTimezone=UTC</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">password</property><!-- 数据库方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property><!-- 连接池配置 --><property name="hibernate.connection.pool_size">10</property><!-- 显示SQL --><property name="hibernate.show_sql">true</property><property name="hibernate.format_sql">true</property><!-- 自动建表策略:update表示更新表结构 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 当前Session上下文 --><property name="hibernate.current_session_context_class">thread</property><!-- 映射文件 --><mapping resource="com/example/entity/User.hbm.xml"/></session-factory>
</hibernate-configuration>
*/// ==================== 5. Hibernate 工具类 HibernateUtil.java ====================
package com.example.util;import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUtil {private static final SessionFactory sessionFactory;static {try {// 从 hibernate.cfg.xml 创建 SessionFactorysessionFactory = new Configuration().configure().buildSessionFactory();} catch (Throwable ex) {System.err.println("SessionFactory 创建失败: " + ex);throw new ExceptionInInitializerError(ex);}}public static SessionFactory getSessionFactory() {return sessionFactory;}public static void shutdown() {getSessionFactory().close();}
}// ==================== 6. DAO 接口 UserDao.java ====================
package com.example.dao;import com.example.entity.User;
import java.util.List;public interface UserDao {// 创建void save(User user);// 更新void update(User user);// 删除void delete(Long id);// 根据ID查询User findById(Long id);// 查询所有List<User> findAll();// 根据用户名查询List<User> findByUsername(String username);
}// ==================== 7. DAO 实现 UserDaoImpl.java ====================
package com.example.dao.impl;import com.example.dao.UserDao;
import com.example.entity.User;
import com.example.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import java.util.List;public class UserDaoImpl implements UserDao {@Overridepublic void save(User user) {Transaction tx = null;try (Session session = HibernateUtil.getSessionFactory().openSession()) {tx = session.beginTransaction();session.save(user);tx.commit();} catch (Exception e) {if (tx != null) tx.rollback();throw e;}}@Overridepublic void update(User user) {Transaction tx = null;try (Session session = HibernateUtil.getSessionFactory().openSession()) {tx = session.beginTransaction();session.update(user);tx.commit();} catch (Exception e) {if (tx != null) tx.rollback();throw e;}}@Overridepublic void delete(Long id) {Transaction tx = null;try (Session session = HibernateUtil.getSessionFactory().openSession()) {tx = session.beginTransaction();User user = session.get(User.class, id);if (user != null) {session.delete(user);}tx.commit();} catch (Exception e) {if (tx != null) tx.rollback();throw e;}}@Overridepublic User findById(Long id) {try (Session session = HibernateUtil.getSessionFactory().openSession()) {return session.get(User.class, id);}}@Overridepublic List<User> findAll() {try (Session session = HibernateUtil.getSessionFactory().openSession()) {Query<User> query = session.createQuery("FROM User", User.class);return query.list();}}@Overridepublic List<User> findByUsername(String username) {try (Session session = HibernateUtil.getSessionFactory().openSession()) {Query<User> query = session.createQuery("FROM User WHERE username LIKE :username", User.class);query.setParameter("username", "%" + username + "%");return query.list();}}
}// ==================== 8. 测试类 TestHibernateCRUD.java ====================
package com.example;import com.example.dao.UserDao;
import com.example.dao.impl.UserDaoImpl;
import com.example.entity.User;
import com.example.util.HibernateUtil;
import java.util.List;public class TestHibernateCRUD {public static void main(String[] args) {UserDao userDao = new UserDaoImpl();try {// 1. 创建用户System.out.println("========== 1. 创建用户 ==========");User user1 = new User("zhangsan", "zhangsan@example.com", "13800138000");User user2 = new User("lisi", "lisi@example.com", "13900139000");User user3 = new User("wangwu", "wangwu@example.com", "13700137000");userDao.save(user1);userDao.save(user2);userDao.save(user3);System.out.println("用户创建成功!");// 2. 查询所有用户System.out.println("\n========== 2. 查询所有用户 ==========");List<User> allUsers = userDao.findAll();allUsers.forEach(System.out::println);// 3. 根据ID查询System.out.println("\n========== 3. 根据ID查询 ==========");User foundUser = userDao.findById(1L);System.out.println("找到用户: " + foundUser);// 4. 更新用户System.out.println("\n========== 4. 更新用户 ==========");if (foundUser != null) {foundUser.setEmail("zhangsan_new@example.com");foundUser.setPhone("13811138111");userDao.update(foundUser);System.out.println("用户更新成功!");// 验证更新User updatedUser = userDao.findById(1L);System.out.println("更新后的用户: " + updatedUser);}// 5. 根据用户名搜索System.out.println("\n========== 5. 根据用户名搜索 ==========");List<User> searchResult = userDao.findByUsername("wang");System.out.println("搜索结果:");searchResult.forEach(System.out::println);// 6. 删除用户System.out.println("\n========== 6. 删除用户 ==========");userDao.delete(3L);System.out.println("用户删除成功!");// 验证删除System.out.println("\n删除后的所有用户:");List<User> remainingUsers = userDao.findAll();remainingUsers.forEach(System.out::println);} catch (Exception e) {e.printStackTrace();} finally {// 关闭 SessionFactoryHibernateUtil.shutdown();}}
}// ==================== 9. 数据库建表 SQL ====================
/*
CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARACTER SET utf8mb4;USE testdb;CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,phone VARCHAR(20),create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
*/// ==================== 项目结构说明 ====================
/*
项目结构:
src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── entity/
│ │ │ └── User.java
│ │ ├── dao/
│ │ │ ├── UserDao.java
│ │ │ └── impl/
│ │ │ └── UserDaoImpl.java
│ │ ├── util/
│ │ │ └── HibernateUtil.java
│ │ └── TestHibernateCRUD.java
│ └── resources/
│ ├── hibernate.cfg.xml
│ └── com/
│ └── example/
│ └── entity/
│ └── User.hbm.xml配置要点:
1. hibernate.cfg.xml:主配置文件,包含数据库连接和全局配置
2. User.hbm.xml:实体映射文件,定义对象与表的映射关系
3. HibernateUtil:管理 SessionFactory 的工具类
4. 事务管理:每个操作都需要手动管理事务
*/