目录
[为什么使用spring data?](#为什么使用spring data?)
[Spring Data JPA](#Spring Data JPA)
[Spring Data Repository](#Spring Data Repository)
[使用Spring Data JPA](#使用Spring Data JPA)
为什么使用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之外的功能。
优势:
- 减少样板代码:通过Repository接口自动生成CURD操作;
- 灵活查询:支持方法名查询、@Query注解、Specification等;
- 分页和排序:内置分页和排序支持;
- 与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:指定主键的生成策略,常用于自动生成主键值;常用的策略有
- strategy = GenerationType.IDENTITY:使用数据库自增列
- GenerationType.SEQUENCE:使用数据库序列
- GenerationType.TABLE:使用表模拟序列
- GenerationType.AUTO:由 JPA 提供商自动选择
- @Column:指定实体属性与数据库字段的映射关系;常用属性有:
- name:数据库字段名;
- length:字段长度;
- nullable:是否可为空;
- 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注解
