1 创建Maven项目
1.1 开发环境
(1) JDK11
(2) 开发工具:IDEA2021.1.3
(3) Hibernate:5.6.15.Final
1.2 创建项目
File > New > Project

设置maven配置
File > Settings > Build , Execution, Deployment > Build Tools > Maven

设置jdk版本
File > Project Structure

设置Tomcat
Run > Edit Configurations...

注释:配置完pom文件后可以继续下记配置

1.3 导入依赖
pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>hibernate_web</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.10</version>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
1.4 创建配置类
1.4.1 创建SpringMvcConfig
java
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@ComponentScan({"com.example.controller"})
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
}
1.4.2 创建SpringConfig
java
package com.example.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
}
1.4.3 创建ServletAnnoInitConfig
java
package com.example.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletAnnoInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
1.5 创建数据库
MySQL8.0
创建数据库:create database hibernatedb
1.6 Spring整合Hibernate
1.6.1 数据库连接信息
resources/jdbc.properties
java
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hibernatedb
jdbc.username=root
jdbc.password=root
java
package com.example.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import com.alibaba.druid.pool.DruidDataSource;
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// 配置数据源
@Bean
public DruidDataSource druidDataSource() {
DruidDataSource d = new DruidDataSource();
d.setDriverClassName(driver);
d.setUrl(url);
d.setUsername(username);
d.setPassword(password);
return d;
}
}
1.6.2 Hibernate配置类
java
package com.example.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import java.util.Properties;
@Configuration
public class HibernateConfig {
@Bean
public LocalSessionFactoryBean sessionFactory(DruidDataSource dataSource) {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 扫描实体类
sessionFactory.setPackagesToScan("com.example.pojo");
// 配置 Hibernate 属性
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");
hibernateProperties.setProperty("hibernate.show_sql", "true");
// Hibernate 6 通常能自动检测方言,如需指定:
// hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
sessionFactory.setHibernateProperties(hibernateProperties);
return sessionFactory;
}
// 配置事务控制
@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
}
1.6.3 Spring整合
java
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan({"com.example.service"})
@PropertySource("classpath:jdbc.properties") // 加载properties文件
@Import({JdbcConfig.class,HibernateConfig.class}) // 导入数据源实现类
@EnableTransactionManagement // 启动事务管理注解
public class SpringConfig {
}
1.7 业务处理
1.7.1 Pojo
java
package com.example.pojo;
import lombok.Data;
import javax.persistence.*;
@Entity
@Table(name="tb_user")
@Data
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private Long id;
@Column(name="user_name")
private String name;
}
1.7.2 Service
java
package com.example.service;
import com.example.pojo.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional // Spring 会自动在此方法开始前开启事务,结束后提交或回滚
public class TestServiceImpl {
@Autowired
private SessionFactory sessionFactory;
// 插入
public void insertUser(User user) {
// 1. 获取当前线程绑定的 Session (由 Spring 事务管理器管理)
// 如果当前没有事务,这会抛出 HibernateException,提醒你需要事务上下文
Session session = sessionFactory.getCurrentSession();
// 2. 直接执行持久化操作
// Spring 会在方法正常结束时自动 commit,异常时自动 rollback
session.save(user);
// 注意:不需要手动 beginTransaction, commit, close
// Session 的生命周期由 Spring 管理
}
// 更新
public void updateUser(User user) {
Session session = sessionFactory.getCurrentSession();
session.update(user);
}
// 删除
public void deleteUser(User user) {
Session session = sessionFactory.getCurrentSession();
session.delete(user);
}
// 查询(懒加载)
public void saveOrUpdateUser(User user) {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(user);
}
// 查询(立即加载)
public User findUser(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.get(User.class, id);
}
// 查询(懒加载)
public User loadUser(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.load(User.class, id);
}
// 查询更新对象
public void updateUserObj(Long id) {
Session session = sessionFactory.getCurrentSession();
User user = session.get(User.class, id);
user.setName("王五");
}
}
1.7.3 Controller
java
package com.example.controller;
import com.example.pojo.User;
import com.example.service.TestServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/")
public class TestController {
@Autowired
private TestServiceImpl service;
@RequestMapping("insert1")
public String insert1() {
// 临时状态,插入
User user = new User();
user.setName("张三");
service.insertUser(user);
return "insert1";
}
@RequestMapping("insert2")
public String insert2() {
// 主键策略自增,更新Id后,插入(不存在主键冲突)
User user = new User();
user.setId(1L);
user.setName("张三");
service.insertUser(user);
return "insert2";
}
@RequestMapping("insert3")
public String insert3() {
// 复制查询到的数据, 主键策略更新Id后,插入
User user = service.findUser(1L);
service.insertUser(user);
return "insert3";
}
@RequestMapping("update1")
public String update1() {
// 游离状态,存在id为1的数据,正常更新
// 没有数据抛出异常
User user = new User();
user.setId(1L);
user.setName("李四");
service.updateUser(user);
return "update1";
}
@RequestMapping("update2")
public String update2() {
// 持久状态, 正常更新
service.updateUserObj(1L);
return "update2";
}
@RequestMapping("update3")
public String update3() {
// 查询后正常更新
User user = service.findUser(1L);
System.out.println("-----------");
user.setName("赵六");
service.updateUser(user);
return "update3";
}
@RequestMapping("delete1")
public String delete1() {
// 游离状态,正常删除
// 没有数据,删除异常
User user = new User();
user.setId(1L);
user.setName("张三");
service.deleteUser(user);
return "delete1";
}
@RequestMapping("delete2")
public String delete2() {
// 查询数据,正常删除
User user = service.loadUser(1L);
System.out.println("-----------");
service.deleteUser(user);
return "delete2";
}
}