引言:由于公司转型,使我原本android开发工程师,转变为后台开发工程师,对于后台,除了大学利用servlet写过些项目,其他就一无所知。公司使用spring-boot框架.那么spring-boot框架究竟是什么呢?Spring-boot是微框架,是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。好了废话不说了,下面讲讲分页实例吧。

首先我们创建两个实例(表)

TestPage 和TestPageRef,其中TestPageRef关联TestPage的Id,其中这两个表都继承TimeScopeEntity(增加了id和创建时间字段)

/**
 * 分页测试表
 * @author  CentMeng <mengshaojie@188.com>
 * @date    Aug 8, 2016 3:30:45 PM
 * @copyright ©2016 孟少杰 All Rights Reserved
 * @desc  
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "T_TESTPAGE")
public class TestPage extends TimeScopeEntity{

    private String name;

    private String content;

}
/**
 * 分页测试表关联表
 * @author  CentMeng <mengshaojie@188.com>
 * @date    Aug 8, 2016 3:30:45 PM
 * @copyright ©2016 孟少杰 All Rights Reserved
 * @desc  
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "T_TESTPAGEREF")
public class TestPageRef extends TimeScopeEntity{

    private String testId;

    private boolean enabled;

}

写Dao层接口,主要是继承PagingAndSortingRepository

这里我们写一个获取list的方法接口,返回的是Page对象

也可以返回某些字段,将t,替换成t.id,t.content等等

import javax.transaction.Transactional;
import net.luoteng.muser.entity.TestPage;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

/**
 * 分页测试
 * @author  CentMeng <mengshaojie@188.com>
 * @date    Aug 8, 2016 3:39:55 PM
 * @copyright ©2016 孟少杰 All Rights Reserved
 * @desc  
 */
@Transactional
public interface TestRepository extends PagingAndSortingRepository<TestPage,String>{
    @Query("select t from TestPage t,TestPageRef r where t.id = r.testId and r.enabled = :enabled")
    public Page<TestPage> findList( @Param("enabled") boolean enabled,Pageable pageable);

}

写Service层

Service层要分接口层和实现层,springboot的注入为接口注入

接口
package net.luoteng.muser.service;

import net.luoteng.muser.common.PageResult;
import net.luoteng.muser.entity.TestPage;
import org.springframework.data.domain.Pageable;

/**
 *
 * 分页测试
 * @author  CentMeng <mengshaojie@188.com>
 * @date    Aug 8, 2016 3:37:51 PM
 * @copyright ©2016 孟少杰 All Rights Reserved
 * @desc  
 */
public interface TestService {

      public PageResult<TestPage> list(boolean enabled,Pageable pageable);
}
实现
import java.util.List;
import javax.transaction.Transactional;
import net.luoteng.muser.common.PageResult;
import net.luoteng.muser.dao.TestRepository;
import net.luoteng.muser.entity.TestPage;
import net.luoteng.muser.service.TestService;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;

/**
 *
 * @author  CentMeng <mengshaojie@188.com>
 * @date    Aug 8, 2016 4:21:25 PM
 * @copyright ©2016 孟少杰 All Rights Reserved
 * @desc  
 */
@Component
@Transactional
public class TestImpl implements TestService{

    @Autowired
    TestRepository testRepository;

    @Override
    public PageResult<TestPage> list(boolean enabled, Pageable pageable) {
      Page<TestPage> testPages = testRepository.findList(enabled,pageable);
        List<TestPage> tests = testPages.getContent();

        if (!CollectionUtils.isEmpty(tests)) {
            PageResult pageResult = new PageResult(tests, testPages.getTotalElements());
            return pageResult;
        } else {
            return null;
        }
    }

}

Page返回参数说明:

{
  "content":[
    {"id":123,"title":"blog122","content":"this is blog content"},
    {"id":122,"title":"blog121","content":"this is blog content"},
    {"id":121,"title":"blog120","content":"this is blog content"},
    {"id":120,"title":"blog119","content":"this is blog content"},
    {"id":119,"title":"blog118","content":"this is blog content"},
    {"id":118,"title":"blog117","content":"this is blog content"},
    {"id":117,"title":"blog116","content":"this is blog content"},
    {"id":116,"title":"blog115","content":"this is blog content"},
    {"id":115,"title":"blog114","content":"this is blog content"},
    {"id":114,"title":"blog113","content":"this is blog content"},
    {"id":113,"title":"blog112","content":"this is blog content"},
    {"id":112,"title":"blog111","content":"this is blog content"},
    {"id":111,"title":"blog110","content":"this is blog content"},
    {"id":110,"title":"blog109","content":"this is blog content"},
    {"id":109,"title":"blog108","content":"this is blog content"}],
  "last":false,
  "totalPages":9,
  "totalElements":123,
  "size":15,
  "number":0,
  "first":true,
  "sort":[{
    "timeCreated":"DESC",
  }],
  "numberOfElements":15
}

以id倒序排列的10条数据

当前页不是最后一页,后面还有数据

总共有9页

每页大小为15

当前页为第0页

当前页是第一页

当前页是以id倒序排列的

当前页一共有15条数据

Controller层

关键代码

@Autowired
    TestService testService;

   /**
     *
     * @param page
     * @param pageSize
     * @return
     */
    @RequestMapping(value = "/test/page", method = RequestMethod.GET)
    public RestResponse testPage(
            @RequestParam(value = "page", defaultValue = "0") Integer page,
            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        RestResponse result = new RestResponse();
        //排序对象
        Sort sort = new Sort(Sort.Direction.DESC, "timeCreated");
        Pageable pageable = new PageRequest(page, pageSize, sort);

        PageResult<TestPage> pageResult = testService.list(true, pageable);

        return result.success(pageResult);
    }

OK这样,分页关联表查询效果就实现了

注解解释

只是个人查看记忆用,非本次讲解内容

@Data 自动创建getter和setter 
 @NoArgsConstructor 
 @AllArgsConstructor 这两个是声明构造函数 
 @Entity 申明是实体,需要创建表的都会用到 
 @Table(name = “T_TESTPAGE”) 创建表,可以设置表名,以及唯一键 
 @Component 在service实现层使用 
 @Transactional 事务 在service实现层和dao层都需要使用 
 @Autowired 自动引入,自己构造的则不用使用此注解 
 @RequestMapping(value = “/test/page”, method = RequestMethod.GET) 配置请求路径和请求方式