Spring JPA 的核心思想是简化 Java 应用程序中的数据持久化操作。以下是一些关键点:
核心概念
1.对象关系映射 (ORM)
Spring JPA 使用 ORM 技术,将 Java 对象和数据库表映射起来,使得开发人员可以操作对象而不必直接处理数据库表。
2.实体
实体代表数据库中的一条记录,每个实体类映射到数据库中的一张表。
3.仓库接口
提供了一组用于操作数据库的接口。开发者通过继承这些接口,可以执行常见的数据操作,如创建、读取、更新和删除,而无需编写具体的 SQL 语句。
4.查询生成
Spring Data JPA 可以根据方法名称自动生成 SQL 查询,简化了查询的书写。也支持使用 JPQL(Java Persistence Query Language)编写复杂查询。
5.事务管理
支持声明式事务管理,确保在执行数据库操作时的一致性和完整性。
优点
-
简化开发: 自动实现常见的数据访问操作,减少了样板代码的编写。
-
降低复杂性: 减少了直接操作 SQL 的需要,允许开发者更专注于业务逻辑。
-
集成: 与 Spring 框架其他部分(如事务管理、Spring Boot)无缝集成,提升开发效率。
配置和使用
-
自动配置: 如果使用 Spring Boot,许多配置可以自动完成,只需提供基本的数据库连接信息。
-
声明式查询: 使用方法命名规则,Spring Data JPA 可以自动生成查询,而不需要手动编写 SQL。
总结
Spring JPA 通过简化数据库操作和集成事务管理,使得开发人员可以更轻松地实现数据持久化层。它将复杂的数据库操作封装起来,使开发者可以专注于应用程序的业务逻辑。
Spring Boot项目依赖
<!-- JPA是针对数据库的操作,需要引入对应的数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
配置数据源
spring:
jpa:
open-in-view: false
# 控制是否打印运行时的SQL语句与参数信息
show-sql: true
创建实体类
@Entity
@Table(name = "sys_brand")
@Data
public class SysBrandRes {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long brandId;
/**
* 品牌编码
*/
private String brandCode;
/**
* 品牌名称
*/
private String brandName;
/**
* 显示顺序
*/
private Integer brandSort;
}
创建Controller类
/**
* 添加
* @param sysBrandRes
* @return
*/
@PostMapping
public ResponseEntity<SysBrandRes> brandAdd(@RequestBody SysBrandRes sysBrandRes){
SysBrandRes sysBrand=sysBrandService.add(sysBrandRes);
return new ResponseEntity<>(sysBrand, HttpStatus.CREATED);
}
/**
* 根据品牌名查询和分页查询
* @param brandName
* @param page
* @param size
* @return
*/
@GetMapping("/pageBrands")
public Page<SysBrandRes> brandList(@RequestParam String brandName,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10")int size
){
return sysBrandService.searchBrands(brandName,page,size);
}
/**
* 删除
* @param brandId
* @return
*/
@DeleteMapping("/{brandId}")
public ResponseEntity<SysBrandRes> brandDel(@PathVariable Long brandId){
sysBrandService.del(brandId);
return new ResponseEntity<>( HttpStatus.NO_CONTENT);
}
/**
* 修改
* @param brandId
* @param sysBrandRes
* @return
*/
@PutMapping("/{brandId}")
public ResponseEntity<SysBrandRes> upd(@PathVariable Long brandId,@RequestBody SysBrandRes sysBrandRes){
SysBrandRes brandRes=sysBrandService.upd(brandId,sysBrandRes);
if(brandRes!= null){
return new ResponseEntity<>(brandRes,HttpStatus.OK);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
创建Service类
接口
Page<SysBrandRes> searchBrands(String brandName, int page, int size);
SysBrandRes add(SysBrandRes sysBrandRes);
void del( Long brandId);
SysBrandRes upd(Long brandId, SysBrandRes sysBrandRes);
实现类
@param brandName
* @param page
* @param size
* @return
*/
@Override
public Page<SysBrandRes> searchBrands(String brandName, int page, int size) {
PageRequest pageRequest = PageRequest.of(page, size);
return brandRespository.findByBrandNameContaining(brandName,pageRequest);
}
/**
* 添加
* @param sysBrandRes
* @return
*/
@Override
public SysBrandRes add(SysBrandRes sysBrandRes) {
return brandRespository.save(sysBrandRes);
}
/**
* 删除
* @param brandId
*/
@Override
public void del(Long brandId) {
brandRespository.deleteById(brandId);
}
/**
* 修改
* @param brandId
* @param sysBrandRes
* @return
*/
@Override
public SysBrandRes upd(Long brandId, SysBrandRes sysBrandRes) {
// 检查指定的品牌 ID 是否存在于数据仓库中
if(brandRespository.existsById(brandId)) {
// 如果品牌存在,设置传入的品牌对象的 ID 为指定的品牌 ID
sysBrandRes.setBrandId(brandId);
// 将更新后的品牌对象保存到数据仓库,并返回保存后的对象
return brandRespository.save(sysBrandRes);
}
// 如果品牌不存在,返回 null
return null;
}
创建Repository接口
@Repository
public interface BrandRespository extends JpaRepository<SysBrandRes,Long> {
Page<SysBrandRes> findByBrandNameContaining(String brandName, Pageable pageable);
}