在Spring Boot项目中使用JPA

news2025/1/21 21:59:28

1.集成Spring Data JPA

Spring Boot提供了启动器spring-boot-starter-data-jpa,只需要添加启动器(Starters)就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。

步骤01 添加JPA依赖。

首先创建新的Spring Boot项目,在项目的pom.xml中增加JPA相关依赖,具体代码如下:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

在上面的示例中,除了引用spring-boot-starter-data-jpa之外,还需要依赖MySQL驱动mysql-connector-java。

步骤02 添加配置文件。

在application.properties中配置数据源和JPA的基本相关属性,具体代码如下:

spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#JPA配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#SQL输出
spring.jpa.show-sql=true
#format 下SQL输出
spring.jpa.properties.hibernate.format_sql=true

在上面的参数中,主要是配置数据库的连接以及JPA的属性。下面重点分析一下JPA中的4个配置。

1)spring.jpa.properties.hibernate.hbm2ddl.auto:该配置比较常用,配置实体类维护数据库表结构的具体行为。当服务首次启动时会在数据库中生成相应的表,后续启动服务时,如果实体类有增加属性就会在数据中添加相应字段,原来的数据仍然存在。

  • update:常用的属性,表示当实体类的属性发生变化时,表结构跟着更新。
  • create:表示启动时删除上一次生成的表,并根据实体类重新生成表,之前表中的数据会被清空。
  • create-drop:表示启动时根据实体类生成表,但是当sessionFactory关闭时表会被删除。
  • validate:表示启动时验证实体类和数据表是否一致。
  • none:什么都不做。

2)spring.jpa.show-sql:表示hibernate在操作时在控制台打印真实的SQL语句,便于调试。

3)spring.jpa.properties.hibernate.format_sql:表示格式化输出的JSON字符串,便于查看。

4)spring.jpa.properties.hibernate.dialect:指定生成表名的存储引擎为InnoDB。

步骤03 添加实体类。

首先,创建User实体类,它是一个实体类,同时也是定义数据库中的表结构的类,示例代码如下:

@Entity
@Table(name= "Users")
public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;
    @Column(length = 64)
    private String name;
    @Column(length = 64)
    private String password;
    private int age;

    public User() {

    }
    public User(String name,String password, int age) {
        this.name=name;
        this.password=password;
        this.age=age;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

在上面的示例中,使用@Table注解映射数据库中的表,使用@Column注解映射数据库中的字段。具体说明如下:

1)@Entity:必选的注解,声明这个类对应了一个数据库表。

2)@Table:可选的注解,声明了数据库实体对应的表信息,包括表名称、索引信息等。这里声明这个实体类对应的表名是Users。如果没有指定,则表名和实体的名称保持一致,与@Entity注解配合使用。

3)@Id注解:声明了实体唯一标识对应的属性。

4)@Column注解:用来声明实体属性的表字段的定义。默认的实体每个属性都对应表的一个字段,字段名默认与属性名保持一致。字段的类型根据实体属性类型自动对应。这里主要声明了字符字段的长度,如果不这么声明,则系统会采用255作为该字段的长度。

5)@GeneratedValue注解:设置数据库主键自动生成规则。strategy属性提供4种值:

  • AUTO:主键由程序控制,是默认选项。
  • IDENTITY:主键由数据库自动生成,即采用数据库ID自增长的方式,Oracle不支持这种方式。
  • SEQUENCE:通过数据库的序列产生主键,通过@SequenceGenerator注解指定序列名,MySQL不支持这种方式。
  • TABLE:通过特定的数据库表产生主键,使用该策略可以使应用更易于数据库移植。

除了上面使用到的@Entity注解、@Table注解等之外,还有一些常用的实体注解,具体说明如表9-1所示。这些注解用于描述实体对象与数据库字段的对应关系,需要注意的是,JPA与MyBatis是有区别的,千万别混淆。

在这里插入图片描述
步骤04 测试验证。

以上几步就是集成JPA的全部配置,配置完之后启动项目,就可以看到日志中显示如图所示的内容。

在这里插入图片描述
由图可知,系统启动后自动连接数据库,创建数据表结构,并打印出执行的SQL语句。如果查看数据库,可以看到数据库中对应的Users表也创建成功了,说明项目已经成功集成JPA并创建实体表。

2.JpaRepository简介

JpaRepository是Spring Data JPA中非常重要的类。它继承自Spring Data的统一数据访问接口——Repository,实现了完整的增、删、改、查等数据操作方法。JpaRepository提供了30多个默认方法,基本能满足项目中的数据库操作功能。

JpaRepository是实现Spring Data JPA技术访问数据库的关键接口。JpaRepository继承自PagingAndSortingRepository接口,而PagingAndSortingRepository接口继承自CrudRepository接口。CrudRepository和Repository接口则是Spring Data底层通用的接口,定义了几乎所有的数据库接口方法,统一了数据访问的操作。

另外,JPA提供了非常完善的数据查询功能,包括自定义查询、自定义SQL、已命名查询等多种数据查询方式。

3.实战:实现人员信息管理模块

JpaRespository默认实现完整的增、删、改、查等数据操作。只需定义一个Repository数据访问接口并继承JpaRepository类即可。下面通过之前创建的User用户类和表实现用户的增、删、改、查功能来演示用户管理模块的实现。

1. 定义Repository

首先创建UserRepository接口并加上@Repository注解,然后继承JpaRepository类,不需要编写任何代码,即可实现人员信息管理模块的全部功能。具体示例代码如下:

@Repository
public interface UserRepository extends JpaRepository<Users, Long> {

}

我们看到UserRepository虽然什么方法都没有定义,但是继承了JpaRepository之后,自然就拥有JpaRepository中的所有方法。

2. 实现新增、修改、删除、查询

(1)新增

接下来创建UserRepositoryTests单元测试类,并实现用户新增的测试方法。示例代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
    @Resource
    private UserRepository userRepository;

    @Test
    public void testSave() {
        User user = new User("ysxq","123456",40);
        userRepository.save(user);
    }
}

在上面的示例中,在UserRepositoryTests单元测试类中注入UserRepository对象,然后使用JpaRespository预生成的save()方法实现人员数据保存的功能。如下图所示:

在这里插入图片描述

在这里插入图片描述

(2)修改

修改与新增都使用save()方法,传入数据实体即可。JPA自动根据主键id修改user数据。示例代码如下:

    @Test
    public void testUpdate() {
        User user = userRepository.findById(1L).get();
        user.setPassword("z123456");
        userRepository.save(user);
    }

(3)删除

删除也非常简单,使用的是JpaRespository预生成的delete()方法,可以直接将对象删除,同时也可以使用deleteByXXX方法。示例代码如下:

    @Test
    public void testDetle() {
        User user = new User("ysxq","123456",40);
        userRepository.delete(user); 
    }

在这里插入图片描述

(4)查询

JPA对于数据查询的支持非常完善,有预生成的findById()、findAll()、findOne()等方法,也可以使用自定义的简单查询,还可以自定义SQL查询。示例代码如下:

    @Test
    public void testSelect() {
        userRepository.findById(1L);
    }

3. 验证测试

单击Run Test或在方法上右击,选择Run 'UserRepositoryTest’命令,运行全部测试方法,结果如图所示。

在这里插入图片描述
结果表明人员信息的增、删、改、查单元测试全部运行成功,并输出了相应的查询结果,说明使用JPA实现了人员信息管理功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git_回退到上一次commit与pull

git 回退到上个版本 rollback 回滚 git reset HEAD&#xff0c; git 回退到上一版本

Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces A 问多少次能使a 和 b相等&#xff0c;就是abs(a - b) / 2除c向上取整&#xff0c;也就是abs(a - b)除2c向上取整。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #de…

vue checkbox-group和checkbox动态生成,问题解决

源码 <el-checkbox-group v-model"form[keyItem.name]"><el-checkboxv-for"(checkboxItem,cindex) in keyItem.options.split(,)":key"cindex":label"checkboxItem"></el-checkbox></el-checkbox-group> 我是…

freertos之任务运行时间统计实验

这里写目录标题 任务时间统计函数时间统计API函数使用流程实验 任务时间统计函数 void vTaskGetRunTimeStats(char * pcWriteBuffer); 时间统计API函数使用流程 实验 1.首先现在FreeRTOSConfig.h文件里将configGENERATE_RUN_TIME_STATS 和configUSE_STATS_FORMATTING_FUNCTIO…

scanf和scanf_s函数详解

目录 引言&#xff1a; 1.scanf函数的用法&#xff1a; 2.scanf_s函数的用法&#xff1a; 3.scanf和scanf_s的区别&#xff1a; 结论&#xff1a; 引言&#xff1a; 在C语言中&#xff0c;输入函数scanf是非常常用的函数之一&#xff0c;它可以从标准输入流中读取数据并将其…

在学习编程的过程中,我会记录下以下内容:

在学习编程的过程中&#xff0c;我会记录下以下内容&#xff1a; 常用代码片段&#xff1a;我会记录一些常用的代码片段&#xff0c;例如文件读写、列表操作、字符串处理等。这些代码片段可以在日常编程中快速复用&#xff0c;提高编码效率。 # 文件读取 with open(file.txt,…

手术麻醉信息系统源码 医院麻醉监护的功能覆盖整个手术与麻醉的全过程

手术麻醉信息系统源码 PHP手麻系统源码 手术麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术后。 手…

0908集合总结

Java集合 Java的集合类主要由Collection接口和Map接口派生而来&#xff0c;其中Collection接口由两个常用的子接口&#xff0c;即List接口和Set接口&#xff0c;所以常说的Java集合框架由三大类接口构成&#xff08;Map接口、List接口和Set接口&#xff09; List接口 List的…

无锡哲讯与喜德金属联手推动“百城千园行”“十园千企”无锡站活动,数字化赋能活动动

当前&#xff0c;新一轮科技革命和产业革命席卷全球&#xff0c;数字经济发展速度之快、辐射之广、影响之深前所未有。2023年9月7日&#xff0c;为加快推进制造业智能化改造、数字化转型&#xff0c;促进供需两端精准对接&#xff0c;加速提升汽车及零部件产业集群企业智能制造…

【多线程】内存可见性

一、什么是内存可见性 内存可见性是在编译器优化的背景下&#xff0c;一个线程修改了变量而另一个线程却没有感知到修改。举个例子&#xff0c;一个线程一直频繁的读取变量n并将n值与某一值进行比较&#xff0c;在底层这个操作对应着两个指令&#xff1a;读取内存中的n值加载到…

【Redis】深入探索 Redis 的数据类型 —— 字符串 string

文章目录 前言一、string 类型的操作命令设置和获取相关命令1. SET 和 GET2. MSET 和 MGET3. SETNX、SETEX、SETPX 计数相关命令1. INCR 和 INCRBY2. DECR 和 DECRBY3. INCRBYFLOAT 字符串操作相关命令1. APPEND2. GETRANGE3. SETRANGE4. STRLEN string 相关命令总结 二、strin…

解决VSCode调试或者发布运行时闪退问题

解决方案&#xff1a;此方案不一定适合所有类型的闪退&#xff0c;但可以尝试一下。 步骤1&#xff1a;依次选择&#xff1a;文件→首选项→设置 步骤2&#xff1a;搜索 terminal.integrated.Default →找到Terminal > Integrated Default Profile: Windows选项→下拉框的…

Git 客户端基本使用及新手常见问题

Git作为一个版本管理工具&#xff0c;在企业中的应用越来越普遍。作为一个测试工程师&#xff0c;不可避免会需要接触到Git的相关操作&#xff0c;以下整理Git客户端的常见操作&#xff0c;以及应用中新手常碰到的一些问题。 1、环境安装及配置 Git下载地址&#xff1a;https…

YOLOV7改进-添加基于注意力机制的目标检测头(DYHEAD)

DYHEAD 复制到这&#xff1a; 1、models下新建文件 2、yolo.py中import一下 3、改IDetect这里 4、论文中说6的效果最好&#xff0c;但参数量不少&#xff0c;做一下工作量 5、在进入IDetect之前&#xff0c;会对RepConv做卷积 5、因为DYHEAD需要三个层输入的特征层一致&am…

【DS思想+堆贪心】CF595div3 D2

Problem - D2 - Codeforces 题意&#xff1a; 思路&#xff1a; 大家都说这是典&#xff0c;但是我不懂怎么个典法&#xff0c;可能堆贪心都是这样做的吗&#xff0c;不懂 首先肯定要贪心&#xff0c;对于一个坏点&#xff0c;优先删除覆盖别的点多的 考虑nlogn做法&#x…

9.177777777

Tomcat配置ssl 部署tomcat服务&#xff0c;项目做到用https访问&#xff0c;使用nginx去做&#xff0c;访问任意一个子网站&#xff0c;都是https 或者 医美项目需要 上传jdk 456 tomcat war包 [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/…

关于Greenplum Platform Extension Framework(PXF)

本文翻译自 https://docs.vmware.com/en/VMware-Greenplum-Platform-Extension-Framework/6.6/greenplum-platform-extension-framework/overview_pxf.html 随着数据存储和云服务的爆炸式增长&#xff0c;数据现在以各种格式驻留在许多不同的系统中。通常&#xff0c;数据根据…

Maven学习记录

一、Maven是什么 简单来说Maven是一个标准化的java管理和构建工具&#xff0c;它提供了一系列规范&#xff0c;包括项目结构&#xff0c;构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;&#xff0c;依赖管理等。 标准化就是定下…

科技项目验收怎么做?不通过怎么办?

CMA、CNAS 一、科技项目验收是什么&#xff1f; 科技项目验收测试是依据GB/T 17544《信息技术 软件包 质量要求和测试》、GB/T 16260《软件工程 产品质量》&#xff0c;对申报国家、省、市科技项目、或企业申请中小企业创新基金、科技项目验收、科技成果鉴定等提供软件产品第…

机器学习——自然语言处理(NLP)一

机器学习——自然语言处理&#xff08;NLP&#xff09;一 文章目录 前言一、TF-IDF算法1.1. 原理1.2. 算法步骤&#xff1a;1.2.1. 文本预处理1.2.2. 构建词袋模型1.2.3. 计算TF-IDF值1.2.4. 特征选择 1.3. 代码实现1.3.1. TF-IDF1.3.2 计数器向量化文本1.3.3. 两者的区别1.3.4…