Spring Boot利用Spring Data JPA实现排序与分页查询实战(附源码,超详细)

简介: Spring Boot利用Spring Data JPA实现排序与分页查询实战(附源码,超详细)

在实际开发场景中,排序与分页查询是必须的,幸运的是Spring Data JPA充分考虑了排序与分页查询的场景,为我们提供Sort类 Page接口 Pageable接口 下面通过一个实战来阐明

1:创建持久化实体类

创建名为com.ch.ch6_4.entity的包 并在该包中创建名为Article和Author的持久化实体类

代码如下

Article

package com.ch.ch6_2.entity;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "article_table")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
public class Article  implements Serializable{
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  //标题
  @NotEmpty(message = "标题不能为空")
    @Size(min = 2, max = 50)
    @Column(nullable = false, length = 50) 
    private String title;
  //文章内容
    @Lob  //大对象,映射 为MySQL的Long文本类型
    @Basic(fetch = FetchType.LAZY) 
    @NotEmpty(message = "内容不能为空")
    @Size(min = 2)
    @Column(nullable = false) 
    private String content;
    //所属作者,文章与作者是多对一的关系
    @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
    //可选属性optional=false,表示author不能为空。删除文章,不影响用户
    @JoinColumn(name="id_author_id")//设置在article表中的关联字段(外键)
    @JsonIgnore
    private Author author;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getContent() {
    return content;
  }
  public void setContent(String content) {
    this.content = content;
  }
  public Author getAuthor() {
    return author;
  }
  public void setAuthor(Author author) {
    this.author = author;
  }
}

Author

package com.ch.ch6_2.entity;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "author_table")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
public class Author implements Serializable{
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  //作者名
  private String aname;
  //文章列表,作者与文章是一对多的关系
    @OneToMany(
        mappedBy = "author",
        cascade=CascadeType.ALL,
        targetEntity = Article.class, 
        fetch=FetchType.LAZY
        )
    private List<Article> articleList;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getAname() {
    return aname;
  }
  public void setAname(String aname) {
    this.aname = aname;
  }
  public List<Article> getArticleList() {
    return articleList;
  }
  public void setArticleList(List<Article> articleList) {
    this.articleList = articleList;
  }
}

2:创建数据访问层

创建名为com.ch.ch6_4repository的包 并在该包中创建名为AuthorRepository的接口

package com.ch.ch6_2.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.ch.ch6_2.entity.Author;
public interface AuthorRepository extends JpaRepository<Author, Integer>{
  /**
   * 根据文章标题包含的内容,查询作者(关联查询)
   * 相当于JPQL语句:select a from Author a  inner join  a.articleList t where t.title like %?1%
   */
  public Author findByArticleList_titleContaining(String title);
  /**
   * 根据文章标题包含的内容,查询作者(关联查询)
   */
  @Query("select a from Author a  inner join  a.articleList t where t.title like %?1%" )
  public Author findAuthorByArticleListtitleContaining(String title);
}

3:创建业务层

创建名为com.ch.ch6_4.service的包 并在该包中创建名为ArticleAndAuthorService的接口和接口实现类ArticleAndAuthorServiceImpl

接口

package com.ch.ch6_2.service;
import java.util.List;
import com.ch.ch6_2.entity.Article;
import com.ch.ch6_2.entity.Author;
public interface AuthorAndArticleService {
  public void saveAll();
  public List<Article> findByAuthor_id(Integer id);
  public List<Article> findByAuthor_aname(String aname);
  public Author findByArticleList_titleContaining(String title);
  public Author findAuthorByArticleListtitleContaining(String title);
}

接口实现类

package com.ch.ch6_2.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ch.ch6_2.entity.Article;
import com.ch.ch6_2.entity.Author;
import com.ch.ch6_2.repository.ArticleRepository;
import com.ch.ch6_2.repository.AuthorRepository;
@Service
public class AuthorAndArticleServiceImpl implements AuthorAndArticleService{
  @Autowired
  private AuthorRepository authorRepository;
  @Autowired
  private ArticleRepository articleRepository;
  @Override
  public void saveAll() {
    //保存作者(先保存一的一端)
    Author a1 = new Author();
    a1.setAname("陈恒1");
    Author a2 = new Author();
    a2.setAname("陈恒2");
    ArrayList<Author> allAuthor = new ArrayList<Author>();
    allAuthor.add(a1);
    allAuthor.add(a2);
    authorRepository.saveAll(allAuthor);
    //保存文章
    Article at1 = new Article();
    at1.setTitle("JPA的一对多111");
    at1.setContent("其实一对多映射关系很常见111。");
    //设置关系
    at1.setAuthor(a1);
    Article at2 = new Article();
    at2.setTitle("JPA的一对多222");
    at2.setContent("其实一对多映射关系很常见222。");
    //设置关系
    at2.setAuthor(a1);//文章2与文章1作者相同
    Article at3 = new Article();
    at3.setTitle("JPA的一对多333");
    at3.setContent("其实一对多映射关系很常见333。");
    //设置关系
    at3.setAuthor(a2);
    Article at4 = new Article();
    at4.setTitle("JPA的一对多444");
    at4.setContent("其实一对多映射关系很常见444。");
    //设置关系
    at4.setAuthor(a2);//文章3与文章4作者相同
    ArrayList<Article> allAt = new ArrayList<Article>();
    allAt.add(at1);
    allAt.add(at2);
    allAt.add(at3);
    allAt.add(at4);
    a
  public Author findByArticleList_titleContaining(String title) {
    return authorRepository.findByArticleList_titleContaining(title);
  }
  @Override
  public Author findAuthorByArticleListtitleContaining(String title) {
    return authorRepository.findAuthorByArticleListtitleContaining(title);
  }
}

4:创建控制器类

创建名为com.ch,ch6_4.controller的包 并在该包中创建名为TestSortAndPage的控制器类

package com.ch.ch6_4.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ch.ch6_4.entity.Author;
import com.ch.ch6_4.service.ArticleAndAuthorService;
@Controller
public class TestSortAndPage {
  @Autowired 
  private ArticleAndAuthorService articleAndAuthorService;
  @RequestMapping("/findByAnameContaining")
  @ResponseBody
  public List<Author> findByAnameContaining(String aname, String sortColum){
    return articleAndAuthorService.findByAnameContaining(aname, sortColum);
  }
  @RequestMapping("/findAllAuthorByPage")
  /**
   * @param page第几页
   */
  public String findAllAuthorByPage(Integer page, Model model){
    return articleAndAuthorService.findAllAuthorByPage(page, model);
  }
}

5:创建View视图页面

创建index.html页面 部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>显示分页查询结果</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
</head>
<body>
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h3 class="panel-title">Spring Data JPA分页查询</h3>
    </div>
              </tr>
              <tr>
              <td colspan="2" align="right">
                <ul class="pagination">
                  <li><a>第<span th:text="${page}"></span>页</a></li>
                  <li><a>共<span th:text="${totalPage}"></span>页</a></li>
                  <li><a>共<span th:text="${totalCount}"></span>条</a></li>
                  <li>
                  <a th:href="@{findAllAuthorByPage(page=${page-1})}" th:if="${page != 1}">上一页</a>
                  </li>
                  <li><a th:href="@{findAllAuthorByPage(page=${page+1})}" th:if="${page != totalPage}">下一页</a>
                  </li>
                </ul>
              </td>
            </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</body>
</html>

6:运行主类  效果如下

 

相关文章
|
21天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
178 37
|
9天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
11天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
16天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
2月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
69 0
|
2月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
61 0
|
2月前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
52 0
|
9天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
3月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
下一篇
无影云桌面