摘要: com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件
PageHelper是国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释
开源项目地址: https://pagehelper.github.io/
请求URL:http://localhost:8080/listCity?page=1&limit=10
显示数据:

1、PageHelper的maven依赖及插件配置
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper</artifactId>
- <version>5.1.6</version>
- </dependency>
PageHelper除了本身的jar包外,它还依赖了一个叫jsqlparser的jar包,使用时,我们不需要单独指定jsqlparser的maven依赖,maven的间接依赖会帮我们引入。
2、配置拦截器插件
这个是配置在mybatis-config.xml文件中
文档中的示例
- <!--
- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
- properties?, settings?,
- typeAliases?, typeHandlers?,
- objectFactory?,objectWrapperFactory?,
- plugins?,
- environments?, databaseIdProvider?, mappers?
- -->
- <plugins>
- <!-- com.github.pagehelper为PageHelper类所在包名 -->
- <plugin interceptor="com.github.pagehelper.PageInterceptor">
- <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
- <property name="param1" value="value1"/>
- </plugin>
- </plugins>
3、我的配置mybatis-config.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
-
- <configuration>
- <typeAliases>
- <package name="edu.nf.entity"/>
- </typeAliases>
- <!-- 配置分页插件 -->
- <plugins>
- <plugin interceptor="com.github.pagehelper.PageInterceptor">
- <!--helperDialect 方言:就表示此插件针对哪个数据库进行优化处理
- 这个方言可以不配置,因为此插件可以依据你的 url 的信息来推断出
- 你用的数据库是哪一个
- -->
- <property name="helperDialect" value="mysql"/>
- <!--分页合理化参数-->
- <property name="reasonable" value="true"/>
- </plugin>
- </plugins>
- <!--配置数据库-->
- <environments default="mysql">
- <environment id="mysql">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/citydb?useSSL=true&useUnicode=true&characterEncoding=utf-8"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- </dataSource>
- </environment>
- </environments>
-
- <mappers>
- <mapper resource="mapper/city-mapper.xml"/>
- </mappers>
- </configuration>
4、city-mapper.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="edu.nf.dao.CityDao">
- <resultMap id="cityMap" type="city" >
- <id property="cityId" column="city_id"/>
- <result property="cityEn" column="city_en"/>
- <result property="cityCn" column="city_cn"/>
- <result property="countryCode" column="country_code"/>
- <result property="countryEn" column="country_en"/>
- <result property="countryCn" column="country_cn"/>
- <result property="provinceEn" column="province_en"/>
- <result property="provinceCn" column="province_cn"/>
- </resultMap>
- <!-- 这里写查询全部数据,配置好的分页插件他会自己加上limit 查询语句后面不能加; -->
- <select id="listCity" resultMap="cityMap">
- select * from city_test
- </select>
- <delete id="deleteCity" parameterType="java.util.List">
- delete from city_test where city_id in
- <foreach collection="list" item="city" open="(" separator="," close=")">
- #{city.cityId}
- </foreach>
- </delete>
- </mapper>
View Code
5、后台分页查询 servlet:
- /**
- * @author hh
- * @Date 2018/9/15
- */
- @WebServlet("/listCity")
- public class CityListServlet extends HttpServlet {
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.setContentType("application/json;charset=utf-8");
- //取出前端请求参数
- String page=req.getParameter("page");
- String limit=req.getParameter("limit");
- //分页查询结果 page页数 limit显示行数
- List<City> listCity=new CityService().listCity(page,limit);
- // 包装Page对象 listCity:page结果 , navigatePages: 页码数量
- PageInfo<City> list=new PageInfo<>(listCity,1);
- //自己写的一个响应视图类,因为前端用的是layui框架需要自己,所以自己定义ResponseView
- ResponseView vo=new ResponseView();
- //设值 取出总数据行
- vo.setCount(list.getTotal());
- //设值 查询的结果
- vo.setData(list.getList());
- //响应前端
- resp.getWriter().print(new Gson().toJson(vo));
- }
- }
6、响应视图类 ResponseView (因为前端用的是layui框架需要自己,所以自己定义ResponseView):

- package edu.nf.vo;
- /**
- * @author hh
- * @Date 2018/9/15
- */
- public class ResponseView {
- private int code =0;
- private Long count=0L;
- private Object data;
- public Integer getCode() {
- return code;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- public Long getCount() {
- return count;
- }
- public void setCount(Long count) {
- this.count = count;
- }
- public Object getData() {
- return data;
- }
- public void setData(Object data) {
- this.data = data;
- }
- }
View Code
7、实体类 City:

- package edu.nf.entity;
- /**
- * @author hh
- * @Date 2018/9/14
- */
- public class City {
- private String cityId;
- private String cityEn;
- private String cityCn;
- private String countryCode;
- private String countryEn;
- private String countryCn;
- private String provinceEn;
- private String provinceCn;
- public String getCityId() {
- return cityId;
- }
- public void setCityId(String cityId) {
- this.cityId = cityId;
- }
- public String getCityEn() {
- return cityEn;
- }
- public void setCityEn(String cityEn) {
- this.cityEn = cityEn;
- }
- public String getCityCn() {
- return cityCn;
- }
- public void setCityCn(String cityCn) {
- this.cityCn = cityCn;
- }
- public String getCountryCode() {
- return countryCode;
- }
- public void setCountryCode(String countryCode) {
- this.countryCode = countryCode;
- }
- public String getCountryEn() {
- return countryEn;
- }
- public void setCountryEn(String countryEn) {
- this.countryEn = countryEn;
- }
- public String getCountryCn() {
- return countryCn;
- }
- public void setCountryCn(String countryCn) {
- this.countryCn = countryCn;
- }
- public String getProvinceEn() {
- return provinceEn;
- }
- public void setProvinceEn(String provinceEn) {
- this.provinceEn = provinceEn;
- }
- public String getProvinceCn() {
- return provinceCn;
- }
- public void setProvinceCn(String provinceCn) {
- this.provinceCn = provinceCn;
- }
- }
View Code
8、service 逻辑业务层(CityService):
- /**
- * @author hh
- * @Date 2018/9/15
- */
- public class CityService {
- /**
- * 分页查询 城市信息集合
- * @return
- */
- public List<City> listCity(String offest,String pageSize){
- //类型转换
- Integer pnum=Integer.valueOf(offest);
- Integer psize=Integer.valueOf(pageSize);
- //调用PageHelper获取第1页,10条内容,默认查询总数count
- PageHelper.startPage(pnum,psize);
- //调用CityDaoImpl 分页查询
- return new CityDaoImpl().listCity();
- }
- /**
- * 批量删除
- * @param cityData
- * @return
- */
- public int deleteCity(String cityData){
- List<City> list=new Gson().fromJson(cityData,new TypeToken<List<City>>(){}.getType());
- try {
- new CityDaoImpl().deleteCity(list);
- return 200;
- } catch (Exception e) {
- e.printStackTrace();
- return 403;
- }
- }
- }
9、Dao 接口类:
- /**
- * @author hh
- * @Date 2018/9/14
- */
- public interface CityDao {
- /**
- * 城市信息列表
- * @return
- */
- List<City> listCity();
- /**
- * 批量删除
- * @param listCity
- */
- void deleteCity(List<City> listCity);
- }
10、Dao实现类:
- /**
- * @author hh
- * @Date 2018/9/14
- */
- public class CityDaoImpl implements CityDao {
- @Override
- public List<City> listCity() {
- List<City> list=null;
- try(SqlSession sqlSession = MybatisUtil.getSqlSession()){
- CityDao cityDao=sqlSession.getMapper(CityDao.class);
- list=cityDao.listCity();
- }
- return list;
- }
- @Override
- public void deleteCity(List<City> listCity) {
- try(SqlSession sqlSession = MybatisUtil.getSqlSession()){
- CityDao cityDao=sqlSession.getMapper(CityDao.class);
- cityDao.deleteCity(listCity);
- }
- }
- }
我的项目案例(包括了上一篇博客的分页查询):点我下载
项目结构:
