开源MyBatis分页插件,省时省力

公众号程序猿DD

共 5221字,需浏览 11分钟

 ·

2021-11-30 22:08

大家好,我是TJ

一个励志推荐10000款开源项目与工具的程序员

如何能让自己在使用Mybatis时事半功倍?让自己效率提升释放时间?那么就一定要看看今天TJ君给你介绍的这款Mybatis通用分页开源插件:

Mybatis-PageHelper

目前Mybatis-PageHelper支持对以下种类繁多的的数据库物理分页:


static {
    //注册别名
    registerDialectAlias("hsqldb", HsqldbDialect.class);
    registerDialectAlias("h2", HsqldbDialect.class);
    registerDialectAlias("phoenix", HsqldbDialect.class);
    registerDialectAlias("postgresql", PostgreSqlDialect.class);
    registerDialectAlias("mysql", MySqlDialect.class)
    registerDialectAlias("mariadb", MySqlDialect.class)
    registerDialectAlias("sqlite", MySqlDialect.class);
    registerDialectAlias("herddb", HerdDBDialect.class);
    registerDialectAlias("oracle", OracleDialect.class)
    registerDialectAlias("oracle9i", Oracle9iDialect.class)
    registerDialectAlias("db2", Db2Dialect.class)
    registerDialectAlias("informix", InformixDialect.class)
    //解决 informix-sqli #129,仍然保留上面的 
    registerDialectAlias("informix-sqli", InformixDialect.class);
    registerDialectAlias("sqlserver", SqlServerDialect.class)
    registerDialectAlias("sqlserver2012", SqlServer2012Dialect.class);
    registerDialectAlias("derby", SqlServer2012Dialect.class)
    //达梦数据库,https://github.com/mybatis-book/book/issues/43 
    registerDialectAlias("dm", OracleDialect.class)
    //阿里云PPAS数据库,https://github.com/pagehelper/Mybatis-PageHelper/issues/281 
    registerDialectAlias("edb", OracleDialect.class)
    //神通数据库 
    registerDialectAlias("oscar", OscarDialect.class)
    registerDialectAlias("clickhouse", MySqlDialect.class)
    //瀚高数据库 
    registerDialectAlias("highgo", HsqldbDialect.class)
    //虚谷数据库 
    registerDialectAlias("xugu", HsqldbDialect.class)
}

当然,如果你使用的数据库恰好不在这些范围之内,别着急,Mybatis-PageHelper还支持自定义配置,只需要配置 dialectAlias 参数,配置的内容根据 JDBCURL 自动获取对应实现,允许通过此种方式覆盖已有的实现,切记多个配置时使用分号隔开,举例如下:


<property name="dialectAlias" value="oracle=com.github.pagehelper.dialect.helper.OracleDialect"/>

如何使用?

引入方式

两种,一种是直接引入jar包,一种是使用 Maven方式引入。

如果是后者,只需要在 pom.xml 中添加下面的依赖:

<dependency>
    <groupId>com.github.pagehelpergroupId>
    <artifactId>pagehelperartifactId>
    <version>最新版本version>
dependency>

配置拦截器

1、在MyBatis配置xml文件中配置拦截器插件


<plugins>
    
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        
        <property name="param1" value="value1"/>
 plugin>
plugins>

2、在Spring配置文件中配置拦截器插件


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          
          <value>
            params=value1
          value>
        property>
      bean>
    array>
  property>
bean>

插件参数

Mybatis-PageHelper提供了多个可选参数,如果小伙伴们想要实现自己的分页逻辑,也可以通过实现 Dialect(com.github.pagehelper.Dialect) 接口,来自定义 dialect 实现及参数。

下面介绍几个自带默认使用的常见参数:

  • 1、helperDialect

分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。通过配置helperDialect属性来指定分页插件使用哪种语言。

  • 2、offsetAsPageNum

该参数对使用 RowBounds 作为分页参数时有效。当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

  • 3、 rowBoundsWithCount

该参数对使用 RowBounds 作为分页参数时有效。当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。

  • 4、pageSizeZero

该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

  • 5、 reasonable

分页合理化参数,当该参数设置为 true 时,pageNum<=0 时会查询第一页;pageNum>pages(超过总数时),会查询最后一页。

  • 6、params

该参数来配置参数映射,用于从对象中根据属性名取值。

  • 7、supportMethodsArguments

支持通过 Mapper 接口参数来传递分页参数,分页插件会从查询方法的参数值中,自动根据上面第6点 params 配置的字段中取值,查找到合适的值时就会自动分页。

  • 8、autoRuntimeDialect

允许在运行时根据多数据源自动识别对应方言的分页

  • 9、closeConn

当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接,通过该属性来设置是否关闭获取的这个连接。

调用方式

下面是6种不同的调用方式:

//第一种,RowBounds方式的调用
List list = sqlSession.selectList("x.y.selectIf"nullnew RowBounds(010));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(110);
List list = userMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(110);
List list = userMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List selectByPageNumSize(
            @Param("user")
 User user,
            @Param("pageNum") int pageNum, 
            @Param("pageSize") int pageSize)
;
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List list = userMapper.selectByPageNumSize(user, 110);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List list = userMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page page = PageHelper.startPage(110).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page page = PageHelper.startPage(110).doSelectPage(()-> userMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(110).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(110).doSelectPageInfo(() -> userMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectLike(user);
    }
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));

TJ君觉得配上这款插件,绝对是可以节省自己不少的编码时间,尤其对于一些新手小伙伴更加合适。如果你觉得对自己的Mybatis使用有帮助或感兴趣的小伙伴,赶快来下载插件用用看吧,开源地址如下:

点击下方卡片,关注公众号“TJ君

回复“分页插件”,获取仓库地址

关注我,每天了解一个牛x、好用、有趣的东东

往期推荐

学习如何使用JavaScript 生成各种好看的头像!

真正开源的MongoDB的替代品,MangoDB!

一些和疫苗相关的工具及开源项目

IDEA有哪些快捷键操作?这款插件教你融会贯通所有!

人人影视彻底告别,那就自己来学做一款在线视频 App!

最新网易出品之摸鱼计算器,看看你上班能摸到多大的鱼?


浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报