java web 之mybatis使用教程(十二)

MyBatis分页插件PageHelper的使用

在mysql中,分页的sql是使用limit来做,如果我们自己写sql,那分页肯定是没有任何问题的。但是一旦model多了起来,复杂了起来,我们很自然的想到使用mybatis的逆向工程来生成相应的po和mapper,但是同时也会带来弊端,比如这里的分页问题就不好解决了。 
  可能有人会说,我可以修改生成的文件,没错,这是可行的,但是一般我们通过逆向工程生成的文件,都不会去动它,所以这个时候,就需要使用分页插件来解决了。在介绍如何使用这个分页插件之前,先介绍一下mybatis中的插件是如何工作的,主要作用在哪个环节。我之前有写过一篇mybatis的一篇入门文章:宏观上把我mybatis框架。里面有张mybatis的工作原理图,为了方便叙述,我把图也放在这: 

这里写图片描述

从图中可以看出,mybatis中首先要在配置文件中配置一些东西,然后根据这些配置去创建一个会话工厂,再根据会话工厂创建会话,会话发出操作数据库的sql语句,然后通过执行器操作数据,再使用mappedStatement对数据进行封装,这就是整个mybatis框架的执行情况。那么mybatis的插件作用在哪一环节呢?它主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。  

1. 需要引入PageHelper的jar包

pom.xml中加入:

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

  2.在mybatis的全局配置文件mybatis-config.xml中配置该插件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="mysql.properties"/>

    <settings>
        <!--全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载,默认值为false-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认值为true-->
        <setting name="aggressiveLazyLoading" value="false"/>

        <setting name="cacheEnabled" value="true"/>
    </settings>

    <typeAliases>
        <!-- 其实就是将bean的替换成一个短的名字-->
        <typeAlias type="com.cx.pojo.User" alias="User"/>
    </typeAliases>
    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
    <!--对事务的管理和连接池的配置-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED"><!--POOLED:使用Mybatis自带的数据库连接池来管理数据库连接-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--mapping文件路径配置-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
        <mapper resource="mapper/UserMapperOrders.xml"/>
        <mapper resource="mapper/ItemsMapper.xml"/>
    </mappers>


</configuration>

mybatis-config.xml配置文件配置时,要注意节点顺序.

3. 在执行sql前添加插件,完成分页功能

在查询的sql语句执行之前,添加一行代码PageHelper.startPage(1, 10);第一个参数表示第几页,第二个参数表示每页显示的记录数。这样在执行sql后就会将记录按照语句中设置的那样进行分页。如果需要获取总记录数的话,需要PageInfo类的对象,这个对象可以获取总记录数。

测试代码:

 @Test
    public void testPageHelper() {
        // 创建一个spring容器
        // 从spring容器中获取mapper代理对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ItemsMapper itemsMapper = sqlSession.getMapper(ItemsMapper.class);
        //自定义查询,这就用到了ItemsExample类了,里面有个Criteria内部类,专门用来封装自定义查询条件的
        ItemsExample itemsExample = new ItemsExample();
        ItemsExample.Criteria criteria = itemsExample.createCriteria();
        //andNameEqualTo相当于在sql中拼接一个“AND name='背包'”
        //还有其他很多方法,都是用来自定义查询条件的,可以自己看一下不同的方法
        criteria.andNameEqualTo("背包");
        //分页处理,显示第一页的10条数据
        PageHelper.startPage(1, 10);
        List<Items> itemsList = itemsMapper.selectByExample(itemsExample);

        // 取商品列表
        for(Items item : itemsList) {
            System.out.println(item.getName());
        }
        // 取分页信息
        PageInfo<Items> pageInfo = new PageInfo<Items>(itemsList);
        long total = pageInfo.getTotal(); //获取总记录数
        System.out.println("共有商品信息:" + total);
    }

上面教程的代码可以从我的github上获取。

https://github.com/ChenXiang2018/jws

mybatisdemo就是学习mybatis教程的代码。

firstspringmvc就是mybatis与spring整合的代码。

mybatisgenerator就是mybatis逆向工程的代码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值