文章目录
一、前言:
Java开发是一门广泛应用于各种软件系统和网络应用的重要技术。在实际开发中,经常需要处理大量的数据和结果集,而分页功能则成为了提高用户体验和系统性能的关键。分页是将大数据集按照固定大小划分成多页并逐页显示的过程,能够有效减少数据传输量和页面加载时间,提升用户浏览效率。
在Java后端开发中,实现分页功能可以应用多种方法和技术。可以使用第三方的分页插件或框架来简化分页的操作和管理,如Spring Data JPA的分页支持。在本文中,将探讨Java后端开发中实现分页功能的方法和技巧。通过详细介绍常用的分页算法,同时,也将分享一些实际案例和示例代码,加深对分页功能的理解和应用
二、 实现步骤:
- 在model层定义一个实体类Books;
- 在repository层定义一个接口BooksRepository;
- 在service层定义一个接口BookService;
- 在service层定义一个接口BookService的实现类BooksServiceimpl;
- 在controller控制层写一个控制类BoksController;
- 在servlet层写一个BooksListApplication文件,用于运行整体程序;
- 在templates下写入html文件
三、项目整体框架:
四、实现过程
新建项目,并添加依赖
2.添加数据库信息,在application.properties写入连接的数据库名,连接的用户名与密码:
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8spring.datasource.username= 用户名spring.datasource.password= 用户密码spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQLDialectspring.jpa.hibernate.ddl-auto= updatelogging.level.org.hibernate.SQL=DEBUGlogging.level.org.hibernate.type=TRACE
在model层写一个实体类Books,里面定义书本的信息及类型:
@Data@Entity@Table(name = "books")public class Books { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "name")//书名 private String name; @Column(name = "author")//作者 private String author; @Column(name = "publish")//出版 private String publish; @Column(name = "price")//价格 private String price;}
在repository层写一个接口,用于封装数据的查询、创建、更新、删除等,供后续调用:
public interface BooksRepository extends JpaRepository<Books,Long> { @Query("select b from Books b where b.name like %:name%") List<Books> findAllByBooksName(@Param("name") String name);}
在service层写一个接口BooksService,这个服务类用于服务后续测试,里面定义了方法,比如说将获取的书本存进一个列表里、新增一本书或者更新书的信息、将查询来的书本存进一个新的列表,将它们进行分页展示
public interface BookService { //获取所有的书本 List<Books> getAllBooks(); //新增/更新一本书 void saveBooks(Books books); //获取指定ID的书本 Books getBooksById(long id); //删除指定ID的书本 void deleteBooksById(long id); //分页 Page<Books> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection); List<Books> findByBooksName(String name);}
在service层写一个测试类BooksServiceimpl用来继承BooksService,实现获取书本、根据id查找书本、保存书本信息到列表、根据id删除书本、根据书名查找列表是否存在此书本信息、设置排序参数,关键代码展示:
@Servicepublic class BooksServiceImpl implements BookService {@Autowired private BooksRepository booksRepository;//获取所有书本 @Override public List<Books> getAllBooks() { return booksRepository.findAll(); } @Override public void saveBooks(Books books) { this.booksRepository.save(books); } @Override public Books getBooksById(long id) { //调用数据访问层查找指定ID的书本,返回Optional==(选择)对象 Optional<Books> optional = booksRepository.findById(id); Books books = null; //如果存在指定id的书本 if (optional.isPresent()) { //从Optional对象中获取书本对象 books = optional.get(); } else { //否则抛出运行时异常 throw new RuntimeException(" 找不到书本ID :: " + id); } return books; } //删除指定id的书本 @Override public void deleteBooksById(long id) { this.booksRepository.deleteById(id); } @Override public Page<Books> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) { //设置排序参数,升序ASC/降序DESC? Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortField).ascending() : Sort.by(sortField).descending(); //根据页号/每页记录数/排序依据返回某指定页面数据。 Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort); return this.booksRepository.findAll(pageable); } @Override public List<Books> findByBooksName(String name) { List<Books> optiona1 = booksRepository.findAllByBooksName(name); return optiona1; }}
6. 在Controller层写入一个控制类,声明链接跳转到哪个页面进行,跳转后的返回值:
@GetMapping("/deleteBooks/{id}") public String deleteBooks(@PathVariable(value = "id") long id) { // call delete employee method this.bookService.deleteBooksById(id); return "redirect:/"; } //获取分页数据 @GetMapping("/page/{pageNo}") public String findPaginated(@PathVariable (value = "pageNo") int pageNo, @RequestParam("sortField") String sortField, @RequestParam("sortDir") String sortDir, Model model) { int pageSize = 5;//每页数据量 Page<Books> page = bookService.findPaginated(pageNo, pageSize, sortField, sortDir); List<Books> listBooks = page.getContent(); model.addAttribute("currentPage", pageNo);//当前页面 model.addAttribute("totalPages", page.getTotalPages());//总页面数 model.addAttribute("totalItems", page.getTotalElements()); model.addAttribute("sortField", sortField); model.addAttribute("sortDir", sortDir); model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc"); model.addAttribute("listBooks", listBooks); return "index"; }
- 在servlet层写入一个测试文件,用于运行整体程序:
@SpringBootApplicationpublic class BooksListApplication { public static void main(String[] args) { SpringApplication.run(BooksListApplication.class, args); }}
- 在templates层下写html文件,用于前端的展示
(1)new_books页面:用于保存页面跳转后的页面:
(2)update_books页面:通过bootstrap官网,查看更改update books按钮的样式,将它设置成圆角绿色:
(3)index页面:新增一个查询框,学习bootstrap官网的按钮设置,将查询框里的样式改变:
更改update、delete按钮颜色:
五、整体效果:
六、每日一语
“有风有雨是常态,风雨兼程是状态,风雨无阻是心态” ___摘自央视
来源地址:https://blog.csdn.net/m0_66232575/article/details/131487347