众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题。网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页。但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能。
Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句。
本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis Generator生成Mybatis代码时,直接生成基于数据库方言的Sql语句,解决Oralce等数据库的变量绑定,且无需使用Mybatis拦截器去拦截语句判断分页。
一、编写Mybatis Generator Dialect插件
- 2011 Tgwoo Inc.
- //www.tgwoo.com/
- package com.tgwoo.core.dao.plugin;
- import java.util.List;
- import org.mybatis.generator.api.CommentGenerator;
- import org.mybatis.generator.api.IntrospectedTable;
- import org.mybatis.generator.api.PluginAdapter;
- import org.mybatis.generator.api.dom.java.Field;
- import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
- import org.mybatis.generator.api.dom.java.JavaVisibility;
- import org.mybatis.generator.api.dom.java.Method;
- import org.mybatis.generator.api.dom.java.Parameter;
- import org.mybatis.generator.api.dom.java.TopLevelClass;
- import org.mybatis.generator.api.dom.xml.Attribute;
- import org.mybatis.generator.api.dom.xml.Document;
- import org.mybatis.generator.api.dom.xml.TextElement;
- import org.mybatis.generator.api.dom.xml.XmlElement;
- * @author pan.wei
- * @date 2011-11-30 下午08:36:11
- */
- public class OraclePaginationPlugin extends PluginAdapter {
- @Override
- public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
-
- "page");
- return super.modelExampleClassGenerated(topLevelClass,
- }
- @Override
- public boolean sqlMapDocumentGenerated(Document document,
- XmlElement parentElement = document.getRootElement();
-
- new XmlElement("sql");
- new Attribute("id",
- "OracleDialectPrefix"));
- new XmlElement("if");
- new Attribute("test", "page != null"));
- new TextElement(
- "select * from ( select row_.*, rownum rownum_ from ( "));
- parentElement.addElement(paginationPrefixElement);
-
- new XmlElement("sql");
- new Attribute("id",
- "OracleDialectSuffix"));
- new XmlElement("if");
- new Attribute("test", "page != null"));
- new TextElement(
- "<![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>"));
- parentElement.addElement(paginationSuffixElement);
- return super.sqlMapDocumentGenerated(document, introspectedTable);
-
- @Override
- public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(
-
- new XmlElement("include");
- new Attribute("refid", "OracleDialectPrefix"));
- 0, pageStart);
- XmlElement isNotNullElement = new XmlElement("include");
- new Attribute("refid",
- "OracleDialectSuffix"));
-
- return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,
- }
-
- * @param topLevelClass
- * @param introspectedTable
- * @param name
- */
- private void addPage(TopLevelClass topLevelClass,
- topLevelClass.addImportedType(new FullyQualifiedJavaType(
- "com.tgwoo.core.dao.pojo.Page"));
- Field field = new Field();
- field.setType(new FullyQualifiedJavaType("com.tgwoo.core.dao.pojo.Page"));
- commentGenerator.addFieldComment(field, introspectedTable);
- char c = name.charAt(0);
- 1);
- new Method();
- method.setName("set" + camel);
- new Parameter(new FullyQualifiedJavaType(
- "com.tgwoo.core.dao.pojo.Page"), name));
- "this." + name + "=" + name + ";");
- topLevelClass.addMethod(method);
- new Method();
- method.setReturnType(new FullyQualifiedJavaType(
- "com.tgwoo.core.dao.pojo.Page"));
- "get" + camel);
- "return " + name + ";");
- topLevelClass.addMethod(method);
-
- /**
- * This plugin is always valid - no properties are required
- */
- public boolean validate(List<String> warnings) {
- return true;
- }
-------------------------------------------------------------------------------------------------------
报插件无法找到或者无法实例化的一般是分页插件和maven插件不在同一classloader下引起的,需要在mybatis-generator-maven-plugin的dependencies中增加dependency。