下面我将详细讲解“Spring Data JPA+kkpager实现分页功能实例”的完整攻略。
一、什么是Spring Data JPA
Spring Data JPA 是 Spring 市场上的众多后续产品中的一个,它简化了基于 JPA 的数据访问层的开发。Spring Data JPA 使得我们可以通过编写接口的方式来提供自定义方法,而无需实现这些接口。Spring Data JPA 可以自动生成常见的 CRUD 操作,增加了程序员的开发效率。
二、Spring Data JPA 和 kkpager 用法
1. Spring Data JPA 分页
Spring Data JPA 的分页使用非常简单,只需要定义一个继承自 JpaRepository 的接口,然后在查询方法上使用 Pageable 参数即可实现分页。
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findByAge(Integer age, Pageable pageable);
}
在上面的代码中,我们定义了一个 UserRepository 接口,并继承了 JpaRepository。然后,在 findByAge 方法上,我们引入了 Pageable 参数。这个参数用于告诉 Spring Data JPA 分页的大小和当前页数。
2. kkpager 分页插件
kkpager 是一款基于 jQuery 的分页插件,它支持多种分页模式,可自定义样式,并且易于操作。kkpager 使用非常简单,我们只需要在页面引入相关的 js 和 css 文件,并定义一个分页器容器即可。
<!-- 引入 jQuery、kkpager 的 js 文件和 kkpager 的样式文件 -->
<script src="jquery.js"></script>
<script src="kkpager.min.js"></script>
<link href="kkpager.css" rel="stylesheet" type="text/css">
<!-- 定义分页容器 -->
<div id="pageContainer"></div>
在上面的代码中,我们首先引入了 jQuery 和 kkpager 的 js 文件以及 kkpager 的样式文件。然后,我们定义了一个 id 为 pageContainer 的 div 元素,用于显示分页器。
3. 实现分页功能
实现分页功能的最简单的方法是在 Spring Boot 中使用 kkpager-spring-boot-starter 这个插件,该插件无需额外的配置,只需要引用依赖即可。使用该插件后,我们可以在 Service 层中直接调用 mapper 的分页方法,返回一个分页对象即可。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public Page<User> findByAge(Integer age, Integer pageNum, Integer pageSize) {
// 使用 PageHelper 开始分页
PageHelper.startPage(pageNum, pageSize);
// 执行查询
List<User> userList = userMapper.findByAge(age);
// 封装分页信息
PageInfo<User> pageInfo = new PageInfo<>(userList);
// 返回分页对象
return new PageImpl<>(userList, PageRequest.of(pageNum - 1, pageSize), pageInfo.getTotal());
}
}
在上面的代码中,我们首先使用 Spring 的注解 @Service 标记该类为 Service 层的实现类,并注入一个 UserMapper 实例。然后,在 findByAge 方法中,我们通过 PageHelper.startPage() 方法开启分页,然后执行查询,得到一个用户列表。接着,我们使用 PageInfo 类封装分页信息,并最终返回一个分页对象。
最后,在 Controller 层,我们将分页对象传递到前端,并使用 kkpager 渲染分页组件即可。
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public String list(Model model,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<User> page = userService.findByAge(18, pageNum, pageSize);
model.addAttribute("page", page);
return "user/list";
}
}
在上面的代码中,我们首先使用 Spring 的注解 @Controller 标记该类为 Controller 层,注入一个 UserService 实例。然后,在 list 方法中,我们通过调用 UserService 的 findByAge 方法获取分页对象,并将其封装到 Model 中传递到视图层。
视图层中我们会使用如下格式进行分页器的渲染:
kkpager.generPageHtml({
pagerid: 'pageContainer',
align: 'center',
mode: 'click',
total: <%= page.getTotalPages() %>,
pno: <%= page.getNumber() + 1 %>,
isGoPage: false,
callback: function(pageIndex){
// TODO: 在回调方法中重新加载分页数据
}
});
在上面的代码中,我们调用了 kkpager 的 generPageHtml() 方法,传递了一些参数。这些参数中,pagerid 表示分页器容器的 id,total 表示总页数,pno 表示当前页数。
当用户点击分页器时,会触发 callback 回调函数。我们在该回调函数中重新加载分页数据,即可实现翻页操作。
三、示例说明
1. Spring Data JPA 分页示例
我们可以使用如下的 SQL 语句初始化一个 User 表。
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
然后,我们可以使用如下的代码进行数据分页操作。
@Test
public void testFindByAge() {
Page<User> page = userRepository.findByAge(18, PageRequest.of(0, 10));
System.out.println(page.getContent()); // 输出分页后的数据
System.out.println(page.getNumber()); // 当前页数,从0开始
System.out.println(page.getNumberOfElements()); // 当前页的数据数量
System.out.println(page.getSize()); // 每页大小
System.out.println(page.getTotalElements()); // 总数据数量
System.out.println(page.getTotalPages()); // 总页数
}
在上面的代码示例中,我们首先通过调用 userRepository 的 findByAge 方法,传递了两个参数:age 和 PageRequest.of(0, 10),age 表示年龄为 18 的用户,PageRequest 表示当前页数为 0,每页大小为 10。
然后,我们通过调用 Page 对象的一些方法获取分页后的数据,当前页数,当前页的数据数量,每页大小,总数据数量和总页数。
2. kkpager 分页示例
我们可以使用如下的 SQL 语句初始化一个 User 表。
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
然后,我们可以使用如下的 Service 层代码进行分页操作。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public Page<User> findByAge(Integer age, Integer pageNum, Integer pageSize) {
// 使用 PageHelper 开始分页
PageHelper.startPage(pageNum, pageSize);
// 执行查询
List<User> userList = userMapper.findByAge(age);
// 封装分页信息
PageInfo<User> pageInfo = new PageInfo<>(userList);
// 返回分页对象
return new PageImpl<>(userList, PageRequest.of(pageNum - 1, pageSize), pageInfo.getTotal());
}
}
在上面的代码中,我们首先使用 Spring 的注解 @Service 标记该类为 Service 层的实现类,并注入一个 UserMapper 实例。然后,在 findByAge 方法中,我们通过 PageHelper.startPage() 方法开启分页,然后执行查询,得到一个用户列表。接着,我们使用 PageInfo 类封装分页信息,并最终返回一个分页对象。
最后,在 Controller 层,我们将分页对象传递到前端,并使用 kkpager 渲染分页组件即可。
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public String list(Model model,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<User> page = userService.findByAge(18, pageNum, pageSize);
model.addAttribute("page", page);
return "user/list";
}
}
在上面的代码中,我们首先使用 Spring 的注解 @Controller 标记该类为 Controller 层,注入一个 UserService 实例。然后,在 list 方法中,我们通过调用 UserService 的 findByAge 方法获取分页对象,并将其封装到 Model 中传递到视图层。
视图层中我们会使用如下格式进行分页器的渲染:
kkpager.generPageHtml({
pagerid: 'pageContainer',
align: 'center',
mode: 'click',
total: <%= page.getTotalPages() %>,
pno: <%= page.getNumber() + 1 %>,
isGoPage: false,
callback: function(pageIndex){
// TODO: 在回调方法中重新加载分页数据
}
});
在上面的代码中,我们调用了 kkpager 的 generPageHtml() 方法,传递了一些参数。这些参数中,pagerid 表示分页器容器的 id,total 表示总页数,pno 表示当前页数。
当用户点击分页器时,会触发 callback 回调函数。我们在该回调函数中重新加载分页数据,即可实现翻页操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Data JPA+kkpager实现分页功能实例 - Python技术站