Sprinboot中使用JPA及简单的原生分页组件

一、POM.xml文件配置

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

  

二、相关代码

 

实体:

 

@Entity
@Table(name = "userinfo")
public class UserInfo implements Serializable {
    @Id
    @GeneratedValue
    private long userid;
    private String username;
    private String password;
    private int age;
    省略getter&setter
}

  

DAO: 仅需要继承JpaRepository, 也可以继承PagingAndSortingRepository 实现更多功能, 这里只做最简单的演示

public interface UserInfoDao extends JpaRepository<UserInfo, Long>, Serializable {

}

Service:

public interface UserInfoService {
    //分页查询
    Page<UserInfo> findByPage(Pageable pageable);
}

ServiceImpl:

@Service
@Transactional
public class UserInfoServiceImpl implements UserInfoService {
    @Override
    public Page<UserInfo> findByPage(Pageable pageable) {
        return userInfoDao.findAll(pageable);
    }
}

Controller:

Pageable定义了很多方法,但其核心的信息只有两个:一是分页的信息(page、size(limit)),二是排序的信息。Spring Data Jpa提供了PageRequest的具体实现,Spring MVC提供了对Spring Data JPA非常好的支持,我们只提供分页以及排序信息即可:

//分页
@RequestMapping("/list")
public String pageUser(@RequestParam(value = "start", defaultValue = "0") Integer start,
                       @RequestParam(value = "limit", defaultValue = "10") Integer limit,
                       Model model){
    start = start <0 ? 0:start;
    Sort sort = new Sort(Sort.DEFAULT_DIRECTION, "userid");
    Pageable pageable = new PageRequest(start, limit, sort);
    Page<UserInfo>  page = userInfoService.findByPage(pageable);
    model.addAttribute("page", page);
    return "user/userlist";
}
//分页json
@RequestMapping("/pagejson")
@ResponseBody
public Page<UserInfo> pageUser(@PageableDefault(value = 15, sort = "userid", direction = Sort.Direction.ASC)Pageable pageable){
    return userInfoService.findByPage(pageable);
}

三、返回Json及对象

返回一个Json格式的Pageable方便查看对象:

{
    "content": [
        {
            "userid": 1,
            "username": "sasa",
            "password": "e",
            "age": 123
        },
        {
            "userid": 11,
            "username": "问问",
            "password": "w",
            "age": 121
        }
    ],
    "pageable": {
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "offset": 0,
        "pageSize": 15,
        "pageNumber": 0,
        "paged": true,
        "unpaged": false
    },
    "totalElements": 16,
    "totalPages": 2,
    "last": false,
    "number": 0,
    "size": 15,
    "sort": {
        "sorted": true,
        "unsorted": false,
        "empty": false
    },
    "numberOfElements": 15,
    "first": true,
    "empty": false
}

Json显示了Pageable的相关属性;, 也可直接使用,

这里我使用的是thymeleaf模板, 于是我使用第一个controller来渲染模板, 核心的显示数据如下, 省略了前后的引入.

<table class="table table-hover">
    <thead>
    <tr>
        <th>id</th>
        <th>name</th>
        <th>password</th>
        <th>age</th>
        <th>details</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="user: ${page.content}">
        <th scope="row" th:text="${user.getUserid()}">2</th>
        <th th:text="${user.getUsername()}">leo</th>
        <th th:text="${user.getPassword()}">pwd</th>
        <th th:text="${user.getAge()}">13</th>
        <th><a th:href="@{/user/findById(id=${user.getUserid()})}" >查看</a></th>  <!--代码中未给出实现,可删除或自己实现-->
        <th><a th:href="@{/user/deleteById(id=${user.getUserid()})}" >删除</a></th>    <!--代码中未给出实现,可删除或自己实现-->
    </tr>
    </tbody>
</table>
<ul class="list-group">
    <li class="list-group-item">
        <a  class="btn-default" th:href="@{/user/list(start=0)}">[首页]</a>  
        <a  class="btn-default" th:if="${not page.isFirst()}" th:href="@{/user/list(start=${page.number-1})}">[上页]</a>  
        <a  class="btn-default" th:if="${not page.isLast()}" th:href="@{/user/list(start=${page.number+1})}">[下页]</a>  
        <a  class="btn-default" th:href="@{/user/list(start=${page.totalPages-1})}">[末页]</a>
    </li>
</ul>

 四、参考其他

另可参考这篇文章:  https://www.tianmaying.com/tutorial/spring-jpa-page-sort(整合Spring Data JPA与Spring MVC: 分页和排序)

详细介绍了PagingAndSortingRepository, Pageable对象等, 但是只返回了Json数据, 而我使用了Thymeleaf返回对象并解析, 更快实现前端.

原文地址:https://www.cnblogs.com/kingstar718/p/10972700.html

时间: 2024-10-08 23:33:24

Sprinboot中使用JPA及简单的原生分页组件的相关文章

最简单的element分页组件二次封装

我感觉是最简单的, 因为我看别人的实现,要么带sync,要么传父组件函数. 而我这个,我觉得隔离得比较好. pagnation.vue(父组件传一个pageRequest过来,分页组件返回给父组件一个refreshPageRequest) ) <template> <div> <div class="toolbar" style="padding:10px;"> <el-pagination layout="tot

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

Java SE环境中测试JPA实体的简单方法

Java SE环境中测试JPA实体的简单方法 出于软件质量的考虑,理论上来说我们写的一切代码都要经过测试.JPA的测试不像普通的组件那么方便,因为JPA涉及到数据库,所以集成测试必不可少,像Arquillian这样的测试框架能处理比较复杂的集成测试,但是它的配置相对也更复杂一点,所以本篇文章主要讲一下在Java SE环境中较简单地测试JPA实体(Entity)的方法. 我们需要实现的目标有:1.不需要mysql这样需要额外安装的数据库:2.在SE环境中可以直接测试. 相关工具我们主要用到JUni

Spring data jpa 实现简单动态查询的通用Specification方法

本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字段查询,下面通过泛型改写了这个方法: import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import j

Hibernate Search JPA + Lucene 简单应用实例

假设现在有这么一个应用场景.数据库里存放了大量文章,我们想要通过输入关键字,从数据库中检索出相关的文章. 1.建立Article Entity: public class Article { private String id;            //ID private String title;         //标题 private String content;       //内容         private String isPublication; //发布状态 publ

spring data jpa 的简单使用

先说简单一下JPA 概念:JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据. 影响:他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面 进入正题 Spring DATA JPA 1.概念:它是基于ORM框架.JPA规范封装的一套JPA应用框架可使开发者用极简的代码即可实现对数据的访问和操作,它提

生产环境中的PHP WEB 简单架构

使用三台虚拟机器, Ubuntu1(nginx) 192.168.226.128 Ubuntu2(php-fpm+memcached)192.168.226.132 CentOS(MySQL)192.169.226.130 PHP 框架使用CakePHP,这个是很常用的MVC 框架,基于事件的分发模型 当然需要注意的是框架代码要部署在php-fpm机器上,需要在nginx 中配置的配置如下 余下的内容: 1. CakePHP 框架代码 2. PHP 内核 3. Nginx内核 4. 数据库设计模

java中配置JPA方法

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 使用JPA进行保存对象时,可以用对象来接收,例如:proOrder1 =  proOrderRepository.save(proOrder);

Android中接口(Interface)的简单使用

  Android中接口(Interface)的简单使用 Java中的接口可以被看作是只包含常量和抽象方法的抽象类 . 可以使用如下方式定义一个接口: public interface InterfaceDemo { int i = 10; void method1(); int method2(); } 使用1: 解决“多重继承”的问题 Java语言本身是不支持类的多重继承(多重继承是指一个类从多个类继承而来,即一个类拥有多个超类)的,但一个类却可以实现多个接口.这样,我们可以将一些抽象方法定