当前位置: 首页 > 编程笔记 >

Spring Boot+Mybatis+Pagehelper分页实现

龚奇逸
2023-03-14
本文向大家介绍Spring Boot+Mybatis+Pagehelper分页实现,包括了Spring Boot+Mybatis+Pagehelper分页实现的使用技巧和注意事项,需要的朋友参考一下

Spring Boot 集成MyBatis和Pagehelper分页插件

mybatis-spring-boot-starter依赖树如下:

pom配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.xiaolyuh</groupId>
  <artifactId>spring-boot-student-mybatis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>spring-boot-student-mybatis</name>

  <!-- 添加Spring Boot的父类依赖,这样当前项目就是Spring Boot项目了。 spring-boot-starter-parent是一个特殊的starter,他用来
    提供相关的maven默认依赖, 使用它之后,常用的依赖可以省去version标签 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.0</version>
    </dependency>
    <!--pagehelper -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.1.1</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.31</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

application.properties配置

server.port=80
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/ssb_test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
#连接池配置
#spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource

#mybatis
#entity扫描的包名
mybatis.type-aliases-package=com.xiaolyuh.domain.model
#Mapper.xml所在的位置
mybatis.mapper-locations=classpath*:/mybaits/*Mapper.xml

#pagehelper分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

#日志配置
logging.level.com.xiaolyuh=debug
logging.level.org.springframework.web=debug
logging.level.org.springframework.transaction=debug
logging.level.org.mybatis=debug

debug=false

除了上面常见的两项配置,还有:

mybatis.config-location=mybatis-config.xml配置文件的路径
mybatis.type-handlers-package=扫描typeHandlers的包
mybatis.check-config-location=检查配置文件是否存在
mybatis.executor-type=设置执行模式(SIMPLE, REUSE, BATCH),默认为SIMPLE

Mapping XML文件

在resources文件夹下创建mybaits/PersonMapper.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.xiaolyuh.domain.mapper.PersonMapper" >
 <resultMap id="BaseResultMap" type="com.xiaolyuh.domain.model.Person" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  <id column="id" property="id" jdbcType="BIGINT" />
  <result column="name" property="name" jdbcType="VARCHAR" />
  <result column="age" property="age" jdbcType="INTEGER" />
  <result column="address" property="address" jdbcType="VARCHAR" />
 </resultMap>
 <sql id="Base_Column_List" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  id, name, age, address
 </sql>
 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  select 
  <include refid="Base_Column_List" />
  from person
  where id = #{id,jdbcType=BIGINT}
 </select>
 <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  delete from person
  where id = #{id,jdbcType=BIGINT}
 </delete>
 <insert id="insert" parameterType="com.xiaolyuh.domain.model.Person" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
   SELECT LAST_INSERT_ID()
  </selectKey>
  insert into person (name, age, address
   )
  values (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{address,jdbcType=VARCHAR}
   )
 </insert>
 <insert id="insertSelective" parameterType="com.xiaolyuh.domain.model.Person" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
   SELECT LAST_INSERT_ID()
  </selectKey>
  insert into person
  <trim prefix="(" suffix=")" suffixOverrides="," >
   <if test="name != null" >
    name,
   </if>
   <if test="age != null" >
    age,
   </if>
   <if test="address != null" >
    address,
   </if>
  </trim>
  <trim prefix="values (" suffix=")" suffixOverrides="," >
   <if test="name != null" >
    #{name,jdbcType=VARCHAR},
   </if>
   <if test="age != null" >
    #{age,jdbcType=INTEGER},
   </if>
   <if test="address != null" >
    #{address,jdbcType=VARCHAR},
   </if>
  </trim>
 </insert>
 <update id="updateByPrimaryKeySelective" parameterType="com.xiaolyuh.domain.model.Person" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  update person
  <set >
   <if test="name != null" >
    name = #{name,jdbcType=VARCHAR},
   </if>
   <if test="age != null" >
    age = #{age,jdbcType=INTEGER},
   </if>
   <if test="address != null" >
    address = #{address,jdbcType=VARCHAR},
   </if>
  </set>
  where id = #{id,jdbcType=BIGINT}
 </update>
 <update id="updateByPrimaryKey" parameterType="com.xiaolyuh.domain.model.Person" >
  <!--
   WARNING - @mbggenerated
   This element is automatically generated by MyBatis Generator, do not modify.
  -->
  update person
  set name = #{name,jdbcType=VARCHAR},
   age = #{age,jdbcType=INTEGER},
   address = #{address,jdbcType=VARCHAR}
  where id = #{id,jdbcType=BIGINT}
 </update>

 <select id="findAll" resultMap="BaseResultMap">
  select
  <include refid="Base_Column_List" />
  from person
 </select>

 <select id="findByPage" resultMap="BaseResultMap">
  select
  <include refid="Base_Column_List" />
  from person
 </select>
</mapper>

DAO层Mapper类

在Mapper接口上需要加上@Mapper注解,@Mapper注解声明成mybatis Dao层的Bean。也可以在配置类上使用@MapperScan("com.xiaolyuh.domain.mapper")注解声明。

package com.xiaolyuh.domain.mapper;

import com.github.pagehelper.Page;
import com.xiaolyuh.domain.model.Person;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper//声明成mybatis Dao层的Bean,也可以在配置类上使用@MapperScan("com.xiaolyuh.domain.mapper")注解声明
public interface PersonMapper {

  int deleteByPrimaryKey(Long id);

  int insert(Person record);

  int insertSelective(Person record);

  Person selectByPrimaryKey(Long id);

  int updateByPrimaryKeySelective(Person record);

  int updateByPrimaryKey(Person record);

  /**
   * 获取所有数据
   * @return
   */
  List<Person> findAll();

  /**
   * 分页查询数据
   * @return
   */
  Page<Person> findByPage();
}

实体类

package com.xiaolyuh.domain.model;

public class Person {

  private Long id;

  /**
   * 名称
   */
  private String name;

  /**
   * 年龄
   */
  private Integer age;

  /**
   * 地址
   */
  private String address;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

Service层

接口

package com.xiaolyuh.service;

import com.github.pagehelper.Page;
import com.xiaolyuh.domain.model.Person;

import java.util.List;

/**
 * Created by yuhao.wang on 2017/6/19.
 */
public interface PersonService {

  List<Person> findAll();

  /**
   * 分页查询
   * @param pageNo 页号
   * @param pageSize 每页显示记录数
   * @return
   */
  Page<Person> findByPage(int pageNo, int pageSize);

  void insert(Person person);
}

实现类

package com.xiaolyuh.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.xiaolyuh.domain.mapper.PersonMapper;
import com.xiaolyuh.domain.model.Person;
import com.xiaolyuh.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by yuhao.wang on 2017/6/19.
 */
@Service
@Transactional(readOnly = true)
public class PersonServiceImpl implements PersonService {

  @Autowired
  private PersonMapper personMapper;

  @Override
  public List<Person> findAll() {
    return personMapper.findAll();
  }

  @Override
  public Page<Person> findByPage(int pageNo, int pageSize) {
    PageHelper.startPage(pageNo, pageSize);
    return personMapper.findByPage();
  }

  @Override
  @Transactional
  public void insert(Person person) {
    personMapper.insert(person);
  }

}

分页的包装类PageInfo

需要把Page包装成PageInfo对象才能序列化。该插件也默认实现了一个PageInfo

package com.xiaolyuh.page;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.github.pagehelper.Page;

/**
 * 对Page<E>结果进行包装
 * <p/>
 * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907
 *
 * @author liuzh/abel533/isea533
 * @version 3.3.0
 * @since 3.2.2
 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class PageInfo<T> implements Serializable {
  private static final long serialVersionUID = 1L;
  //当前页
  private int pageNum;
  //每页的数量
  private int pageSize;
  //总记录数
  private long total;
  //总页数
  private int pages;
  //结果集
  private List<T> list;
  //是否为第一页
  private boolean isFirstPage = false;
  //是否为最后一页
  private boolean isLastPage = false;


  public PageInfo() {
  }

  /**
   * 包装Page对象
   *
   * @param list
   */
  public PageInfo(List<T> list) {
    if (list instanceof Page) {
      Page page = (Page) list;
      this.pageNum = page.getPageNum();
      this.pageSize = page.getPageSize();

      this.pages = page.getPages();
      this.list = page;
      this.total = page.getTotal();
    } else if (list instanceof Collection) {
      this.pageNum = 1;
      this.pageSize = list.size();

      this.pages = 1;
      this.list = list;
      this.total = list.size();
    }
    if (list instanceof Collection) {
      //判断页面边界
      judgePageBoudary();
    }
  }

  /**
   * 判定页面边界
   */
  private void judgePageBoudary() {
    isFirstPage = pageNum == 1;
    isLastPage = pageNum == pages;
  }

  public int getPageNum() {
    return pageNum;
  }

  public void setPageNum(int pageNum) {
    this.pageNum = pageNum;
  }

  public int getPageSize() {
    return pageSize;
  }

  public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
  }

  public long getTotal() {
    return total;
  }

  public void setTotal(long total) {
    this.total = total;
  }

  public int getPages() {
    return pages;
  }

  public void setPages(int pages) {
    this.pages = pages;
  }

  public List<T> getList() {
    return list;
  }

  public void setList(List<T> list) {
    this.list = list;
  }

  public boolean isIsFirstPage() {
    return isFirstPage;
  }

  public void setIsFirstPage(boolean isFirstPage) {
    this.isFirstPage = isFirstPage;
  }

  public boolean isIsLastPage() {
    return isLastPage;
  }

  public void setIsLastPage(boolean isLastPage) {
    this.isLastPage = isLastPage;
  }

  @Override
  public String toString() {
    final StringBuffer sb = new StringBuffer("PageInfo{");
    sb.append("pageNum=").append(pageNum);
    sb.append(", pageSize=").append(pageSize);
    sb.append(", total=").append(total);
    sb.append(", pages=").append(pages);
    sb.append(", list=").append(list);
    sb.append(", isFirstPage=").append(isFirstPage);
    sb.append(", isLastPage=").append(isLastPage);
    sb.append(", navigatepageNums=");
    sb.append('}');
    return sb.toString();
  }
}

测试类

package com.xiaolyuh;

import com.github.pagehelper.Page;
import com.xiaolyuh.domain.model.Person;
import com.xiaolyuh.page.PageInfo;
import com.xiaolyuh.service.PersonService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonMapperTests {

 private Logger logger = LoggerFactory.getLogger(PersonMapperTests.class);

 @Autowired
 private PersonService personService;

 @Before
 public void testInsert() {
 Person person = new Person();
 person.setName("测试");
 person.setAddress("address");
 person.setAge(10);
 personService.insert(person);

 Assert.assertNotNull(person.getId());
 logger.debug(JSON.toJSONString(person));
 }

 @Test
 public void testFindAll() {
 List<Person> persons = personService.findAll();

 Assert.assertNotNull(persons);
 logger.debug(JSON.toJSONString(persons));
 }

 @Test
 public void testFindByPage() {
 Page<Person> persons = personService.findByPage(1, 2);
 // 需要把Page包装成PageInfo对象才能序列化。该插件也默认实现了一个PageInfo
 PageInfo<Person> pageInfo = new PageInfo<>(persons);
 Assert.assertNotNull(persons);
 logger.debug(pageInfo.toString());
 logger.debug(JSON.toJSONString(pageInfo));
 }

 @Test
 public void testCacheByPage() {
 long begin = System.currentTimeMillis();
 List<Person> persons = personService.findAll();
 long ing = System.currentTimeMillis();
 personService.findAll();
 long end = System.currentTimeMillis();
 logger.debug("第一次请求时间:" + (ing - begin) + "ms");
 logger.debug("第二次请求时间:" + (end - ing) + "ms");

 Assert.assertNotNull(persons);
 logger.debug(persons.toString());
 logger.debug(JSON.toJSONString(persons));
 }

}

源码

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

到此这篇关于Spring Boot+Mybatis+Pagehelper分页实现的文章就介绍到这了,更多相关Spring Boot+Mybatis+Pagehelper分页内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍SpringBoot整合mybatis结合pageHelper插件实现分页,包括了SpringBoot整合mybatis结合pageHelper插件实现分页的使用技巧和注意事项,需要的朋友参考一下 SpringBoot整合mybatis分页操作 SpringBoot整合Mybatis进行分页操作,这里需要使用Mybatis的分页插件:pageHelper, 关于pageHelper的

  • 本文向大家介绍SpringBoot集成MyBatis的分页插件PageHelper实例代码,包括了SpringBoot集成MyBatis的分页插件PageHelper实例代码的使用技巧和注意事项,需要的朋友参考一下 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心得和源码,主要就算是敲了一下SpringBoot的门儿,希望能给各位的入门带给一点儿捷径,今天给各位温

  • 本文向大家介绍mybatis插件pageHelper实现分页效果,包括了mybatis插件pageHelper实现分页效果的使用技巧和注意事项,需要的朋友参考一下 最近做的一个项目在持久层我们采用的是Mybatis今天完成了商品列表的分页查询的功能,这篇博客我分享一下如何采用pageHelper的插件实现分页。mybatis的应用,最大的好处就在于我们可以更加方便灵活的编写我们的sql语句,实现对

  • 本文向大家介绍使用mybatis插件PageHelper实现分页效果,包括了使用mybatis插件PageHelper实现分页效果的使用技巧和注意事项,需要的朋友参考一下 最近都在忙着写一个网站项目,今天做一个分页功能的时候,遇到了分页效果实现不了的问题,查了好久的资料,后来终于是成功解决啦,记录一下 1.在pom.xml中添加分页插件依赖 2.在mybatis配置文件中配置分页插件 这里需要注意

  • 本文向大家介绍Springboot整合pagehelper分页功能,包括了Springboot整合pagehelper分页功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Springboot整合pagehelper分页展示的具体代码,供大家参考,具体内容如下 一、添加依赖 查找maven中pagehelper的版本 在pom中添加依赖 二、使用 网络上很多文章都会说需要在appl

  • 本文向大家介绍mybatis分页插件pageHelper详解及简单实例,包括了mybatis分页插件pageHelper详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 mybatis分页插件pageHelper详解及简单实例 工作的框架spring springmvc mybatis3 首先使用分页插件必须先引入maven依赖,在pom.xml中添加如下 其次需要在配置文件中添加配置,有两