SpringBoot整合JPA 基础使用示例教程

 更新时间:2024年10月08日 09:46:36   作者:寰梦  
JPA(Java Persistence API)是Java提供的一套数据持久化标准,通过对象-关系映射(ORM)技术实现Java对象与数据库表之间的映射,它提供了一系列注解和接口,简化了数据库操作,使得开发者可以通过操作对象来进行数据库交互,而无需编写复杂的SQL语句

一、什么是JPA ‌‌

1.JPA的定义和基本概念‌‌

‌JPA(Java Persistence API)‌是Java中用于进行持久化操作的一种规范,它定义了一系列用于操作关系型数据库的API接口。通过这些接口,开发人员可以方便地进行数据库的增删改查等操作,而无需关注具体的数据库操作细节。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

‌2.JPA的核心概念‌

JPA的核心概念包括对象-关系映射(ORM)和实体对象持久化。ORM技术是一种将对象模型和关系模型进行映射的技术,通过ORM,开发人员可以将Java对象直接映射到数据库表中,从而避免了手动编写SQL语句的繁琐工作。JPA提供了一套注解和配置方式,可以方便地将Java类与数据库表进行映射,使得开发人员可以直接操作Java对象,而无需手动维护SQL语句。

‌3.JPA的用途和目标‌

JPA的目标是简化企业应用开发,使得开发者能够更容易地实现对象与数据库表之间的映射关系。它定义了对象-关系映射(ORM)以及实体对象持久化的标准接口,旨在规范和简化Java对象的持久化工作。通过提供统一的API和封装数据库操作细节,JPA使得开发人员可以更加方便地进行数据库操作,提高了代码的可维护性和可读性。

‌4.JPA的优势‌

使用JPA的优势包括提高代码的可维护性和可读性。通过使用JPA,开发人员可以使用面向对象的方式来操作数据库,无需直接操作SQL语句,这使得代码更加直观和易于理解。此外,JPA还提供了一些高级特性,如缓存管理、事务管理等,这些特性可以帮助开发人员更好地进行性能优化和并发控制。

二、JPA的使用

1.准备数据库脚本

DROP TABLE IF EXISTS user;
CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

2.初始化数据

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

3.xml文件导入依赖

<!-- JPA框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

4.引入JPA配置

spring:
  jpa:
      hibernate:
        # ddl-auto 枚举:
        # none(默认):禁用DDL处理
        # validate:验证schema,不对数据库做任何操作
        # update:更新schema
        # create:创建schema,并销毁之前数据
        # create-drop:会话创建时创建schema,会话关闭时销毁schema
        ddl-auto: update
      # jpa配置:在控制台显示Hibernate的sql(可选)
      show-sql: true

(1)加载数据库驱动,springboot3.0开始mysql驱动改为com.mysql.cj.jdbc.Driver,而非com.mysql.jdbc.Driver。

(2)jpa底层实现采用hibernate,自动建表配置使用update,表示第一次创建schema,后续只做更新操作。

5.创建实体对象

import lombok.Data;
import javax.persistence.*;
@Entity
@Data
@Table(name = "user")
public class UserDO  {
    private static final long serialVersionUID = -2952735933715107252L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

6.定义Repository接口

public interface UserRepository extends JpaRepository<UserDO, Long> {
    /**
     * 根据用户姓名查找用户
     *
     * @param name 用户姓名
     * @return 找到的用户对象,如果不存在返回 null
     */
    UserDO findByName(String name);
    /**
     * 根据用户姓名或电子邮箱查找用户
     *
     * @param name  用户姓名
     * @param email 用户电子邮箱
     * @return 找到的用户对象,如果不存在返回 null
     */
    UserDO findByNameOrEmail(String name, String email);
    /**
     * 根据用户姓名计数用户数量
     *
     * @param name 用户姓名
     * @return 具有该姓名的用户数量
     */
    Long countByName(String name);
    /**
     * 根据用户名进行模糊搜索
     *
     * @param name 用户姓名(可以包含通配符)
     * @return 匹配的用户列表
     */
    List<UserDO> findByNameLike(String name);
    /**
     * 根据用户姓名忽略大小写查找用户
     *
     * @param name 用户姓名
     * @return 找到的用户对象,如果不存在返回 null
     */
    UserDO findByNameIgnoreCase(String name);
    /**
     * 根据用户姓名查找用户,并按年龄降序排列
     *
     * @param name 用户姓名
     * @return 匹配的用户列表,按年龄降序排列
     */
    List<UserDO> findByNameContainingOrderByAgeDesc(String name);
    /**
     * 根据用户姓名进行分页查询
     *
     * @param name     用户姓名
     * @param pageable 分页信息
     * @return 包含用户对象的分页结果
     */
    Page<UserDO> findByName(String name, Pageable pageable);
}

注:Repository接口用于定义对实体对象UserDO进行持久化操作的方法。

7.创建controller层调用Repository接口方法

这里只是简单测了根据ID查询

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserRepository userRepository;
    /**
     * 测试单条查询
     */
    @GetMapping("/id")
    public void testSelectOne() {
        // 从 UserRepository 中查找 ID 为 1 的用户
        Optional<UserDO> user = userRepository.findById(1L);
        System.out.println(user);
    }
}

测试效果:

三、JPA的常用

1.常用注解

注解

描述

@Entity

声明该类为实体类。

@Table

指定实体类映射的数据库表,通常与@Entity注解一起使用。

@Id

声明实体类的属性或字段作为数据库表的主键。

@GeneratedValue

指定主键的生成策略。

@Column

用于标注实体类中的属性与数据库表中的字段之间的映射关系。

@Transient

声明实体类的属性或字段不是持久化的。

@Basic

指定实体类属性的存取策略。

@Temporal

指定java.util.Date或java.util.Calendar

属性映射到数据库类型时的时间精度。

@Enumerated

指定枚举类型的属性映射。

@OneToOne

指定一对一的关联映射。

@OneToMany

指定一对多的关联映射。

@ManyToOne

指定多对一的关联映射。

@ManyToMany

指定多对多的关联映射。

@JoinColumn

指定关联的外键列。

@MapKey

指定映射关系中的键。

2.常用查询方法

方法类型

方法名称

描述

查询方法

findBy/getBy/queryBy/readBy

后面跟要查询的字段名,用于精确匹配。

find/get/query/read

后面跟要查询的字段名,使用条件表达式进行模糊匹配。

findAll/getAll

不跟字段名,表示查询所有记录。

支持的关键字

And

连接多个查询条件,相当于 SQL 中的 AND。

Or

连接多个查询条件,相当于 SQL 中的 OR。

Between

查询字段在某个范围内的记录。

LessThan/LessThanEqual

查询字段小于或小于等于某个值的记录。

GreaterThan/GreaterThanEqual

查询字段大于或大于等于某个值的记录。

IsNull/IsNotNull

查询字段为空或不为空的记录。

Like/NotLike

模糊查询字段值。

OrderBy

指定查询结果的排序方式。

删除方法

deleteBy/removeBy

后面跟要查询的字段名,用于精确匹配。

delete/remove

后面跟要查询的字段名,使用条件表达式进行模糊匹配。

统计方法

countBy

后面跟要查询的字段名,用于精确匹配。

count

不跟字段名,表示统计所有记录数。

更新方法

updateBy

后面跟要查询的字段名,用于精确匹配。

update

后面跟要查询的字段名,使用条件表达式进行模糊匹配。

支持的关键字

Set

设置要更新的字段的值。

Where

指定更新操作的条件。

 3.部分查询关键字映射示例

部分查询关键字映射示例

关键字

使用示例

And

findByLastnameAndFirstname

Or

findByLastnameOrFirstname

Is,Equals

findByFirstnameIs,findByFirstnameEquals

Between

findByStartDateBetween

LessThan

findByAgeLessThan

LessThanEqual

findByAgeLessThanEqual

GreaterThan

findByAgeGreaterThan

GreaterThanEqual

findByAgeGreaterThanEqual

After

findByStartDateAfter

Before

findByStartDateBefore

IsNull

findByAgeIsNull

IsNotNull,NotNull

findByAge(Is)NotNull

Like

findByFirstnameLike

NotLike

findByFirstnameNotLike

StartingWith

findByFirstnameStartingWith

EndingWith

findByFirstnameEndingWith

Containing

findByFirstnameContaining

OrderBy

findByAgeOrderByLastnameDesc

Not

findByLastnameNot

In

findByAgeIn(Collection ages)

NotIn

findByAgeNotIn(Collection ages)

TRUE

findByActiveTrue()

FALSE

findByActiveFalse()

IgnoreCase

findByFirstnameIgnoreCase

到此这篇关于SpringBoot整合JPA 基础使用的文章就介绍到这了,更多相关SpringBoot整合JPA 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java ClassCastException报错:java.util.HashSet cannot be cast to java.util.List的解决方法

    Java ClassCastException报错:java.util.HashSet cannot

    这篇文章主要来带大家分析一下Java开发中常见的ClassCastException异常,当试图将HashSet强制转换为List时会抛出java.util.HashSet cannot be cast to java.util.List,下面我们来看看具体怎么解决吧
    2026-02-02
  • SpringBoot图文并茂讲解登录拦截器

    SpringBoot图文并茂讲解登录拦截器

    其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了,下面这篇文章主要给大家介绍了关于如何在Springboot实现登陆拦截器功能的相关资料,需要的朋友可以参考下
    2022-06-06
  • BeanUtils.copyProperties复制属性失败的原因及解决方案

    BeanUtils.copyProperties复制属性失败的原因及解决方案

    这篇文章主要介绍了BeanUtils.copyProperties复制属性失败的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot读取.properties配置文件中的map和list类型配置参数方式

    springboot读取.properties配置文件中的map和list类型配置参数方式

    这篇文章主要介绍了springboot读取.properties配置文件中的map和list类型配置参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • JDK源码之线程并发协调神器CountDownLatch和CyclicBarrier详解

    JDK源码之线程并发协调神器CountDownLatch和CyclicBarrier详解

    我一直认为程序是对于现实世界的逻辑描述,而在现实世界中很多事情都需要各方协调合作才能完成,就好比完成一个平台的交付不可能只靠一个人,而需要研发、测试、产品以及项目经理等不同角色人员进行通力合作才能完成最终的交付
    2022-02-02
  • SpringBoot集成Druid实现监控功能的示例代码

    SpringBoot集成Druid实现监控功能的示例代码

    这篇文章主要介绍了SpringBoot集成Druid实现监控功能,Druid是阿里巴巴开发的号称为监控而生的数据库连接池,可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池,文中通过代码示例讲解非常详细,需要的朋友可以参考下
    2024-02-02
  • Spring深入分析讲解BeanUtils的实现

    Spring深入分析讲解BeanUtils的实现

    java知识体系统有很多数据实体,比较常用的DTO、BO、DO、VO等,其他类似POJO概念太老了现在基本废弃掉了,本篇幅直接忽略,对于这几种数据实体各自代表的含义和应用场景先做一下简单描述和分析
    2022-06-06
  • Java中BeanUtils.copyProperties的11个坑总结

    Java中BeanUtils.copyProperties的11个坑总结

    我们日常开发中,经常涉及到DO、DTO、VO对象属性拷贝赋值,很容易想到org.springframework.beans.BeanUtils的copyProperties,它会自动通过反射机制获取源对象和目标对象的属性,pyProperties,会有好几个坑呢,本文将给大家总结一下遇到的坑,需要的朋友可以参考下
    2023-05-05
  • Mybatis如何使用注解优化代码

    Mybatis如何使用注解优化代码

    这篇文章主要介绍了Mybatis如何使用注解优化代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java中@requestMappling注解的使用

    java中@requestMappling注解的使用

    本文主要介绍了java中@requestMappling注解的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01

最新评论