我是靠谱客的博主 寂寞香烟,最近开发中收集的这篇文章主要介绍【Spring Data JPA】基于 JpaRepository 增删改查,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 创建实体类
      • 定义JPA查询接口
    • 增、删、改、查
      • 增加、修改
      • 删除
        • 删除【根据实体类删除】
        • 删除【根据实体类主键删除】
      • 查询
        • 简单查询
          • 查询单个信息【findBy】
          • 查询多个信息【findAllBy】
        • 复杂查询
          • 查询等于某个条件的数据并分页
          • 模糊查询【like】
          • 大于等于【>=】
          • 小于等于【<=】
          • 查询多个Id的用户【In】

在这里我们创建实体类与继承了JpaRepository的接口,下面的增删改查都以实体类与接口做示例。

创建实体类

import java.io.Serializable;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
@Data
@Entity
@Table(name="user_info")
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@Id
private String id;
/**
* 登录名
*/
@Column(name = "login_name")
private String loginName;
/**
* 密码
*/
private String password;
/**
* 年龄
*/
private int age;
}

定义JPA查询接口

定义一个接口,继承JpaRepository

public interface UserInfoRepository extends JpaRepository<UserInfo, String> {
}

增、删、改、查

增加、修改

JpaRepository中,当保存的实体类主键ID在数据库中存在时进行修改操作,不存在则进行保存。


@Autowired
private UserInfoRepository userInfoRepository;
public void addUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setId("jHfnKlsCvN");
userInfo.setLoginName("登录名");
userInfo.setPassword("123456");
userInfo.setAge(18);
// 保存或修改用户信息, 并返回用户实体类
UserInfo save = userInfoRepository.save(userInfo);
}

删除

删除【根据实体类删除】


@Autowired
private UserInfoRepository userInfoRepository;
public void deleteUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setId("jHfnKlsCvN");
userInfo.setLoginName("登录名");
userInfo.setPassword("123456");
userInfo.setAge(18);
// 根据实体类删除
userInfoRepository.delete(userInfo);
}

删除【根据实体类主键删除】


@Autowired
private UserInfoRepository userInfoRepository;
public void deleteUserInfo() {
// 根据实体类主键删除
userInfoRepository.deleteById("111");
}

查询

简单查询

查询单个信息【findBy】

JpaRepository中根据某一个字段或者某几个字段查询时,就使用findBy方法。
这里给个例子,假设,我想根据loginName查询用户信息,就可以用findByLoginName查询用户信息,如果有多个条件后面就继续拼接AndXXX
假设,我想查询loginName等于某值,并且password等于某值的,就可以使用findByLoginNameAndPassword

public interface UserInfoRepository extends JpaRepository<UserInfo, String> {
// 根据登录名查询用户信息
UserInfo findByLoginName(String loginName);
// 根据登录名和密码查询用户信息
UserInfo findByLoginNameAndPassword(String loginName, String password);
}
查询多个信息【findAllBy】

JpaRepository中根据某一个字段或者某几个字段查询时,就使用findAllBy方法,而接口根据某个条件查询写法跟查询单个信息时一样。
这里给个例子,假设,我想查询loginName等于某值的所有用户信息时,就写做findAllByLoginName

public interface UserInfoRepository extends JpaRepository<UserInfo, String> {
// 查询所有登录名叫做XXX的用户
List<UserInfo> findAllByLoginName(String loginName);
}

复杂查询

UserInfoRepository中创建一个方法,使用SpecificationPageable 去做复杂查询以及分页。

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserInfoRepository extends JpaRepository<UserInfo, String> {
// 用于复杂查询
Page<UserInfo> findAll(Specification<UserInfo> specification, Pageable pageable);
}
查询等于某个条件的数据并分页
@Autowired
private UserInfoRepository userInfoRepository;
public void queryUserInfo {
Pageable pageable = org.springframework.data.domain.PageRequest.of(Math.toIntExact(num - 1), pageSize);
Specification<UserInfo> specifications = new Specification<UserInfo>() {
@Override
public Predicate toPredicate(Root<UserInfo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
// 条件【查询所有登录名等于张三的用户】
predicates.add(criteriaBuilder.equal(root.get("loginName"), "张三"));
return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getGroupRestriction();
}
};
// JAVA8 lambda写法
//	Specification<UserInfo> specifications = (root, query, criteriaBuilder) -> {
//
List<Predicate> predicates = new ArrayList<>();
// 条件【查询所有登录名等于张三的用户】
//
predicates.add(criteriaBuilder.equal(root.get("loginName"), "张三"));
//
return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getGroupRestriction();
//	};
final Page<UserInfo> planPage = userInfoReportRepository.findAll(specification, pageable);
long totalElements = planPage.getTotalElements();// 总共多少条数据
int totalPages = planPage.getTotalPages();// 总共多少页
}
模糊查询【like】
Specification<UserInfo> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 条件【查询所有登录名等于张三的用户】
predicates.add(criteriaBuilder.like(root.get("loginName"), "%张%"));
return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getGroupRestriction();
};
大于等于【>=】
Specification<UserInfo> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 条件【查询大于等于10岁的用户】
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("age"), 10));
return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getGroupRestriction();
};
小于等于【<=】
Specification<UserInfo> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 条件【查询小雨等于20岁的用户】
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("age"), 20));
return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getGroupRestriction();
};
查询多个Id的用户【In】
List<String> ids = new ArrayList();
ids.add("1");
ids.add("2");
Specification<UserInfo> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 条件【查询多个Id】
CriteriaBuilder.In<String> in = criteriaBuilder.in(root.get("id"));
for (String id : ids) {
in.value(id);
}
return query.where(criteriaBuilder.and(in)).getGroupRestriction();
};

toPredicate方法参数说明:

  • Root:主要用于处理实体和字段、实体与实体之间的关系,还可以做join操作;
  • CriteriaQuery:主要用于对查询结果的处理,有groupBy、orderBy、having、distinct等操作;
  • CriteriaBuilder:主要是各种条件查询,就像刚刚的equal(等于)操作等;




End


最后

以上就是寂寞香烟为你收集整理的【Spring Data JPA】基于 JpaRepository 增删改查的全部内容,希望文章能够帮你解决【Spring Data JPA】基于 JpaRepository 增删改查所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部