Spring Boot 中的 JPA 是什么,如何使用

news2024/11/19 7:24:25

Spring Boot 中的 JPA 是什么,如何使用

简介

JPA (Java Persistence API) 是一种标准的 ORM (Object Relational Mapping) 规范,用于将 Java 对象映射到关系型数据库中。它提供了一种面向对象的方式来操作数据库,使得开发者可以更加方便地进行数据持久化操作。Spring Boot 是一个基于 Spring 框架的快速开发 Web 应用程序的工具,它提供了对 JPA 的支持,使得使用 JPA 进行数据持久化操作变得更加容易。

在这里插入图片描述

JPA 的优势

使用 JPA 进行数据持久化操作,有以下几个优势:

  • 高效性:JPA 可以根据对象模型自动生成 SQL 语句,大大降低了开发者手写 SQL 语句的工作量,同时也提高了 SQL 语句的执行效率。

  • 简化开发:JPA 的 API 简单易用,可以让开发者更加专注于业务逻辑的实现,而不是关注 SQL 语句的细节。

  • 可移植性:JPA 是一种规范,不依赖于具体的数据库实现,因此可以使得应用程序更加容易进行数据库的切换。

如何使用 JPA

在 Spring Boot 中使用 JPA,需要进行以下几个步骤:

1. 添加依赖

pom.xml 文件中添加以下依赖:

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

2. 配置数据源

application.properties 文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3. 创建实体类

创建一个实体类,使用 JPA 注解来映射到数据库中的表。例如,我们创建一个 User 类来映射到 user 表:

@Entity
@Table(name = "user")
public class User {

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

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer age;

    // 省略 getter 和 setter 方法
}

4. 创建 Repository

创建一个 Repository 接口,继承自 JpaRepository,用于对实体类进行 CRUD 操作。例如,我们创建一个 UserRepository 接口:

public interface UserRepository extends JpaRepository<User, Long> {
}

5. 使用 Repository

在需要进行数据持久化操作的地方,注入 UserRepository,即可使用其提供的方法对数据库进行操作:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User save(User user) {
        return userRepository.save(user);
    }

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}

JPA 常用注解

JPA 提供了许多注解来映射实体类与数据库表之间的关系,以下是 JPA 常用的注解:

  • @Entity:将实体类映射到数据库表上。

  • @Table:指定实体类映射到的数据库表名。

  • @Id:指定实体类中的属性为主键。

  • @GeneratedValue:指定主键的生成策略。

  • @Column:指定属性与数据库表中的字段的映射关系。

  • @OneToMany:指定一对多关系。

  • @ManyToOne:指定多对一关系。

  • @ManyToMany:指定多对多关系。

总结

JPA 提供了一种简单易用、高效性和可移植性的 ORM 解决方案,可以使得开发者更加专注于业务逻辑的实现。在 Spring Boot 中,使用 JPA 进行数据持久化操作也变得更加容易,只需要添加依赖、配置数据源、创建实体类和 Repository 接口,即可使用其提供的方法对数据库进行操作。JPA 提供了许多注解来映射实体类与数据库表之间的关系,开发者可以根据实际需求进行选择和使用。

附:完整代码示例

1. 添加依赖

pom.xml 文件中添加以下依赖:

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

2. 配置数据源

application.properties 文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3. 创建实体类

创建一个实体类,使用 JPA 注解来映射到数据库中的表。例如,我们创建一个 User 类来映射到 user 表:

@Entity
@Table(name = "user")
public class User {

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

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer age;

    // 省略 getter 和 setter 方法
}

4. 创建 Repository

创建一个 Repository 接口,继承自 JpaRepository,用于对实体类进行 CRUD 操作。例如,我们创建一个 UserRepository 接口:

public interface UserRepository extends JpaRepository<User, Long> {
}

5. 使用 Repository

在需要进行数据持久化操作的地方,注入 UserRepository,即可使用其提供的方法对数据库进行操作:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User save(User user) {
        return userRepository.save(user);
    }

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}

6. 控制器

创建一个控制器类,用于处理 HTTP 请求。例如,我们创建一个 UserController 类:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }

    @GetMapping
    public List<User> getUsers() {
        return userService.findAll();
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
    }
}

7. 启动应用程序

Application 类中添加 @EnableJpaRepositories 注解,启用 JPA 支持:

@SpringBootApplication
@EnableJpaRepositories
public class Application {

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

完整代码

@Entity
@Table(name = "user")
public class User {

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

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer age;

    // 省略 getter 和 setter 方法
}

public interface UserRepository extends JpaRepository<User, Long> {
}

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User save(User user) {
        return userRepository.save(user);
    }

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }

    @GetMapping
    public List<User> getUsers() {
        return userService.findAll();
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
    }
}

@SpringBootApplication
@EnableJpaRepositories
public class Application {

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

总结

本文介绍了 JPA 的优势、如何在 Spring Boot 中使用 JPA 进行数据持久化操作,以及 JPA 常用注解的使用。使用 JPA 可以使得开发者更加专注于业务逻辑的实现,同时也提高了 SQL 语句的执行效率。在 Spring Boot 中,使用 JPA 进行数据持久化操作变得更加容易,只需要添加依赖、配置数据源、创建实体类和 Repository 接口,即可使用其提供的方法对数据库进行操作。JPA 提供了许多注解来映射实体类与数据库表之间的关系,开发者可以根据实际需求进行选择和使用。

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

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

相关文章

【openGauss5.0企业版一主一备集群】—运维

【openGauss5.0企业版一主一备集群】—运维 &#x1f53b; 一、openGauss5.0主从集群的维护&#x1f530; 1.1 查看单个节点状态&#x1f530; 1.2 查看集群所有节点状态&#x1f530; 1.3 集群启停&#x1f530; 1.4 switchover 主备切换&#x1f530; 1.5 模拟主库宕机&#…

Git gui教程---第三篇 Git gui的使用 配置提交信息

配置提交信息 配置好提交的信息&#xff0c;跑路的话&#xff0c;别人也能找到你&#xff0c;哈哈哈。点击“编辑”&#xff0c;选择“选项”&#xff0c;需要关注的地方有三个&#xff0c;一个是全局的版本库&#xff0c;一个是TEST版本库&#xff0c;一个是合并工具。 全局代…

数据库表的创建以及操作

1.创建数据库Market,在Market中创建数据表customers&#xff0c;customers表结构如表4.6所示&#xff0c;按要求进行操作。 (1)创 建数 据库 Market。 (2)创建数据表custo mers, 在c_num字段 上添加主键约束 和自增 约束&#xff0c;在c_birth字段 上添加非空约束。 (3)将c_c…

梯度流(Gradient Flow):探索通往最小值之路

©PaperWeekly 原创 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP、神经网络 在这篇文章中&#xff0c;我们将探讨一个被称为“梯度流&#xff08;Gradient Flow&#xff09;”的概念。简单来说&#xff0c;梯度流是将我们在用梯度下降法中寻找最小值的过程中的各个点连…

【Linux】进程信号之信号的产生

进程信号 一 一、信号入门1、信号的一些特性2、信号的处理方式信号捕捉初识 3、Linux下的信号 二、信号的产生1、通过终端按键产生信号2、调用系统函数向进程发信号a、kill函数b、raise函数c、abort函数 3. 由软件条件产生信号4、硬件异常产生信号 结语 一、信号入门 什么是信号…

yolov7增加AFPN

论文学习&#xff1a;AFPN: Asymptotic Feature Pyramid Network for Object Detection-全新特征融合模块AFPN&#xff0c;完胜PAFPN_athrunsunny的博客-CSDN博客 论文的作者是说在yolo上效果有提升&#xff0c;不过还没有测试&#xff0c;具体还不清楚&#xff0c;把代码撸出来…

开源网安受邀参加2023全球数字经济大会,分享软件安全落地实践经验

近日&#xff0c;2023全球数字经济大会数字安全生态建设专题论坛在京隆重举行。作为2023全球数字经济大会的重要组成部分&#xff0c;本次论坛围绕“数字安全生态建设”这一主题&#xff0c;邀请政府主管部门、行业专家学者、关键信息基础设施运营主体、数字安全企业、数据要素…

第八章 实现商品详情数据异构及静态化

lua操作 设计图详解 1、 普通模式,用户获得redis数据需要经过nginx,php-fpm,php框架,再到redis 2 、直接模式,对于部分高并发请求, 为了提高吞吐率, 有必要砍掉一些环节和应用来实现快速响应,如上图,这里我们将普通模式中的php-fpm和php框架砍掉了。nginx直接从r…

arvr虚拟现实服务商为文旅行业提供全新的交互式营销体验

在AR领域&#xff0c;很多企业都会遇到场景化展示需求的问题&#xff0c;比如需要制作一个宣传片视频、远程协作软件或者产品营销等等&#xff0c;对于这样的场景制作需求&#xff0c;一般都是找像深圳华锐视点这样的第三方AR开发技术公司进行AR场景定制。 AR是将计算机生成的虚…

在萌诺母婴综合体旗下萌诺尊享(新华店)坐月子可以享受哪些服务?

第一次怀孕生孩子内心比较恐惧&#xff0c;尤其担心月子坐不好身体和身材难以恢复。在怀孕期间刷微博看到郑恺苗苗在萌诺尊享(新华店)坐月子的vlog&#xff0c;感觉这里的环境和服务都还不错&#xff0c;主要是看到苗苗在月子期间身材恢复的很快&#xff0c;于是和老公亲自去门…

深入理解计算机系统(一)

信息就是位上下文 #include<stdio.h>int main() {printf("hello,world\n");return 0; } 上面是一个hello程序。它的生命周期是从一个源程序开始的&#xff0c;就是程序员通过编辑器创建并保存的文本文件&#xff0c;文件名是hello.c。&#xff08;源程序实际…

QT 之蓝牙BLE编程

简介 使用PC蓝牙和蓝牙透传模块通讯。 准备 QT core gui bluetoothQT蓝牙库相关头文件 #include <QtBluetooth/qbluetoothglobal.h> #include <QtBluetooth/qbluetoothlocaldevice.h> #include <qbluetoothaddress.h> #include <qbluetoothdev…

造船码头行车/电动葫芦控制系统的无线技改

一、应用背景 近年来&#xff0c;我国造船业在高技术船舶研发和建造方面持续取得新突破&#xff0c;据统计截止到2022年&#xff0c;我国造船业完工量、新接订单量、手持订单量三大指标国际市场份额均保持世界前列。连续13年位居全球居首。随着船舶制造的综合能力不断提高&…

微信小程序制作 购物商城首页 【内包含源码】

1、实现效果 手机效果预览,这里的首页使用到了轮播图。页面图片数据可以替换成自己的数据。 2、开发者工具效果图 3、项目的目录结构 4、首页核心代码 4.1 index.js 这里用来存放数据,页面的数据。目前是假数据,也可以调用接口接收真实数据 // index.jsimport {request }…

spring-依赖注入的方式

setter注入-可选依赖注入 简单类型&#xff1a; 1.配置类 2.set方法 引用类型&#xff1a; 构造器注入-强制依赖注入 简单类型&#xff1a; 引用类型&#xff1a; 通过有参构造&#xff0c;获得需要注入的对象 <construct-arg />标签中name属性中填写的时构造方…

数据结构--二叉树的层遍历

数据结构–二叉树的层遍历 算法思想: ①初始化一个辅助 队列 \color{red}队列 队列 ②根结点入队 ③若队列非空&#xff0c;则队头结点出队&#xff0c;访问该结点&#xff0c;并将其左、右孩子插入队尾&#xff08;如果有的话) ④重复③直至队列为空 代码实现 typedef struc…

pycharm的环境配置运行

刚开始用pycharm打开一个项目文件时&#xff0c;由于没有配置文件&#xff0c; 程序是不能运行的 运行的按钮为灰色 此时在项目浏览器中右键点击项目主程序&#xff0c;在下拉菜单中选择运行&#xff0c; 快捷键为ctrlshiftF10在配置中会自动添加以主程序为名称的配置 这时可…

vue3实现折叠面板

总是忘记vue怎么实现折叠面板&#xff0c;记录一下&#xff0c;没有动画样式。 <div class"item-content padding15" style"font-size: 0.875rem;" click"changeCollapse(index)" v-for"(item, index) in collData.dataList" :key&…

mtk log、kernel log、adb log的详细使用

目录 mtk logkernel logadb log 打印MTK log&#xff0c;里面就包含了kernel层的log&#xff0c;像我们adb log打印的是上层应用的log&#xff0c;mtk log打印的则是更底层的log。 那么什么时候需要用到mtk log 呢&#xff1f; 就比如你想抓一些从关机到开机的log&#xff0c;…

基于 SpringBoot + Vue 的前后端分离的高校招生管理系统

【程序员徐师兄】&#xff1a;hello你好我是程序员徐师兄&#xff0c;6年大厂经验。很高兴你能来阅读&#xff0c;希望我们能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新…