Spring + Mybatis + jQuery.Pagination.js 异步分页及 JsonConfig 的使用详解
在现代 Web 应用开发中,数据分页展示是一个常见的需求。Spring 作为优秀的 Java 企业级开发框架,Mybatis 作为持久层框架,搭配 jQuery.Pagination.js 前端分页插件以及 JsonConfig 处理 JSON 数据,能够高效地实现异步分页功能。本文将详细介绍如何整合这些技术实现该功能。
目录#
- 环境搭建
- Spring 与 Mybatis 整合配置
- 后端分页逻辑实现
- jQuery.Pagination.js 前端分页插件使用
- JsonConfig 的作用及使用
- 完整示例代码
- 总结与参考
1. 环境搭建#
1.1 项目依赖#
- Maven 依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>1.2 数据库准备#
创建一个测试表(以用户表为例):
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;2. Spring 与 Mybatis 整合配置#
2.1 Spring 配置文件(applicationContext.xml)#
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
</beans>2.2 Mybatis Mapper 文件(UserMapper.xml)#
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserList" resultType="com.example.entity.User">
SELECT * FROM user LIMIT #{offset}, #{pageSize}
</select>
<select id="getUserCount" resultType="int">
SELECT COUNT(*) FROM user
</select>
</mapper>3. 后端分页逻辑实现#
3.1 实体类(User.java)#
package com.example.entity;
public class User {
private int id;
private String username;
private int age;
// 省略 getter 和 setter 方法
}3.2 Mapper 接口(UserMapper.java)#
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
List<User> getUserList(@Param("offset") int offset, @Param("pageSize") int pageSize);
int getUserCount();
}3.3 Service 层(UserService.java)#
package com.example.service;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public Map<String, Object> getUserPage(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
List<User> userList = userMapper.getUserList(offset, pageSize);
int totalCount = userMapper.getUserCount();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("userList", userList);
resultMap.put("totalCount", totalCount);
return resultMap;
}
}3.4 Controller 层(UserController.java)#
package com.example.controller;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/page")
public Map<String, Object> getUserPage(@RequestParam("pageNum") int pageNum,
@RequestParam("pageSize") int pageSize) {
return userService.getUserPage(pageNum, pageSize);
}
}4. jQuery.Pagination.js 前端分页插件使用#
4.1 引入插件#
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery.pagination.js/2.1.6/jquery.pagination.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jQuery.pagination.js/2.1.6/pagination.css">4.2 前端页面(index.html)#
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spring + Mybatis + jQuery.Pagination.js 分页示例</title>
</head>
<body>
<table id="userTable">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>年龄</th>
</tr>
</thead>
<tbody></tbody>
</table>
<div id="pagination"></div>
<script>
$(function () {
var pageSize = 5;
var totalCount = 0;
function loadUserList(pageNum) {
$.ajax({
url: "/user/page",
type: "GET",
data: {
pageNum: pageNum,
pageSize: pageSize
},
success: function (data) {
var userList = data.userList;
totalCount = data.totalCount;
var tbody = $('#userTable tbody');
tbody.empty();
userList.forEach(function (user) {
tbody.append('<tr><td>' + user.id + '</td><td>' + user.username + '</td><td>' + user.age + '</td></tr>');
});
$('#pagination').pagination({
items: totalCount,
itemsOnPage: pageSize,
currentPage: pageNum,
prevText: '上一页',
nextText: '下一页',
onPageClick: function (pageNum) {
loadUserList(pageNum);
}
});
}
});
}
loadUserList(1);
});
</script>
</body>
</html>5. JsonConfig 的作用及使用#
5.1 JsonConfig 简介#
JsonConfig 是 Jackson 库中的一个类,用于配置 JSON 序列化和反序列化的规则。例如,可以配置日期格式、忽略某些字段等。
5.2 示例用法(在 Spring MVC 中配置)#
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
JsonFactory jsonFactory = objectMapper.getFactory();
JsonGenerator generator = jsonFactory.createGenerator(new StringWriter());
JsonGenerator.Feature[] features = {JsonGenerator.Feature.QUOTE_FIELD_NAMES, JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS};
generator.configure(features, true);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
converter.setObjectMapper(objectMapper);
converters.add(converter);
}
}6. 完整示例代码#
- GitHub 仓库:Spring-Mybatis-jQuery-Pagination-JsonConfig-Example(假设你已上传代码到 GitHub)
7. 总结#
通过本文的介绍,我们了解了如何使用 Spring、Mybatis、jQuery.Pagination.js 和 JsonConfig 实现异步分页功能。在实际项目中,要注意以下几点:
- 数据库优化:合理设计 SQL 语句,添加索引等优化查询性能。
- 前端交互:处理好分页插件与后端数据的交互逻辑,提供良好的用户体验。
- 异常处理:在后端和前端都要做好异常处理,防止系统崩溃。