分页查询方法
spring提供了page,pageable接口来帮助实现分页功能的实现。
在原先查询中,Repository层不需要定义findAll()方法,可以直接在service层对其进行调用。但如果需要查询全部数据具有分页功能,需要在Repository层进行重写。
Repository层:
//Repository贮藏库,完成sql数据库操作
public interface BookRepository extends JpaRepository<book,Long> {
Page<book> findAll(Pageable pageable);
}
Service层
@Service
public class BookService {
@Autowired
private BookRepository bookRepository;
//查询所有的书单信息————————原本的
public List<book> findAll(){
return bookRepository.findAll();
}
//分页查询所有的书单信息————————分页的
public Page<book> findAllByPage(Pageable pageable){
return bookRepository.findAll(pageable);
}
}
Controller层
初始版:
@Controller
public class BookController {
@Autowired
private BookService bookService;
@GetMapping("/books")
public String getAll(@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "5") int size,Model model){
Page<book> bookList=bookService.findAllByPage(PageRequest.of(page,size));
model.addAttribute("page",bookList);
return "bookList";
//PageRequest.of(page,size)会自动与pageable中属性对应。
//PageRequest是Pageable的实现类。用于构造分页查询需要的页码(从0开始)、每页行数、排序等.
}
}
自动绑定page参数版本(建议使用)
@Controller
public class BookController {
@Autowired
private BookService bookService;
/*获取书单列表详情*/
@RequestMapping("/books")
public String list(@PageableDefault(size=5,sort={"id"},direction = Sort.Direction.DESC) Pageable pageable,
Model model){
//用@PageableDefault规定了pageable每页大小为5,按id排序,倒序排列。
//不需要再使用pageRequest来装填pageable。
Page<book> bookList=bookService.findAllByPage(pageable);
model.addAttribute("page",bookList);
return "bookList"; //指向templates中的books.html
}
}
最后是bookList.jsp页面中翻页按钮的设置,用到了thymeleaf模板。
当且仅当page.first为真,即当前页是第一页,《上一页》按钮不会显示。
当且仅当page.last为真,即当前页是最后一页,《下一页》按钮不会显示。
<nav>
<ul class="pager">
<li class="previous"><a href="#" th:href="@{'/books?page='+${page.number-1}}" th:unless="${page.first}">上一页</a></li>
<li class="next"><a href="#" th:href="@{/books(page=${page.number}+1)}" th:unless="${page.last}">下一页</a></li>
</ul>
</nav>