热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot集成与使用JPA详解

本文详细介绍如何在SpringBoot项目中集成和使用JPA,涵盖JPA的基本概念、SpringDataJPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。

前言


在Spring Boot系列教程中,我们将深入探讨如何在Spring Boot项目中集成和使用JPA(Java Persistence API)。JPA是由Oracle(原Sun Microsystems)提出的一套Java持久化规范,旨在为Java开发人员提供一种对象/关系映射工具,用于管理Java应用中的关系数据。它的出现简化了持久化开发工作,并统一了ORM技术。



JPA概述


JPA本身是一套规范,而不是具体的产品。实现JPA规范的产品有很多,如Hibernate、TopLink等。这些产品提供了具体的实现细节,使得开发者可以在不同的ORM框架之间轻松切换。



Spring Data JPA


Spring Data JPA是Spring基于ORM框架和JPA规范封装的一套应用框架。它在Hibernate之上构建,提供了简洁的API来实现对数据库的访问和操作,包括增、删、改、查等常用功能。



Spring Boot整合Spring Data JPA


本节将详细介绍如何在Spring Boot项目中集成Spring Data JPA。



1. 添加依赖


在项目的`pom.xml`文件中添加Spring Data JPA的依赖:



org.springframework.boot
spring-boot-starter-data-jpa



2. 配置JPA


在`application.properties`文件中配置JPA的相关属性:


# 是否在日志中打印出自动生成的SQL,方便调试
spring.jpa.show-sql=true
# 数据库表结构自动更新
spring.jpa.hibernate.ddl-auto=update
# 格式化SQL语句
spring.jpa.hibernate.format_sql=true


`spring.jpa.hibernate.ddl-auto`的常见属性及其作用:



  • create: 每次加载Hibernate时都会删除上一次的表,然后根据模型类重新生成新表。

  • create-drop: 每次加载Hibernate时根据模型类生成表,但Session工厂关闭时表会自动删除。

  • update: 第一次加载Hibernate时根据模型类自动建立表结构,以后加载时根据模型类自动更新表结构,但不会删除已有数据。

  • validate: 每次加载Hibernate时验证数据库表结构,不会创建新表,但会插入新值。

  • none: 不使用DDL自动操作。



3. 创建JPA实体类


在Spring Boot中,实体类通常使用`@Entity`注解标记,并且需要指定主键和其他字段。以下是一个简单的JPA实体类示例:


@Entity
@Data
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private String userName;

@Column(nullable = false)
private String password;
}


启动项目后,控制台会输出创建表的SQL语句。如果出现警告信息,可以通过设置`spring.jpa.open-in-view=false`来解决。



4. 创建操作数据库的Repository接口


Spring Data JPA提供了`JpaRepository`接口,用于定义访问数据库的方法。以下是一个示例:


@Repository
public interface UserRepository extends JpaRepository {
List findAll();
Optional findById(Long id);
}


可以通过单元测试来验证Repository接口的功能:


@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaTest {
@Autowired
private UserRepository userRepository;

@Test
public void queryUsers() {
List users = userRepository.findAll();
System.out.println(users);
}
}


JPA常用方法


JPA提供了一系列常用的方法,用于执行常见的数据库操作:



  • findAll(): 查询所有记录。

  • save(T entity): 保存或更新记录。

  • findById(ID id): 根据ID查询记录。

  • deleteById(ID id): 根据ID删除记录。



自定义SQL查询


对于复杂的查询,可以使用`@Query`注解来自定义SQL语句。例如:


@Query("select u.userName from User u where u.id = :id")
String findUserNameById(@Param("id") Long id);

@Modifying
@Query("update User u set u.userName = ?1 where u.id = ?2")
void updateUserNameById(String name, Long id);


自定义SQL还可以实现分页操作:


@Query(value = "select u.id, u.userName from User u", countQuery = "select count(u.id) from User u")
Page getUserPage(Pageable pageable);

// 使用示例
PageRequest pageRequest = PageRequest.of(0, 10);
Page userPage = userRepository.getUserPage(pageRequest);
List cOntent= userPage.getContent();
System.out.println(userPage.getTotalElements());
System.out.println(userPage.getTotalPages());

推荐阅读
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
author-avatar
三八xuan_624
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有