Mybatis 分页实现

Posted 破酷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 分页实现相关的知识,希望对你有一定的参考价值。

 一、插件 PageHelper(推荐使用) 原理:利用Mybatis的拦截器,截获需要分页的sql语句,在语句后面加分页条件,及获取总记录数等属性。

  注意 插件属性类

  参考一

  参考二

  实例:

    第一步:在pom.xml中添加PageHelper关联的jar 

<dependency>
           <groupId>com.github.pagehelper</groupId>
           <artifactId>pagehelper</artifactId>
         <version>5.0.0</version>
</dependency>

    第二步:在mybatis-config.xml   mybatis的配置文件中添加PageHelper插件及属性。

    

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4     "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 
 6 <configuration>
 7 
 8     <settings>
 9         <setting name="logImpl" value="LOG4J"/>
10         <setting name="cacheEnabled" value="true"/>
11         <setting name="mapUnderscoreToCamelCase" value="true"/>
12         <setting name="aggressiveLazyLoading" value="false"/>
13     </settings>
14     
15     <plugins>
16          <!-- com.github.pagehelper.PageHelper为PageHelper类所在包名 -->
17         <plugin interceptor="com.github.pagehelper.PageInterceptor">
18             <!-- 4.0.0以后版本可以不设置该参数 -->
19             <!--<property name="dialect" value="mysql"/>-->
20             <!-- 该参数默认为false -->
21             <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
22             <!-- 和startPage中的pageNum效果一样-->
23             <property name="offsetAsPageNum" value="true"/>
24             <!-- 该参数默认为false -->
25             <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
26             <property name="rowBoundsWithCount" value="true"/>
27             <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
28             <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
29             <property name="pageSizeZero" value="true"/>
30             <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
31             <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
32             <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
33             <property name="reasonable" value="true"/>
34             <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
35             <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
36             <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
37             <!-- 不理解该含义的前提下,不要随便复制该配置 -->
38             <!--<property name="params" value="pageNum=start;pageSize=limit;"/>-->
39             <!-- 支持通过Mapper接口参数来传递分页参数 -->
40             <!--<property name="supportMethodsArguments" value="true"/>-->
41             <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
42             <!--<property name="returnPageInfo" value="check"/>-->
43         </plugin>
44       </plugins>
45 
46 </configuration>

  在spring的配置文件中applicationContext.xml要有mybatis-config.xml配置文件的引入

  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xsi:schemaLocation="http://www/springframework.org/schema/context http://www/springframework.org/schema/context/spring-context.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        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-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
     <!--spring  -->
     <context:component-scan base-package="com.watermelon.web.service.impl"/> 
     
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="addToConfig" value="true"/>
        <property name="basePackage" value="com.watermelon.web.mapper"/>
    </bean>
    
     <!-- spring自动扫描 包下面的带注解的类,并注册到Sping的bean容器中 service.impl
    <context:component-scan base-package="com.watermelon.web.service.impl"></context:component-scan>-->
    <!-- mybatis-spring:scan 会扫描com.watermelon.dao包下面的所有接口当作Spring的bean配置 
    <mybatis-spring:scan base-package="com.watermelon.web.mapper"/>-->

    <bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/simple"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations">
            <array>
                <value>classpath:com/watermelon/web/mapper/*.xml</value>
            </array>
        </property>
        <property name="typeAliasesPackage" value="com.watermelon.web.model"/>
    </bean>

 
     

    <aop:aspectj-autoproxy/>

    <aop:config>
        <aop:pointcut id="appService" expression="execution(* com.watermelon.*.service..*Service*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="appService"/>
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="select*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
</beans>

    第三步:

      

@RequestMapping("/page")
    public ModelAndView dictsByPage(@RequestParam(required=true,defaultValue="1") Integer page,
            @RequestParam(required=false,defaultValue="10") Integer pageSize) {
        ModelAndView mv = new ModelAndView("dicts");
        //设置起始页,及每页显示的记录数
        PageHelper.startPage(page, pageSize);
        //null为分页条件
        List<SysDict> list = dictService.selectBySysDictPage(null);
         
        PageInfo<SysDict> p=new PageInfo<SysDict>(list);
        //返回分页参数
        mv.addObject("page", p);
        //返回查询的记录行的集合
        mv.addObject("dicts", list);
        return mv;
    }

 

  

以上是关于Mybatis 分页实现的主要内容,如果未能解决你的问题,请参考以下文章

使用mybatis实现分页查询示例代码分析

SpringBoot+Mybatis配置Pagehelper分页插件实现自动分页

基于mybatis ajax 分页的实现

MyBatis:分页的实现

MyBatis动态SQL标签用法

MyBatis:使用limit实现分页