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; }