热门标签 | 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());

推荐阅读
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • Navicat Premium中MySQL用户管理:创建新用户及高级设置
    本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文探讨了一个在Spring项目中常见的问题——当pom.xml文件中引入了servlet依赖但未指定其作用域为provided时导致的应用启动失败。文章详细分析了错误原因,并提供了有效的解决方案。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • 本文详细介绍了如何通过配置 Chrome 和 VS Code 来实现对 Vue 项目的高效调试。步骤包括启用 Chrome 的远程调试功能、安装 VS Code 插件以及正确配置 launch.json 文件。 ... [详细]
  • 本文介绍了如何在React Native应用中获取组件的实际宽度和高度,并详细说明了屏幕单位(如dp)与像素(px)之间的转换方法。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
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社区 版权所有