创建Hibernate Web项目(配置类)

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";
    }
}
相关推荐
hyunbar7771 小时前
NOT IN 的 NULL 陷阱:一次 UNION 数据"神秘消失"
后端
basketball6162 小时前
Go语言从入门到进阶:8. 接口
开发语言·后端·golang
明月_清风2 小时前
深入 Go 并发编程:从 Goroutine 到 Channel 的系统性避坑指南
后端·go
雪隐2 小时前
AI股票小助手04-miniQMT数据采集
人工智能·后端
苏三说技术2 小时前
MybatisPlus Pro 来了,CURD开发效率直接拉满!
后端
小江的记录本2 小时前
【JVM虚拟机】类加载机制:类加载器、双亲委派模型、好处、破坏双亲委派的场景(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
李少兄2 小时前
Spring 对象创建范式:依赖注入与直接实例化的边界抉择
java·后端·spring
二月龙2 小时前
SpringBoot 简化开发的核心原理:告别繁琐配置
后端
Java内核笔记2 小时前
Spring Security 过滤器链全景图:从 FilterOrderRegistration 到实战配置
后端