D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  menu
402 文章
1,953 评论
3434733 浏览
10 当前访客
ღゝ◡╹)ノ❤️

MyBatis MySQL Oracle 分页插件

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("begin=").append(begin).append(", end=")
            .append(end).append(", length=").append(length).append(", totalRecords=").append(
                    totalRecords).append(", pageNo=").append(pageNo).append(", pageCount=")
            .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, "page");
    return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
}

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

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

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

    return super.sqlMapDocumentGenerated(document, introspectedTable);
}

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

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

    XmlElement isNotNullElement = new XmlElement("include"); //$NON-NLS-1$   
    isNotNullElement.addAttribute(new Attribute("refid", "OracleDialectSuffix"));
    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(
            "com.yuanxin.framework.mybatis.Page"));
    CommentGenerator commentGenerator = context.getCommentGenerator();
    Field field = new Field();
    field.setVisibility(JavaVisibility.PROTECTED);
    field.setType(new FullyQualifiedJavaType("com.yuanxin.framework.mybatis.Page"));
    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("set" + camel);
    method.addParameter(new Parameter(new FullyQualifiedJavaType(
            "com.yuanxin.framework.mybatis.Page"), name));
    method.addBodyLine("this." + name + "=" + name + ";");
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
    method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setReturnType(new FullyQualifiedJavaType("com.yuanxin.framework.mybatis.Page"));
    method.setName("get" + camel);
    method.addBodyLine("return " + name + ";");
    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, "page");
    return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
}

@Override
public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
        IntrospectedTable introspectedTable) {
    XmlElement page = new XmlElement("if");
    page.addAttribute(new Attribute("test", "page != null"));
    page.addElement(new TextElement("limit #{page.begin} , #{page.length}"));
    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(
            "com.yuanxin.framework.mybatis.Page"));
    CommentGenerator commentGenerator = context.getCommentGenerator();
    Field field = new Field();
    field.setVisibility(JavaVisibility.PROTECTED);
    field.setType(new FullyQualifiedJavaType("com.yuanxin.framework.mybatis.Page"));
    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("set" + camel);
    method.addParameter(new Parameter(new FullyQualifiedJavaType(
            "com.yuanxin.framework.mybatis.Page"), name));
    method.addBodyLine("this." + name + "=" + name + ";");
    commentGenerator.addGeneralMethodComment(method, introspectedTable);
    topLevelClass.addMethod(method);
    method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setReturnType(new FullyQualifiedJavaType("com.yuanxin.framework.mybatis.Page"));
    method.setName("get" + camel);
    method.addBodyLine("return " + name + ";");
    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 字段,用于设置分页。

 

评论