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 > 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 > 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( "<![CDATA[ ) row_ where rownum <= #{page.end} ) where rownum_ > #{page.begin} ]]>")); 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<String> 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<String> warnings) { return true; }
}
使用时在 generatorConfig.xml 中配置对应的插件即可,最终,在生成的 Criteria 中就会存在 Page 字段,用于设置分页。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于