Spring Boot+Mybatis+Pagehelper分页

来源:互联网 发布:成勘院待遇怎么样 知乎 编辑:程序博客网 时间:2024/06/12 20:47

Spring Boot 集成MyBatis和Pagehelper分页插件

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

image

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_testspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.username=rootspring.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=mysqlpagehelper.reasonable=truepagehelper.supportMethodsArguments=truepagehelper.params=count=countSql#日志配置logging.level.com.xiaolyuh=debuglogging.level.org.springframework.web=debuglogging.level.org.springframework.transaction=debuglogging.level.org.mybatis=debugdebug=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)@SpringBootTestpublic class PersonMapperTests {private Logger logger = LoggerFactory.getLogger(PersonMapperTests.class);@Autowiredprivate PersonService personService;@Beforepublic 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));}@Testpublic void testFindAll() {List<Person> persons = personService.findAll();Assert.assertNotNull(persons);logger.debug(JSON.toJSONString(persons));}@Testpublic void testFindByPage() {Page<Person> persons = personService.findByPage(1, 2);// 需要把Page包装成PageInfo对象才能序列化。该插件也默认实现了一个PageInfoPageInfo<Person> pageInfo = new PageInfo<>(persons);Assert.assertNotNull(persons);logger.debug(pageInfo.toString());logger.debug(JSON.toJSONString(pageInfo));}@Testpublic 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-student-mybatis工程


阅读全文
1 0