Mybatis 的分页插件PageHelper-4.1.1的使用

    xiaoxiao2021-04-14  97

    本文摘自各路大神总结,特此感谢。 Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper   文档地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown 我用的版本是PageHelper-4.1.1、Mybatis-3.3.0 PageHelper 依赖于 jsqlparser-0.9.4.jar 使用方法: 1、根据Mybatis的版本下载对应版本的PageHelper ( Mybatis最低版本不能低于3.3 ) 2、在Mybatis的配置文件 Mybatis-Configu.xml中配置PageHelper插件,配置示例:    plugins插件的配置在 settings之后 在environments之前    settings中设置Mybatis的一些额外的运行参数 如是否开启延迟加载,动态代理使用CG-LIB,或JAVALIB等     <plugins>          <!-- PageHelper4.1.1 -->          <plugin interceptor="com.github.pagehelper.PageHelper">             <property name="dialect" value="oracle"/>             <property name="offsetAsPageNum" value="false"/>             <property name="rowBoundsWithCount" value="false"/>             <property name="pageSizeZero" value="true"/>             <property name="reasonable" value="false"/>             <property name="supportMethodsArguments" value="false"/>             <property name="returnPageInfo" value="none"/>         </plugin>     </plugins>   3、使用方法 pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息 所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句 所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句 PageHelper只对紧跟着的第一个SQL语句起作用 如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页 1)、统计总数,(将SQL语句变为 select count(0) from xxx,只对简单SQL语句其效果,复杂SQL语句需要自己写)     Page<?> page = PageHelper.startPage(1,-1);     long count = page.getTotal(); 2)、分页, pageNum - 第N页, pageSize - 每页M条数     A、只分页不统计(每次只执行分页语句)      PageHelper.startPage([pageNum],[pageSize]);     List<?> pagelist = queryForList( xxx.class, "queryAll" , param);     //pagelist就是分页之后的结果     B、分页并统计(每次执行2条语句,一条select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上     Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);     List<?> pagelist = queryForList( xxx.class , "queryAll" , param);     long count = page.getTotal();     //也可以 List<?> pagelist = page.getList();   获取分页后的结果集 3)、使用PageHelper查全部(不分页)     PageHelper.startPage(1,0);     List<?> alllist = queryForList( xxx.class , "queryAll" , param); 4)、PageHelper的其他API      String  orderBy  =  PageHelper . getOrderBy ();     //获取orderBy语句      Page<?>  page  = PageHelper. startPage (Object  params );      Page<?>  page  = PageHelper. startPage (int  pageNum , int  pageSize );      Page<?>  page  = PageHelper. startPage (int  pageNum , int  pageSize , boolean  isCount );      Page<?>  page  = PageHelper. startPage ( pageNum pageSize orderBy );      Page<?>  page  = PageHelper. startPage ( pageNum pageSize isCount isReasonable );     //isReasonable 分页合理化,null时用默认配置      Page<?>  page  = PageHelper. startPage ( pageNum pageSize isCount isReasonable isPageSizeZero );     //isPageSizeZero是否支持PageSize为0, true且pageSize=0时返回全部结果,false时分页,null时用默认配置 5)、默认值       //RowBounds参数offset作为PageNum使用 - 默认不使用     private boolean offsetAsPageNum = false;     //RowBounds是否进行count查询 - 默认不查询     private boolean rowBoundsWithCount = false;     //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果     private boolean pageSizeZero = false;     //分页合理化     private boolean reasonable = false;     //是否支持接口参数来传递分页参数,默认false     private boolean supportMethodsArguments = false;   流程二:

    下载JAR包

    分页插件pagehelper.jar:

    https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/  http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/  由于使用了sql解析工具,你还需要下载jsqlparser.jar

    4.1.0及以后版本需要0.9.4版本

    http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.4/  4.1.0以前版本需要0.9.1版本

    http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.1/

    一、首先,在spring-mybatis.xml中是这样配置:

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/sinyat/api/weather/mapping/*.xml" /> <property name="typeAliasesPackage" value="com.sinyat.api.weather.model" /> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> dialect=mysql </value> </property> </bean> </array> </property> </bean> 12345678910111213141516 12345678910111213141516

    我是在spring里配置的,还可以在mybatis-config.xml里配置,有兴趣的话可以百度下。

    二、需要分页,自然就还要一个查询了。用了PageHelper之后,查询语句就可以很简单了。

    <select id="selectAll" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from citylist </select> 12345 12345

    这是我的查询语句,查询城市列表。没有其他条件,就是查所有。当然,我这只是一个小的demo,没做那么麻烦,真正的使用,是需要条件查询的。  现在来讲讲用了PageHelper之后的好处:  那就是查询语句可以不用limit,但是就一点好处吗?自然不是。请接着往下看。

    三、接口、实现类我就不再贴代码了,该怎么写还是怎么写,不需要传分页参数。然后是Controller:

    @RequestMapping("showcity") public ModelAndView showCityList(ModelAndView mv, @RequestParam(required=true,defaultValue="1") Integer page, @RequestParam(required=false,defaultValue="10") Integer pageSize){ PageHelper.startPage(page, pageSize); List<CityList> list = cityListService.selectAll(); PageInfo<CityList> p=new PageInfo<CityList>(list); //System.out.println(p.getList()); mv.addObject("citylist", list); mv.addObject("page", p); mv.setViewName("weather/showCityList"); return mv; } 1234567891011121314151617 1234567891011121314151617

    可以看到,方法里有两个参数,前面也说了,这是一个demo,仅仅只是一个非常简单的分页效果。

    PageHelper.startPage(page, pageSize); 1 1

    这段代码表示,程序开始分页了,page默认值是1,pageSize默认是10,意思是从第1页开始,每页显示10条记录。

    PageInfo这个类是插件里的类,这个类里面的属性还是值得看一看:

    //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 private int size; //排序 private String orderBy; //由于startRow和endRow不常用,这里说个具体的用法 //可以在页面中"显示startRow到endRow 共size条数据" //当前页面第一个元素在数据库中的行号 private int startRow; //当前页面最后一个元素在数据库中的行号 private int endRow; //总记录数 private long total; //总页数 private int pages; //结果集 private List<T> list; //第一页 private int firstPage; //前一页 private int prePage; //下一页 private int nextPage; //最后一页 private int lastPage; //是否为第一页 private boolean isFirstPage = false; //是否为最后一页 private boolean isLastPage = false; //是否有前一页 private boolean hasPreviousPage = false; //是否有下一页 private boolean hasNextPage = false; //导航页码数 private int navigatePages; //所有导航页号 private int[] navigatepageNums; 1234567891011121314151617181920212223242526272829303132333435363738394041424344 1234567891011121314151617181920212223242526272829303132333435363738394041424344

    使用PageInfo这个类,你需要将查询出来的list放进去:

    PageInfo<CityList> p=new PageInfo<CityList>(list); 1 1

    然后mv.addObject("page", p);  这样在页面中就可以通过${page.nextPage}翻到下一页,  ${page.prePage}翻到上一页, 

    下面这个是因为我没有进行判断,所以,第0页自然是什么都没有的。    判断的话,在PageInfo里有对应的属性,比如:

    //是否有前一页 private boolean hasPreviousPage = false; //是否有下一页 private boolean hasNextPage = false; 1234 1234

    好了,demo就是这些了。

    转载请注明原文地址: https://ju.6miu.com/read-670600.html

    最新回复(0)