Spring 全家桶之 Spring Boot 2.6.4(四)- Data Access(Part C JPA)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: Spring 全家桶之 Spring Boot 2.6.4(四)- Data Access(Part C JPA)

一、Spring Boot 整合 Spring Data JPA

Spring Data

Spring Data 项目是为了简化构建基于 Spring 框架的数据访问技术,包括非关系型数据库Map-Reduce框架、关系型数据库以及云数据服务的访问支持。

Spring Data 中又包含了多个子项目

cd2c83ca4e414148a776cdc18682c071_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Spring Data 的特点

Spring Data提供了统一的API来对数据访问层进行操作;这个规范主要是Spring Data Commons子模块来实现的,Spring Data Commons提供了针对关系型数据库和非关系型数据库访问数据时都基于Spring 提供的统一标准,这个标准包含了增删改查、条件查询、排序以及分页操作。

Spring Data 统一的Repository接口

  • Repository<T,ID extends Serializable>:统一接口
  • RevisionRepository<T,ID extends Serializable, N extends Number & Comparable<N>>:基于乐观锁机制
  • CrudRepository<T,ID extends Serializable>:基本CRUD
  • PagingAndSortingRepository<T,ID extends Serializable>:基本CRUD及分页排序

Spring Data 提供了数据访问类的模板 XxxTemplate,如RedisTemplate、MongoTemplate等

JPA 与 Spring Data

  • JpaRespository的基本功能
  • 编写接口继承JpaRepository,拥有CRUD以及分页功能
  • 定义符合规范的方法名,接口中只要生命符合规范的方法,既拥有对应的功能
  • 如方法名 findByLastnameAndFirstname,关键字是And,对应的JPQL条件部分既为”WHERE x.lastname = ? AND x.firstname = ?“
  • 方法名 findByLastnameOrFirstname,关键字Or,对应的JPQL
  • @Query自定义查询,定制查询SQL
  • Specifications查询(Spring Data JPA 支持 JPA 2.0 的Criteria查询)

45417082b3724cf990beababb5e8c909_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

二、Spring Data JPA 实现 CRUD

创建新工程spring-boot-jpa,引入Spring Data JPA

image.png

查看jpa的依赖图

image.png

配置默认的数据源

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/test
复制代码

创建一个实体类Telsa,并配置好映射关系

@Data
@Entity // 标注为一个实体类
@Table(name = "jpa_tesla") // 设置实体类对应的表名
public class Tesla {
    @Id // 设置主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键为自增主键
    private Integer id;
    @Column // 列名默认与属性名一致
    private String name;
    @Column(name = "vehicle_type") // 设置列名
    private String vehicleType;
    @Column
    private String factory;
}
复制代码

创建repository包,创建TeslaRepository接口继承JpaRepository,这里泛型中的第一个是实体类的类型,第二个是主键的类型

public interface TeslaRepository extends JpaRepository<Tesla,Integer> {
}
复制代码

JpaRepository接口中包含了基本的增删改查方法

image.png

在yml中配置jpa

jpa:
  hibernate:
    # 更新或者创建数据表
    ddl-auto: create
  # 控制台显示执行的SQL
  show-sql: true
复制代码

如果是第一次启动应用,并且数据库没有表,建议使用ddl-auto: create,应用启动可以根据实体类创建响应的表,如果不是第一次启动,建议改为ddl-auto: update。

JpaRepositoriesAutoConfiguration会在HibernateJpaAutoConfiguration自动配置之后才会启动自动配置

image.png

HibernateJpaAutoConfiguration启用类JpaProperties中的配置

image.png

jpa自动配置项都在JpaProperties类中

image.png

启动主程序,会自动创建表,根据实体类的属性及注解中声明的表名、字段名以及主键增长方式创建。

image.png

根据启动日志,可以确定Spring Boot自动执行了建表语句

测试TeslaRepository的CRUD方法

创建TeslaRepositoryTest测试类,注入TeslaRepository并新增save方法

@SpringBootTest
public class TeslaRepositoryTest {
    @Resource
    private TeslaRepository repository;
    @Test
    public void testSave(){
        Tesla tesla = new Tesla();
        tesla.setName("Model 3");
        tesla.setVehicleType("Compact Car");
        tesla.setFactory("Shanghai Gigafactory");
        repository.save(tesla);
    }
}
复制代码

执行testSave方法

image.png

新增getById方法

@Test
public void testGetById(){
    Tesla tesla = repository.getById(1);
    System.out.println("查询到的数据为:" + tesla);
}
复制代码

执行getById方法

image.png

此时需要在Tesla实体类上增加@Proxy(laxy=false)注解,重新执行

image.png

控制台成功显示查询到的数据。

出现这个报错基于JPA的实现来分析,就是在进行数据库访问之时,当前针对数据库的访问与操作session已经关闭且释放了,故提示no Session可用。

在测试类中新增update方法

@Test
public void update(){
    Tesla tesla = new Tesla();
    tesla.setId(1);
    tesla.setName("Model 3P");
    tesla.setFactory("弗拉蒙特超级工厂");
    tesla.setVehicleType("四门轿车");
    repository.save(tesla);
}
复制代码

执行update方法

image.png

根据控制台执行的SQL语句,JPA先执行了查询方法,查看是否存在,如果存在就更新,如果不存在就创建

在测试类中新增delete方法

@Test
public void delete(){
    Tesla tesla = new Tesla();
    tesla.setId(2);
    repository.delete(tesla);
}
复制代码

执行delete方法

image.png

根据控制台输出的SQL可以确定已经将id为1的记录删除


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
12天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
24 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
38 9
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
下一篇
无影云桌面