当前位置:Gxlcms >
数据库问题 >
Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)
Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)
时间:2021-07-01 10:21:17
帮助过:34人阅读
本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis Generator生成Mybatis代码时,直接生成基于数据库方言的Sql语句,解决Oralce等数据库的变量绑定,且无需使用Mybatis拦截器去拦截语句判断分页。
一、编写Mybatis Generator Dialect插件
Java代码
- 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;
- }
二、增加插件到Mybatis Generator配置文件中
Xml代码
- >
- <generatorConfiguration >
- <classPathEntry location="E:\work\eclipseWorkspace\myEclipse\CTSPMTS\WebRoot\WEB-INF\lib\ojdbc14.jar" />
- <context id="oracle" >
- <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"></plugin>
- <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
- <!-- Pagination -->
- <plugin type="com.tgwoo.core.dao.plugin.OraclePaginationPlugin"></plugin>
- <commentGenerator>
- <property name="suppressDate" value="true" />
- <property name="suppressAllComments" value="true" />
- </commentGenerator>
- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@192.168.0.2:1521:ctspmt" userId="ctspmt" password="ctspmt123" />
- <javaModelGenerator targetPackage="com.tgwoo.ctspmt.model" targetProject="CTSPMTS/src" />
- <sqlMapGenerator targetPackage="com.tgwoo.ctspmt.data" targetProject="CTSPMTS/src" />
- <javaClientGenerator targetPackage="com.tgwoo.ctspmt.data" targetProject="CTSPMTS/src" type="XMLMAPPER" />
-
- <table schema="ctspmt" tableName="mt_e_interface_log"/>
- --><!--
- <table schema="ctspmt" tableName="mt_e_msg" />
- <table schema="ctspmt" tableName="mt_e_msg_log" />
- <table schema="ctspmt" tableName="mt_e_msg_receiver" />
- <table schema="ctspmt" tableName="st_e_org" />
- <table schema="ctspmt" tableName="st_e_role" />
- <table schema="ctspmt" tableName="st_e_user" />
- <table schema="ctspmt" tableName="mt_e_user_msg_conf" />
- <table schema="ctspmt" tableName="mt_j_user_device" />
- <table schema="ctspmt" tableName="st_j_user_role" />
- <table schema="ctspmt" tableName="ST_E_UNIQUE_KEY" />
- ><table schema="ctspmt" tableName="mt_v_msg_item" />
- </context>
- </generatorConfiguration>
三、示例
Java代码
- 2011 Tgwoo Inc.
- //www.tgwoo.com/
- package com.tgwoo.ctspmt.test;
- import com.tgwoo.core.config.SpringBeanProxy;
- import com.tgwoo.core.dao.pojo.Page;
- import com.tgwoo.ctspmt.data.MtVMsgItemMapper;
- import com.tgwoo.ctspmt.model.MtVMsgItemExample;
- * @author pan.wei
- * @date 2011-11-25 下午01:26:17
- */
- public class Test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- //get spring mapper instance
- MtVMsgItemMapper.class);
- new MtVMsgItemExample();
- new Page(0, 10);
- ex.createCriteria().andMsgCodeEqualTo("222");
- // set count,up to you
- int row = mapper.selectByExample(ex).size();
- "============row:" + row + "================");
-
- }
四、分页类
Java代码
- package com.tgwoo.core.dao.pojo;
- * @author pan.wei
- * @date 2011-12-1 上午11:36:12
- */
- public class Page {
- // 分页查询开始记录位置
- private int begin;
- // 分页查看下结束位置
- private int end;
- // 每页显示记录数
- private int length;
- // 查询结果总记录数
- private int count;
- // 当前页码
- private int current;
- // 总共页数
- private int total;
- public Page() {
-
- /**
- * 构造函数
- *
- * @param begin
- * @param length
- */
-