Spring Data JPA

目录

[为什么使用spring data?](#为什么使用spring data?)

什么是jpa?

[Spring Data JPA](#Spring Data JPA)

[Spring Data Repository](#Spring Data Repository)

方法名规范

[使用Spring Data JPA](#使用Spring Data JPA)

环境准备

创建实体类

创建Repository接口

调用方法

添加/更新

查询

分页

自定义查询


为什么使用spring data?

Spring Data帮助我们将不同的数据存储进行了统一,提升开发效率。

Spring Data支持了很多持久层技术:

什么是jpa?

jpa是java标准中的一套ORM规范。借助jpa可以实现使用注解或者XML的方式描述对象与实体类之间的映射关系。并实现实体对象持久化到数据库中。

jpa的实现厂商有很多,比方说Hibernate、Eclipselink、TopLink。

JPA为我们提供了以下规范:

  • ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
  • JPA的Criteria API:提供API来操作实体对象,执行CRUD操作,框架会自动将之转换为对应的SQL,使开发者从繁琐的 JDBC、SQL中解放出来。
  • JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

Spring Data JPA

Spring Data JPA 是在实现JPA规范的基础上封装的一套JPA应用框架。使用 Spring Data JPA可以实现在不同的ORM框架进行切换时而不更改代码。按照约定好的命名规范写好接口,就可以实现在不实现接口的情况下对数据库进行操作。同时提供了很多除了CRUD之外的功能。

优势:

  1. 减少样板代码:通过Repository接口自动生成CURD操作;
  2. 灵活查询:支持方法名查询、@Query注解、Specification等;
  3. 分页和排序:内置分页和排序支持;
  4. 与spring 生态无缝集成。

Spring Data Repository

Spring Data Repository 是 Spring Data 框架的核心组件,它简化了数据访问层(DAO)的开发,通过提供接口定义自动实现 的方式,减少了curd的实现

核心作用

  • 消除样板代码:无需手动编写 SQL 或实现类,仅通过定义接口即可完成数据操作。
  • 统一数据访问方式:对关系型数据库(MySQL)、NoSQL(MongoDB、Redis)等提供一致的编程模型。
  • 支持复杂查询:通过方法名约定、自定义 SQL 等方式,轻松实现复杂查询逻辑。

Spring Data JPA提供了以下Repository接口:

  • Repository接口(根接口)

这是Spring Data JPA的顶级接口,它没有定义任何方法,仅作为一个标记接口。

  • CrudRepository

该接口扩展了Repository接口,提供了基本的CRUD操作功能。

  • PagingAndSortingRepository

该接口增加了分页和排序的功能

  • JpaRepository接口

这是最常见的接口,继承了PagingAndSortingRepository,并添加了JPA特有的方法,flush()、saveAndFlush()等。


实体类注解

使用JPA的注解可以实现映射实体类和数据库表。

常用的JAPA注解包括:

  • @Entity:标记一个java类为JPA实体类,表示该类将映射到数据库表;
  • @Table:指定实体类映射的数据库表名,默认情况下表名与实体类名相同;
  • @Id:标记实体类中的主键字段;
  • @GeneratedValue:指定主键的生成策略,常用于自动生成主键值;常用的策略有
  1. strategy = GenerationType.IDENTITY:使用数据库自增列
  2. GenerationType.SEQUENCE:使用数据库序列
  3. GenerationType.TABLE:使用表模拟序列
  4. GenerationType.AUTO:由 JPA 提供商自动选择
  • @Column:指定实体属性与数据库字段的映射关系;常用属性有:
  1. name:数据库字段名;
  2. length:字段长度;
  3. nullable:是否可为空;
  4. unique:是否唯一;
  • @Transient:标记字段不持久化到数据库;
  • @OneToOne:一对一关系映射;
  • @ManyToOne和@OneToMany:多对一或一对多映射;
  • @ManyToMany:多对多映射

方法名规范

方法名规范是JPA中非常重要的特性,它允许开发者通过方法名来定义查询,而无需编写具体的语句。Spring Data Jpa会根据方法名自动生成对应逻辑的查询。

Spring Data JPA的方法名通常由以下几部分组成:

findBy + 属性名 + 查询条件 + OrderBy + 排序属性 + 排序方法

常见的查询关键字:

  • findBy:根据属性查找;
  • existsBy:判断是否存在;
  • countBy:统计数量;
  • And:并且;
  • Or:或者;
  • Is,Equals:等于;
  • Between:在...之间;
  • LessThan:小于;
  • LessThanEqual:小于等于;
  • GreaterThan:大于;
  • GreaterThanEqual:大于等于;
  • After:之后(时间);
  • Before:之前(时间);
  • IsNull:为null;
  • IsNotNull,NotNull:不为null;
  • Like:模糊匹配;
  • NotLike:非模糊匹配;
  • StartingWith:以什么开头;
  • EndingWith:以什么结尾;
  • Containing:包含;
  • Not :非;
  • In:在...之中;
  • NotIn:不在...之中;
  • True:为true;
  • False:为false;
  • IgnoreCase:忽略大小写;
  • Distinct:去重
  • Top,First:限制结果数量;

注意事项:

  • 属性名必须与实体类中的属性名一致,大小写敏感
  • 对于复杂的查询逻辑,可以结合@Query注解编写自定义语句。

使用Spring Data JPA

环境准备

依赖坐标:

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

如果是使用IDEA2024及以上创建,直接勾选对应依赖即可:

然后在application.yml中配置数据库连接以及jpa的相关配置:

复制代码
jpa:
    hibernate:
      ddl-auto: update  # 自动创建/更新表结构(create, create-drop, update, validate, none)
    show-sql: true      # 打印 SQL 语句
    properties:
      hibernate:
        format_sql: true  # 格式化 SQL 语句

创建实体类

该实体类要对应数据库表,注意需要使用@Entity标记和@Table指定表名;以及主键要加上对应的注解和自增策略。

java 复制代码
@Entity
@Table(name = "tb_user")
public class User {

    @Id  // 主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 自增策略(MySQL 常用)
    private Long uid;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "tellphone")
    private String tellphone;
}

创建Repository接口

创建一个Repository去继承JpaRepository,继承它可以自动获得CURD的方法;

java 复制代码
public interface UserRepository extends JpaRepository<User, Long> {
}

接下来就可以注入该Repository去调用对应的方法。

调用方法

添加/更新

在spring data jpa中,新增和修改的方法都是save方法,区别是参数是否携带id:

例如下方代码就是新增:

java 复制代码
        User user = new User();
        user.setUsername("999");
        user.setPassword("666");
        userRepository.save(user);

而在给它加上id后就是修改:

java 复制代码
        User user = new User();
        user.setUid(4L);
        user.setPassword("66666");
        userRepository.save(user);
查询

查询方法需要按照规范设计,这样就无需手写sql语句;

例如:根据username查询,方法名就可以是findByUsername();

也可以使用And来连接多种逻辑:

分页
java 复制代码
// Repository 中无需额外定义,直接使用 JpaRepository 自带的分页方法
Page<User> findAll(Pageable pageable);

// Service 中调用
public Page<User> getUsersByPage(int pageNum, int pageSize) {
    // Pageable 定义页码(从 0 开始)和每页条数
    Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.by("username").descending());
    return userRepository.findAll(pageable);
}
自定义查询

有时候太过复杂的sql可能会导致方法名过长,可以在接口中的方法上使用@Query注解实现自定义sql语句:

java 复制代码
    @Query("select u from User u where u.username = ?1 and u.password = ?2")
    User findByA(String aa, String aaa);

注:

  • from后接的是实体类名,以及参数使用占位符替代,如果想用原生的sql,可以添加属性nativeQuery = true;
  • 还可以使用 :参数名来定义参数,配合@Param绑定方法参数,可读性高;
  • 如果是修改方法,还需要加上@Modifying注解
相关推荐
小王不爱笑1322 小时前
Spring AOP(AOP+JDBC 模板 + 转账案例)
java·后端·spring
csbysj20202 小时前
CSS 对齐
开发语言
爱吃巧克力的程序媛2 小时前
将qt界面中加载css或者qss样式
开发语言·css·qt
njxiejing2 小时前
Python进度条工具tqdm的安装与使用
开发语言·python
遇印记2 小时前
蓝桥java蜗牛
java·学习·蓝桥杯
m0_565611132 小时前
Java-泛型
java·windows
张np2 小时前
java基础-集合接口(Collection)
java·开发语言