Spring Boot 和 Hibernate 的简单整合

1,引言

Hibernate是一个全自动的ORM框架。ORM框架通过其独特的优势,‌可以简化开发、‌提高可维护性、‌跨数据库支持和提高性能等。为开发者节约大量的时间(当您用过其它的持久层框架后,你会对这句话深有体会)。

Spring Data JPA是由Spring公司开发的JPA应用框架,用于整合市面上已有的ORM框架,它默认使用Hibernate,可见Hibernate仍然是一个强大且稳定的持久层解决方案。

  • 请事先准备一个可以访问的MySQL数据库,记录下访问连接,用户名,密码。

2,创建项目

创建一个名为hibernate-demo的项目,使用Maven+JDK17。不会的请看 IntelliJ IDEA快速创建Spring Boot项目
在这里插入图片描述

3,编写代码

3.1 整体结构

最终项目结构,如下图。
在这里插入图片描述

3.3 修改pom.xml

这里用的springboot3.x的版本,对应的MySQL驱动需要mysql-connector-j。修改完成后,更新maven,等待资源下载完成。
在这里插入图片描述

<?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-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <!--  为Spring Boot项目提供一系列默认的配置和依赖管理-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--  Spring Boot核心依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Spring Boot单元测试和集成测试的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot构建Web应用程序的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot使用Spring Data JPA的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- mysql驱动-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

    </dependencies>

</project>

3.4 在resources下创建application.properties文件

需要配置好自己的数据库连接,用户名,密码。
在这里插入图片描述

#数据库连接
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
#数据库用户名
spring.datasource.primary.username=您的数据库用户名
#数据库密码
spring.datasource.primary.password=您的数据库密码
#自动更新数据库
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#显示sql
spring.jpa.show-sql=true
#在视图渲染过程中不执行数据库查询
spring.jpa.open-in-view=false

3.5 将Main类,修改为Spring Boot启动类

在这里插入图片描述

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

}

3.6 创建entity包和User类

User类就是实体类,和数据库中的表对应。
在这里插入图片描述

package org.example.entity;


import jakarta.persistence.*;

import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "t_user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long createrId;

    private Date createTime;

    private Long modifierId;

    private Date modificationTime;

    private String name;

    private String phone;

    public User() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getCreaterId() {
        return createrId;
    }

    public void setCreaterId(Long createrId) {
        this.createrId = createrId;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Long getModifierId() {
        return modifierId;
    }

    public void setModifierId(Long modifierId) {
        this.modifierId = modifierId;
    }

    public Date getModificationTime() {
        return modificationTime;
    }

    public void setModificationTime(Date modificationTime) {
        this.modificationTime = modificationTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

3.7 创建dao包和PrimaryDaoService类、PrimaryDaoServiceImpl类

dao包中的类就是数据库操作类,封装了数据库操作的方法。在这里插入图片描述

package org.example.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface PrimaryDaoService {

	public <T> void save(T o);

	public <T> void delete(T o);

	public <T> void update(T o);

	public <T> T get(Class<T> c, Serializable id);

	public List<Map<String, Object>> getListBySql(String sql);

}

package org.example.dao;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import org.example.entity.User;
import org.hibernate.query.sql.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;


@Repository
public class PrimaryDaoServiceImpl implements PrimaryDaoService {

    @PersistenceContext(unitName = "primaryEntityManager")
    private EntityManager entityManager;


    @Override
    public <T> void save(T o) {
        if (null != o) {
            if (o instanceof User) {
                User data = (User) o;
                data.setCreateTime(new Date());
                data.setModificationTime(new Date());
                data.setCreaterId(-1l);
                data.setModifierId(-1l);
            }
            entityManager.persist(o);
        }
    }

    @Override
    public <T> void delete(T o) {
        if (null != o) {
            entityManager.remove(o);
        }
    }

    @Override
    public <T> void update(T o) {
        if (null != o) {
            entityManager.merge(o);
        }
    }

    @Override
    public <T> T get(Class<T> c, Serializable id) {
        if (null != id) {
            return (T) entityManager.find(c, id);
        }
        return null;
    }

    @Transactional(readOnly = true)
    @Override
    public List<Map<String, Object>> getListBySql(String sql) {
        Query q = entityManager.createNativeQuery(sql);
        q.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        return q.getResultList();
    }


}

3.8 创建controller包和UserController类

UserController类用于测试,正常情况下还需要创建service层,在service层操作数据库,但是这里为了方便测试,就直接在controller层操作数据库。
注意@Transactional(value = “primaryTransactionManager”)是事务注解,增、删、改数据时,必须加这个注解才能成功。
在这里插入图片描述

package org.example.controller;

import org.example.dao.PrimaryDaoService;
import org.example.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;


@Controller
@RequestMapping("/UserController")
public class UserController {
    @Autowired
    protected PrimaryDaoService primaryDao;


    @RequestMapping(value = "/test")
    @ResponseBody
    @Transactional(value = "primaryTransactionManager")
    public Object test() throws Exception {
        User user = new User();
        user.setName("张三");
        user.setPhone("12345678901");
        primaryDao.save(user);
        return user;
    }


}

3.9 创建conf包和PrimaryDbConfig类

PrimaryDbConfig类用于配置JPA相关信息。
在这里插入图片描述

package org.example.conf;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/*
 *
 * 数据库配置
 *
 * basePackages:JPA扫描配置
 * entityManagerFactoryRef:实体扫描配置
 * transactionManagerRef:事务配置
 *
 * */
@Configuration
@EnableJpaRepositories(basePackages = "org.example.dao", entityManagerFactoryRef = "primaryEntityManager", transactionManagerRef = "primaryTransactionManager")
public class PrimaryDbConfig {

    private final Logger log = LoggerFactory.getLogger(getClass());

    private DataSource dataSource;

    private LocalContainerEntityManagerFactoryBean entityManager;

    /*
     * 创建数据库连接
     * @Primary 配置多个数据源时,用于标记主库
     * @ConfigurationProperties 指定配置文件中的属性前缀
     *
     * */
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    @Bean(name = "primaryDataSource")
    public DataSource primaryDataSource() {
        dataSource = DataSourceBuilder.create().build();
        log.info("正在连接数据库1...");
        return dataSource;
    }

    /*
     * 实体扫描配置
     *
     * 方法名与类注解中的entityManagerFactoryRef的值保持一致,配置多个数据源时方法名不能相同
     *
     * */
    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean primaryEntityManager(EntityManagerFactoryBuilder builder) {
        log.info("正在扫描接数据库1的实体类...");
        entityManager = builder.dataSource(dataSource).packages("org.example.entity")
                .persistenceUnit("primaryPersistenceUnit").build();
        return entityManager;
    }

    /*
     * 事务配置
     *
     * 方法名与类注解中的transactionManagerRef的值保持一致,配置多个数据源时方法名不能相同
     *
     * */
    @Bean
    @Primary
    PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {
        log.info("正在配置接数据库1的事务管理器...");
        return new JpaTransactionManager(entityManager.getObject());
    }
}

4,运行代码

4.1 创建数据库

首先在使用您的数据库工具,在MySQL中创建一个数据库test1,与application.properties中的配置的数据库相对应。
在这里插入图片描述

4.2 启动项目

在Main上右键Run,启动项目。
在这里插入图片描述

4.3 Hibernate自动创建表

项目启动后,控制台可以看出,Hibernate自动创建了t_user表,这与User类的@Table注释内容一致。
在这里插入图片描述然后从数据库工具中,也可以看到test1库下已创建了t_user表。
在这里插入图片描述

4.4 测试新增数据

打开浏览器访问http://localhost:8080/UserController/test,可以看到页面上有一行数据,刚好和UserController类中的代码功能一致,同时控制台也打印出了insert语句,说明调用成功。
在这里插入图片描述
在这里插入图片描述

4.5 测试成功

打开数据库工具中,看到t_user表里面多了一条数据,表示数据新增成功。自此Spring Boot和Hibernate 简单整合完成。
在这里插入图片描述

<think>首先,用户的问题是:“我想在Spring Boot 2.5中使用Jakarta EE相关技术或依赖的配置方法 请问how to configure and use Jakarta EE dependencies in Spring Boot 2.5”。这翻译成英文是“How to configure and use Jakarta EE dependencies in Spring Boot 2.5”。 关键点是: - Spring Boot 2.5 - 使用Jakarta EE依赖 从系统级指令中,我有一些引用: - 引用[1]:Jakarta EE是Java EE的演变。Tomcat 10及以后版本实现了Jakarta EE规范,而Tomcat 9及更早版本实现了Java EE规范。 - 其他引用是关于Spring配置的,但用户的问题焦点是Jakarta EE在Spring Boot 2.5中的集成。 用户提到“Spring Boot 2.5”,所以我需要回想Spring Boot 2.5的Jakarta EE支持。 背景知识: - Jakarta EE是Eclipse基金会从Oracle接管Java EE后的新名称。 - Spring Boot通常使用Jakarta EE规范,但需要确保兼容性,特别是Servlet容器。 - Spring Boot 2.5默认使用Tomcat 9(如果使用内置Tomcat),Tomcat 9支持Java EE规范,而不是Jakarta EE。 - 要使用Jakarta EE,可能需要升级到Tomcat 10或使用其他支持Jakarta EE的容器。 根据引用[1]:Tomcat 10及以后实现Jakarta EE规范,Tomcat 9及更早实现Java EE规范。 因此,在Spring Boot 2.5中使用Jakarta EE依赖,可能需要: 1. 升级到支持Jakarta EE的Servlet容器,如Tomcat 10。 2. 确保依赖使用Jakarta命名空间(例如,jakarta.servlet而不是javax.servlet)。 Spring Boot 2.5的默认Tomcat版本是Tomcat 9,它使用javax.servlet。Spring Boot 3.0开始支持Jakarta EE 9+,使用jakarta.servlet。 所以,对于Spring Boot 2.5,用户需要手动配置来使用Jakarta EE。 可能的步骤: - 添加Tomcat 10依赖,覆盖默认的Tomcat 9。 - 更新所有依赖使用Jakarta EE版本(例如,从javax迁移到jakarta)。 用户可能想使用如Jakarta Persistence (JPA)、Jakarta Servlet等。 回答结构: - 解释Jakarta EESpring Boot 2.5的兼容性。 - 提供配置步骤。 - 包括代码示例。 - 确保使用中文回答。 - 添加相关问题。 回答中引用的段落末尾自然地添加引用标识,如[^1]。 从提供的引用: - [^1] 关于Tomcat版本。 - [^4] 提到过滤器注册Servlet容器,相关。 其他引用是关于Spring SecurityXML配置的,不太直接相关,但可以参考。 核心步骤: 1. **检查Spring Boot版本Tomcat版本**:Spring Boot 2.5默认使用Tomcat 9,支持Java EE。 2. **升级到Tomcat 10**:为了使用Jakarta EE,需要覆盖Spring Boot的Tomcat starter。 3. **更新依赖**:确保所有EE依赖使用jakarta.*包。 4. **配置示例**:在pom.xml中添加依赖。 例如: - 在pom.xml中,排除Tomcat 9并添加Tomcat 10: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>${tomcat.version}</version> <!-- 设置Tomcat 10版本 --> </dependency> ``` 然后设置属性:`<tomcat.version>10.0.x</tomcat.version>` - 对于其他Jakarta EE依赖,如JPA、CDI等,添加相应的Jakarta版本。 确保LaTeX格式正确:行内数学用$...$,独立公式用$$...$$,但这个问题可能不需要数学表达式,除非涉及公式。 生成相关问题。 完整回答结构: 1. 介绍Jakarta EE在Spring Boot 2.5中的支持情况。 2. 详细配置步骤。 3. 代码示例。 4. 注意事项。 5. 相关问题。</think>### 在Spring Boot 2.5中配置使用Jakarta EE依赖 Spring Boot 2.5 默认使用 Java EE 规范(如 `javax.*` 包),而 Jakarta EE 是其演进版本(使用 `jakarta.*` 包)。要在 Spring Boot 2.5 中使用 Jakarta EE 技术,需手动升级 Servlet 容器(如 Tomcat)并调整依赖。以下是详细步骤配置方法: #### 1. **理解兼容性问题** - Spring Boot 2.5 默认集成 Tomcat 9,它支持 **Java EE 8** 规范(使用 `javax.servlet` 等包),而非 Jakarta EE[^1]。 - Jakarta EE 9+ 使用 `jakarta.*` 命名空间(例如 `jakarta.servlet`),需升级到 Tomcat 10 或更高版本[^1]。 - 关键点:Spring Boot 3.0+ 原生支持 Jakarta EE 9+,但 Spring Boot 2.5 需手动配置迁移。 #### 2. **配置步骤** ##### (1) 升级到 Tomcat 10(支持 Jakarta EE) 在 `pom.xml` 中覆盖默认 Tomcat 依赖: ```xml <properties> <!-- 设置 Tomcat 10 版本 --> <tomcat.version>10.0.27</tomcat.version> <!-- 使用最新兼容版本 --> </properties> <dependencies> <!-- 排除默认 Tomcat 9 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 Tomcat 10 Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>${tomcat.version}</version> </dependency> </dependencies> ``` ##### (2) 添加 Jakarta EE 依赖 根据需求引入 Jakarta EE 组件,例如: - **Jakarta Servlet API**(用于 Web 层): ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <!-- 兼容 Tomcat 10 --> <scope>provided</scope> </dependency> ``` - **Jakarta Persistence (JPA)**(用于数据层): ```xml <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.0.0</version> </dependency> ``` - **其他组件**(如 CDI、JAX-RS)需使用 `jakarta.*` 包名的依赖。 ##### (3) 更新代码配置 - **代码迁移**:将所有 `import javax.*` 替换为 `import jakarta.*`(例如 `javax.servlet.Filter` → `jakarta.servlet.Filter`)。 - **过滤器注册**:如果自定义过滤器,需通过 `FilterRegistrationBean` 委托给 Servlet 容器管理[^4]: ```java @Bean public FilterRegistrationBean<MyFilter> myFilterRegistration() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); return registration; } ``` - **安全配置**:Spring Security 可能需调整,确保与 Jakarta EE 兼容(参考引用[3])。 #### 3. **验证配置** - 启动应用时检查日志,确认 Tomcat 版本: ``` o.a.catalina.core.StandardService : Starting service [Tomcat] o.a.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.0.27] ``` - 测试 Jakarta EE 功能,例如 Servlet 或 JPA 端点。 #### 4. **注意事项** - **依赖冲突**:确保所有 EE 相关依赖(如 Hibernate)使用 Jakarta 兼容版本。 - **性能影响**:Tomcat 10 在内存启动时间上可能略有增加,但优化后可忽略。 - **迁移工具**:使用 Eclipse Transformer 等工具自动化 `javax` → `jakarta` 包重命名。 - **限制**:Spring Boot 2.5 不支持 Jakarta EE 10 的全部特性,如需完整功能,建议升级到 Spring Boot 3.0+。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值