MyBatis MySQL Oracle 分页插件

本贴最后更新于 4237 天前,其中的信息可能已经时移俗易

MyBatis 的 MySQL、Oracle 分页插件,使用相同的分页接口。

 

/**
 * 分页对象.
 * 
 * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
 * @version 1.0.1.0, Oct 6, 2012
 */
public final class Page implements Serializable {
/**
 * 默认的序列化版本 id.
 */
private static final long serialVersionUID = 1L;
/**
 * 分页查询开始记录位置.
 */
private int               begin;
/**
 * 分页查看下结束位置.
 */
private int               end;
/**
 * 每页显示记录数.
 */
private int               length           = 20;
/**
 * 查询结果总记录数.
 */
private int               totalRecords;
/**
 * 当前页码.
 */
private int               pageNo;
/**
 * 总共页数.
 */
private int               pageCount;

public Page() {
}

/**
 * 构造函数.
 * 
 * @param begin
 * @param length
 */
public Page(int begin, int length) {
    this.begin = begin;
    this.length = length;
    this.end = this.begin + this.length;
    this.pageNo = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;
}

/**
 * @param begin
 * @param length
 * @param count
 */
public Page(int begin, int length, int totalRecords) {
    this(begin, length);
    this.totalRecords = totalRecords;
}

/**
 * 设置页数,自动计算数据范围.
 * 
 * @param pageNo
 */
public Page(int pageNo) {
    this.pageNo = pageNo;
    pageNo = pageNo &gt; 0 ? pageNo : 1;
    this.begin = this.length * (pageNo - 1);
    this.end = this.length * pageNo;
}

/**
 * @return the begin
 */
public int getBegin() {
    return begin;
}

/**
 * @return the end
 */
public int getEnd() {
    return end;
}

/**
 * @param end
 *            the end to set
 */
public void setEnd(int end) {
    this.end = end;
}

/**
 * @param begin
 *            the begin to set
 */
public void setBegin(int begin) {
    this.begin = begin;
    if (this.length != 0) {
        this.pageNo = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;
    }
}

/**
 * @return the length
 */
public int getLength() {
    return length;
}

/**
 * @param length
 *            the length to set
 */
public void setLength(int length) {
    this.length = length;
    if (this.begin != 0) {
        this.pageNo = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;
    }
}

/**
 * @return the totalRecords
 */
public int getTotalRecords() {
    return totalRecords;
}

/**
 * @param totalRecords
 *            the totalRecords to set
 */
public void setTotalRecords(int totalRecords) {
    this.totalRecords = totalRecords;
    this.pageCount = (int) Math.floor((this.totalRecords * 1.0d) / this.length);
    if (this.totalRecords % this.length != 0) {
        this.pageCount++;
    }
}

/**
 * @return the pageNo
 */
public int getPageNo() {
    return pageNo;
}

/**
 * @param pageNo
 *            the pageNo to set
 */
public void setPageNo(int pageNo) {
    this.pageNo = pageNo;
    pageNo = pageNo &gt; 0 ? pageNo : 1;
    this.begin = this.length * (pageNo - 1);
    this.end = this.length * pageNo;
}

/**
 * @return the pageCount
 */
public int getPageCount() {
    if (pageCount == 0) {
        return 1;
    }
    return pageCount;
}

/**
 * @param pageCount
 *            the pageCount to set
 */
public void setPageCount(int pageCount) {
    this.pageCount = pageCount;
}

@Override
public String toString() {
    final StringBuilder builder = new StringBuilder(&quot;begin=&quot;).append(begin).append(&quot;, end=&quot;)
            .append(end).append(&quot;, length=&quot;).append(length).append(&quot;, totalRecords=&quot;).append(
                    totalRecords).append(&quot;, pageNo=&quot;).append(pageNo).append(&quot;, pageCount=&quot;)
            .append(pageCount);

    return builder.toString();
}

}

 

/**
 * Oracle 分页生成插件。
 *
 * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
 * @version 1.0.0.0, May 31, 2012
 */
public class OraclePaginationPlugin extends PluginAdapter {
@Override
public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
        IntrospectedTable introspectedTable) {
    // add field, getter, setter for limit clause
    addPage(topLevelClass, introspectedTable, &quot;page&quot;);
    return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
}

@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
    XmlElement parentElement = document.getRootElement();

    // 产生分页语句前半部分
    XmlElement paginationPrefixElement = new XmlElement(&quot;sql&quot;);
    paginationPrefixElement.addAttribute(new Attribute(&quot;id&quot;, &quot;OracleDialectPrefix&quot;));
    XmlElement pageStart = new XmlElement(&quot;if&quot;);
    pageStart.addAttribute(new Attribute(&quot;test&quot;, &quot;page != null&quot;));
    pageStart.addElement(new TextElement(
            &quot;select * from ( select row_.*, rownum rownum_ from ( &quot;));
    paginationPrefixElement.addElement(pageStart);
    parentElement.addElement(paginationPrefixElement);

    // 产生分页语句后半部分
    XmlElement paginationSuffixElement = new XmlElement(&quot;sql&quot;);
    paginationSuffixElement.addAttribute(new Attribute(&quot;id&quot;, &quot;OracleDialectSuffix&quot;));
    XmlElement pageEnd = new XmlElement(&quot;if&quot;);
    pageEnd.addAttribute(new Attribute(&quot;test&quot;, &quot;page != null&quot;));
    pageEnd
            .addElement(new TextElement(
                    &quot;&lt;![CDATA[ ) row_  where rownum &lt;= #{page.end} ) where rownum_ &gt; #{page.begin}  ]]&gt;&quot;));
    paginationSuffixElement.addElement(pageEnd);
    parentElement.addElement(paginationSuffixElement);

    return super.sqlMapDocumentGenerated(document, introspectedTable);
}

@Override
public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
        IntrospectedTable introspectedTable) {

    XmlElement pageStart = new XmlElement(&quot;include&quot;); //$NON-NLS-1$   
    pageStart.addAttribute(new Attribute(&quot;refid&quot;, &quot;OracleDialectPrefix&quot;));
    element.getElements().add(0, pageStart);

    XmlElement isNotNullElement = new XmlElement(&quot;include&quot;); //$NON-NLS-1$   
    isNotNullElement.addAttribute(new Attribute(&quot;refid&quot;, &quot;OracleDialectSuffix&quot;));
    element.getElements().add(isNotNullElement);

    return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
}

/**
 * @param topLevelClass
 * @param introspectedTable
 * @param name
 */
private void addPage(TopLevelClass topLevelClass, IntrospectedTable introspectedTable,
        String name) {
    topLevelClass.addImportedType(new FullyQualifiedJavaType(
            &quot;com.yuanxin.framework.mybatis.Page&quot;));
    CommentGenerator commentGenerator = context.getCommentGenerator();
    Field field = new Field();
    field.setVisibility(JavaVisibility.PROTECTED);
    field.setType(new FullyQualifiedJavaType(&quot;com.yuanxin.framework.mybatis.Page&quot;));
    field.setName(name);
    commentGenerator.addFieldComment(field, introspectedTable);
    topLevelClass.addField(field);
    char c = name.charAt(0);
    String camel = Character.toUpperCase(c) + name.substring(1);
    Method method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setName(&quot;set&quot; + camel);
    method.addParameter(new Parameter(new FullyQualifiedJavaType(
            &quot;com.yuanxin.framework.mybatis.Page&quot;), name));
    method.addBodyLine(&quot;this.&quot; + name + &quot;=&quot; + name + &quot;;&quot;);
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
    method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setReturnType(new FullyQualifiedJavaType(&quot;com.yuanxin.framework.mybatis.Page&quot;));
    method.setName(&quot;get&quot; + camel);
    method.addBodyLine(&quot;return &quot; + name + &quot;;&quot;);
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
}

/**
 * This plugin is always valid - no properties are required
 */
@Override
public boolean validate(List&lt;String&gt; warnings) {
    return true;
}

}

 

/**
 * MySQL 分页生成插件。
 *
 * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
 * @version 1.0.0.1, Oct 10, 2012
 */
public final class MySQLPaginationPlugin extends PluginAdapter {
@Override
public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
        IntrospectedTable introspectedTable) {
    // add field, getter, setter for limit clause
    addPage(topLevelClass, introspectedTable, &quot;page&quot;);
    return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
}

@Override
public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
        IntrospectedTable introspectedTable) {
    XmlElement page = new XmlElement(&quot;if&quot;);
    page.addAttribute(new Attribute(&quot;test&quot;, &quot;page != null&quot;));
    page.addElement(new TextElement(&quot;limit #{page.begin} , #{page.length}&quot;));
    element.addElement(page);

    return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
}

/**
 * @param topLevelClass
 * @param introspectedTable
 * @param name
 */
private void addPage(TopLevelClass topLevelClass, IntrospectedTable introspectedTable,
        String name) {
    topLevelClass.addImportedType(new FullyQualifiedJavaType(
            &quot;com.yuanxin.framework.mybatis.Page&quot;));
    CommentGenerator commentGenerator = context.getCommentGenerator();
    Field field = new Field();
    field.setVisibility(JavaVisibility.PROTECTED);
    field.setType(new FullyQualifiedJavaType(&quot;com.yuanxin.framework.mybatis.Page&quot;));
    field.setName(name);
    commentGenerator.addFieldComment(field, introspectedTable);
    topLevelClass.addField(field);
    char c = name.charAt(0);
    String camel = Character.toUpperCase(c) + name.substring(1);
    Method method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setName(&quot;set&quot; + camel);
    method.addParameter(new Parameter(new FullyQualifiedJavaType(
            &quot;com.yuanxin.framework.mybatis.Page&quot;), name));
    method.addBodyLine(&quot;this.&quot; + name + &quot;=&quot; + name + &quot;;&quot;);
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
    method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setReturnType(new FullyQualifiedJavaType(&quot;com.yuanxin.framework.mybatis.Page&quot;));
    method.setName(&quot;get&quot; + camel);
    method.addBodyLine(&quot;return &quot; + name + &quot;;&quot;);
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
}

/**
 * This plugin is always valid - no properties are required
 */
public boolean validate(List&lt;String&gt; warnings) {
    return true;
}

}

 

使用时在 generatorConfig.xml 中配置对应的插件即可,最终,在生成的 Criteria 中就会存在 Page 字段,用于设置分页。

 

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 386 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 155 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 1 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 25 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 155 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 328 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 629 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 672 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    26 引用 • 84 回帖 • 2 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 245 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 488 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 62 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖