企业网站的维护,wap浏览器在线,中企动力电话号码,国外房产中介网站1、简介
Java持久化技术是Java开发中比较重要的部分#xff0c;主要用于将对象数据持久化到数据库#xff0c;或者从数据库中查询数据#xff0c;简化数据库的CRUD操作。
2、JPA简介
JPA#xff08;Java Persistence API#xff09;是Java实现ORM#xff08;Object Re…1、简介
Java持久化技术是Java开发中比较重要的部分主要用于将对象数据持久化到数据库或者从数据库中查询数据简化数据库的CRUD操作。
2、JPA简介
JPAJava Persistence API是Java实现ORMObject Relational Mapping技术提供的规范主要用于将Java对象映射到关系数据库便于持久化操作。
3、Spring Data JPA简介
Spring Data JPA是Spring 框架下的一个模块是基于JPA规范实现的上层封装旨在简化JPA的使用。Spring Data JPA提供了一些常用的接口例如JpaRepository、JpaSpecificationExecutor这些接口中包含了很多CRUD操作方法同时提供了基于方法命名规范的查询方法可以根据方法自动生成相应的SQL。
除了基础的CRUD操作Spring Data JPA还提供很多高级功能例如分页查询、排序、动态查询等同时支持多种数据库例如MySQL、PostgreSQL、Oracle等。
Spring Data JPA 是 Spring Data 项目家族中的一员它为基于Spring框架应用程序提供了更加便捷和强大的数据操作方式。Spring Data JPA 支持多种数据存储技术包括关系型数据库和非关系型数据库。Spring Data JPA 提供了简单、一致且易于使用的API来访问和操作数据存储其中包括基本的CRUD操作、自定义查询方法、动态查询等功能。Spring Data JPA 也支持QueryDSL、Jinq、Kotlin Query等其他查询框架
4、快速使用
4.1、添加依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId
/dependency
4.2、创建实体类
1、实体类必须使用Entity注解、还可以添加Table映射表名使用lombok的Data
package com.mqtt.mqttproject.entity;import lombok.Data;
import javax.persistence.*;/*** Author : Gridsum* Description : 测试实体类*/
Entity
Table(name user)
Data
public class User {IdGeneratedValue(strategy GenerationType.IDENTITY)private Long id;Column(name name)private String name;Column(name age)private Integer age;Column(name addr)private String addr;
}
4.3、创建Repository接口
package com.mqtt.mqttproject.repository;import com.mqtt.mqttproject.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;Repository
public interface UserRepository extends JpaRepositoryUser, Long {User findByName(String name);
}
实现类
package com.mqtt.mqttproject.service.impl;import com.mqtt.mqttproject.entity.User;
import com.mqtt.mqttproject.repository.UserRepository;
import com.mqtt.mqttproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** Author : Gridsum* Description :*/
Service
public class UserServiceImpl implements UserService {Autowiredprivate UserRepository userRepository;Overridepublic User findByName(String name) {return userRepository.findByName(name);}Overridepublic void save(User user){userRepository.save(user);}
}
4.4、基本CRUD
定义Repository接口继承JpaRepositoryT, ID泛型T指实体类ID实体id。
方法名描述T save(T entity)保存实体对象Iterable saveAll(Iterable entities)批量保存实体对象Optional findById(ID id)根据主键获取实体对象boolean existsById(ID id)判断是否存在特定主键的实体对象Iterable findAll()获取所有实体对象Iterable findAllById(Iterable ids)根据主键批量获取实体对象long count()获取实体对象的数量void deleteById(ID id)根据主键删除实体对象void delete(T entity)删除实体对象void deleteAll(Iterable? extends T entities)批量删除实体对象
package com.mqtt.mqttproject.repository;import com.mqtt.mqttproject.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Optional;Repository
public interface UserRepository extends JpaRepositoryUser, Long {User findByName(String name);OverrideUser save(User user);OverrideOptionalUser findById(Long id);OverrideListUser findAll();Overridevoid deleteById(Long id);
}
4.5、自定义查询
方法名称查询是 Spring Data JPA 中最简单的一种自定义查询方法并且不需要额外的注解或 XML 配置。它通过方法名来推断出查询的条件例如以 findBy 开头的方法表示按照某些条件查询以 deleteBy 开头的方法表示按照某些条件删除数据。 例如 findByName(String name)
Repository
public interface UserRepository extends JpaRepositoryUser, Long {User findByName(String name);OverrideUser save(User user);OverrideOptionalUser findById(Long id);OverrideListUser findAll();Overridevoid deleteById(Long id);
}
4.5.1、查询参数设置
除了方法名称查询外还可以使用参数设置方式进行自定义查询。它通过在方法上使用 Query 注解来指定查询语句然后使用 Param 注解来指定方法参数与查询语句中的参数对应关系。
UserRepository接口中自定义查询接口
Query(SELECT u FROM User u WHERE u.name :name)
User findByUserName(Param(name) String name); 4.6、使用 Sort 和 Pageable 进行排序和分页
在查询数据时经常需要对结果进行排序和分页操作。Spring Data JPA 提供了 Sort 和 Pageable 两个类来实现排序和分页功能。
Sort 类表示排序规则可以使用 Sort.by() 静态方法
创建实例并指定排序属性和排序方向。常用方法如下
方法名描述static Sort by(Sort.Order... orders)根据排序规则创建 Sort 实例static Sort.Order by(String property)根据属性升序排序static Sort.Order by(String property, Sort.Direction direction)根据属性排序 ListUser findByOrderByAgeAsc();// 根据年龄降序分页查询用户列表PageUser findBy(Pageable pageable);
4.7、Specification 进行动态查询
在实际应用中我们经常需要根据条件动态生成查询语句。Spring Data JPA 提供了 Specification 接口来支持动态查询它可以通过使用匿名内部类或 Lambda 表达式来实现。
Specification 接口定义了 toPredicate() 方法该方法接受一个 RootT 对象和一个 CriteriaQuery? 对象作为参数并返回一个 Predicate 对象表示查询条件。
在 toPredicate() 方法内部可以通过 root.get() 方法获取实体属性并使用 criteriaBuilder 构建查询条件。 1.例如以下 Lambda 表达式表示查询 age 大于等于 18 的用户。 public interface UserRepository extends JpaRepositoryUser, Long, JpaSpecificationExecutorUser {ListUser findAll(SpecificationUser spec);
}// 使用
SpecificationUser spec (root, query, criteriaBuilder) - criteriaBuilder.greaterThanOrEqualTo(root.get(age), 18);
userRepostory.findAll(spec);