Mybatis Generator实现分页功能
Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句。
本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis Generator生成Mybatis代码时,直接生成基于数据库方言的Sql语句,解决Oralce等数据库的变量绑定,且无需使用Mybatis拦截器去拦截语句判断分页。
一、编写Mybatis Generator Dialect插件
/**
- * Copyright (C) 2011 Tgwoo Inc.
- * http://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,
- 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.begin} and rownum_ <= #{page.end} ]]>"));
- 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.tgwoo.core.dao.pojo.Page"));
- CommentGenerator commentGenerator = context.getCommentGenerator();
- Field field = new Field();
- field.setVisibility(JavaVisibility.PROTECTED);
- field.setType(new FullyQualifiedJavaType("com.tgwoo.core.dao.pojo.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.tgwoo.core.dao.pojo.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.tgwoo.core.dao.pojo.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;
- }
- }
二、增加插件到Mybatis Generator配置文件中
<?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
- <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>
三、示例
/**
- * Copyright (C) 2011 Tgwoo Inc.
- * http://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 mapper = SpringBeanProxy.getCtx().getBean(
- MtVMsgItemMapper.class);
- MtVMsgItemExample ex = new MtVMsgItemExample();
- Page page = new Page(0, 10);
- ex.setPage(page);
- ex.createCriteria().andMsgCodeEqualTo("222");
- // set count,up to you
- page.setCount(mapper.countByExample(ex));
- int row = mapper.selectByExample(ex).size();
- System.out.println("============row:" + row + "================");
- }
- }
四、分页类
- 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
- */
- public Page(int begin, int length) {
- this.begin = begin;
- this.length = length;
- this.end = this.begin + this.length;
- this.current = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;
- }
- /**
- * @param begin
- * @param length
- * @param count
- */
- public Page(int begin, int length, int count) {
- this(begin, length);
- this.count = count;
- }
- /**
- * @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.current = (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.current = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;
- }
- }
- /**
- * @return the count
- */
- public int getCount() {
- return count;
- }
- /**
- * @param count
- * the count to set
- */
- public void setCount(int count) {
- this.count = count;
- this.total = (int) Math.floor((this.count * 1.0d) / this.length);
- if (this.count % this.length != 0) {
- this.total++;
- }
- }
- /**
- * @return the current
- */
- public int getCurrent() {
- return current;
- }
- /**
- * @param current
- * the current to set
- */
- public void setCurrent(int current) {
- this.current = current;
- }
- /**
- * @return the total
- */
- public int getTotal() {
- if (total == 0) {
- return 1;
- }
- return total;
- }
- /**
- * @param total
- * the total to set
- */
- public void setTotal(int total) {
- this.total = total;
- }
- }
五、生成后的代码
1、Example代码
- package com.tgwoo.ctspmt.model;
- import com.tgwoo.core.dao.pojo.Page;
- import java.math.BigDecimal;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- public class MtVMsgItemExample {
- protected String orderByClause;
- protected boolean distinct;
- protected List<Criteria> oredCriteria;
- protected Page page;
- ...
2、mapper.xml
- ...
- <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.tgwoo.ctspmt.model.MtVMsgItemExample" >
- <include refid="OracleDialectPrefix" />
- select
- <if test="distinct" >
- distinct
- </if>
- <include refid="Base_Column_List" />
- from CTSPMT.MT_V_MSG_ITEM
- <if test="_parameter != null" >
- <include refid="Example_Where_Clause" />
- </if>
- <if test="orderByClause != null" >
- order by ${orderByClause}
- </if>
- <include refid="OracleDialectSuffix" />
- </select>
- ...
- <sql id="OracleDialectPrefix" >
- <if test="page != null" >
- select * from ( select row_.*, rownum rownum_ from (
- </if>
- </sql>
- <sql id="OracleDialectSuffix" >
- <if test="page != null" >
- <![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>
- </if>
- </sql>
- ...
附件是Mybatis Generatorjar包。
其他数据库的方言可以按照Oracle的去改写,有写好的希望能共享下。
-------------------------------------------------------------------------------------------------------
maven管理:
1、pom.xml
- <build>
- <plugins>
- <plugin>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-maven-plugin</artifactId>
- <version>1.3.1</version>
- <executions>
- <execution>
- <id>Generate MyBatis Artifacts</id>
- <goals>
- <goal>generate</goal>
- </goals>
- </execution>
- </executions>
- <dependencies>
- <dependency>
- <groupId>com.oracle</groupId>
- <artifactId>ojdbc14</artifactId>
- <version>10.2.0.4.0</version>
- </dependency>
- </dependencies>
- </plugin>
- </plugins>
- </build>
2、generatorConfig.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE generatorConfiguration
- PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
- "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
- <generatorConfiguration>
- <context id="oracleGenerator" targetRuntime="MyBatis3">
- <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"></plugin>
- <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
- <!-- Pagination -->
- <plugin
- type="com.tgwoo.test.core.dao.mybatis.generator.plugin.pagination.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:test" userId="test"
- password="test123" />
- <javaTypeResolver>
- <property name="forceBigDecimals" value="false" />
- </javaTypeResolver>
- <!-- 配置自动生成的Model的保存路径与其它参数 -->
- <javaModelGenerator targetPackage="com.tgwoo.test.dao.model"
- targetProject=".\src\main\java">
- <property name="enableSubPackages" value="false" />
- <property name="trimStrings" value="true" />
- </javaModelGenerator>
- <!-- 配置自动生成的Mappper.xml映射的保存路径与其它参数 -->
- <sqlMapGenerator targetPackage="com.tgwoo.test.dao"
- targetProject=".\src\main\resources">
- <property name="enableSubPackages" value="false" />
- </sqlMapGenerator>
- <!-- 配置自动生成的Mappper.java接口的保存路径与其它参数 -->
- <javaClientGenerator type="XMLMAPPER"
- targetPackage="com.tgwoo.test.dao" targetProject=".\src\main\java">
- <property name="enableSubPackages" value="false" />
- </javaClientGenerator>
- <!-- 生成表对应的操作与实体对象 -->
- <table schema="test" tableName="testTable">
- <columnOverride column="id" javaType="Long" />
- </table>
- </context>
- </generatorConfiguration>
3、run
Goals:mybatis-generator:generate
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- package org.leef.db.mybatis.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.ShellRunner;
- 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,
- IntrospectedTable introspectedTable) {
- // add field, getter, setter for limit clause
- addPage(topLevelClass, introspectedTable, "page");
- addDialect(topLevelClass, introspectedTable, "dialect");
- 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"));
- XmlElement pageDialect1 = new XmlElement("if");
- pageDialect1.addAttribute(new Attribute("test", "dialect == 'oralce'"));
- pageStart.addElement(pageDialect1);
- pageDialect1.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"));
- XmlElement pageDialect2 = new XmlElement("if");
- pageDialect2.addAttribute(new Attribute("test", "dialect == 'oralce'"));
- pageEnd.addElement(pageDialect2);
- pageDialect2.addElement(new TextElement(
- "<![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>"));
- //----- mysql语句。
- XmlElement mysqlDialect = new XmlElement("if");
- mysqlDialect.addAttribute(new Attribute("test", "dialect == 'mysql'"));
- pageEnd.addElement(mysqlDialect);
- mysqlDialect.addElement(new TextElement(
- "limit #{page.start} , #{page.limit}"));
- 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 addDialect(TopLevelClass topLevelClass,
- IntrospectedTable introspectedTable, String name) {
- CommentGenerator commentGenerator = context.getCommentGenerator();
- Field field = new Field();
- field.setVisibility(JavaVisibility.PRIVATE);
- field.setType(new FullyQualifiedJavaType("String"));
- field.setName(name + " = \"mysql\"");
- 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(
- "String"), name));
- method.addBodyLine("this." + name + "=" + name + ";");
- commentGenerator.addGeneralMethodComment(method, introspectedTable);
- topLevelClass.addMethod(method);
- method = new Method();
- method.setVisibility(JavaVisibility.PUBLIC);
- method.setReturnType(new FullyQualifiedJavaType(
- "String"));
- method.setName("get" + camel);
- method.addBodyLine("return " + name + ";");
- commentGenerator.addGeneralMethodComment(method, introspectedTable);
- topLevelClass.addMethod(method);
- }
- /**
- * @param topLevelClass
- * @param introspectedTable
- * @param name
- */
- private void addPage(TopLevelClass topLevelClass,
- IntrospectedTable introspectedTable, String name) {
- topLevelClass.addImportedType(new FullyQualifiedJavaType(
- "com.hnisi.e3itm.base.util.Page"));
- CommentGenerator commentGenerator = context.getCommentGenerator();
- Field field = new Field();
- field.setVisibility(JavaVisibility.PROTECTED);
- field.setType(new FullyQualifiedJavaType("com.hnisi.e3itm.base.util.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.hnisi.e3itm.base.util.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.hnisi.e3itm.base.util.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;
- }
- public static void generate() {
- String config = PaginationPlugin.class.getClassLoader().getResource(
- "generatorConfig.xml").getFile();
- String[] arg = { "-configfile", config, "-overwrite" };
- ShellRunner.main(arg);
- }
- public static void main(String[] args) {
- generate();
- }
- }
///////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////// mysql
- package org.leef.db.mybatis.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.ShellRunner;
- 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.TextElement;
- import org.mybatis.generator.api.dom.xml.XmlElement;
- /**
- * <pre>
- * add pagination using mysql limit.
- * This class is only used in ibator code generator.
- * </pre>
- */
- public class PaginationPlugin extends PluginAdapter {
- @Override
- public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
- IntrospectedTable introspectedTable) {
- // add field, getter, setter for limit clause
- addLimit(topLevelClass, introspectedTable, "limitStart");
- addLimit(topLevelClass, introspectedTable, "limitEnd");
- return super.modelExampleClassGenerated(topLevelClass,
- introspectedTable);
- }
- @Override
- public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(
- XmlElement element, IntrospectedTable introspectedTable) {
- XmlElement isParameterPresenteElemen = (XmlElement) element
- .getElements().get(element.getElements().size() - 1);
- XmlElement isNotNullElement = new XmlElement("isGreaterEqual"); //$NON-NLS-1$
- isNotNullElement.addAttribute(new Attribute("property", "limitStart")); //$NON-NLS-1$ //$NON-NLS-2$
- isNotNullElement.addAttribute(new Attribute("compareValue", "0")); //$NON-NLS-1$ //$NON-NLS-2$
- isNotNullElement.addElement(new TextElement(
- "limit $limitStart$ , $limitEnd$"));
- isParameterPresenteElemen.addElement(isNotNullElement);
- return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,
- introspectedTable);
- }
- private void addLimit(TopLevelClass topLevelClass,
- IntrospectedTable introspectedTable, String name) {
- CommentGenerator commentGenerator = context.getCommentGenerator();
- Field field = new Field();
- field.setVisibility(JavaVisibility.PROTECTED);
- field.setType(FullyQualifiedJavaType.getIntInstance());
- field.setName(name);
- field.setInitializationString("-1");
- 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(FullyQualifiedJavaType
- .getIntInstance(), name));
- method.addBodyLine("this." + name + "=" + name + ";");
- commentGenerator.addGeneralMethodComment(method, introspectedTable);
- topLevelClass.addMethod(method);
- method = new Method();
- method.setVisibility(JavaVisibility.PUBLIC);
- method.setReturnType(FullyQualifiedJavaType.getIntInstance());
- 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;
- }
- public static void generate() {
- String config = PaginationPlugin.class.getClassLoader().getResource(
- "generatorConfig.xml").getFile();
- String[] arg = { "-configfile", config, "-overwrite" };
- ShellRunner.main(arg);
- }
- public static void main(String[] args) {
- generate();
- }
- }
Mybatis Generator实现分页功能的更多相关文章
- SpringBoot集成Mybatis并具有分页功能PageHelper
SpringBoot集成Mybatis并具有分页功能PageHelper 环境:IDEA编译工具 第一步:生成测试的数据库表和数据 SET FOREIGN_KEY_CHECKS=0; ...
- sql,mybatis,javascript分页功能的实现
用三种不同的方法实现多数据的分页功能.原生sql和mybatis的操作需要每次点击不同页数时都发送http请求,进行一次数据库查询,如果放在前端页面写js语句则不需要每次都请求一次,下面是三种不同的方 ...
- mybatis框架的分页功能
需求说明:为用户管理之查询用户列表功能增加分页实现 列表结果按照创建时间降序排列 /** * 需求说明:为用户管理之查询用户列表功能增加分页实现 列表结果按照创建时间降序排列 * @para ...
- mybatis如何实现分页功能?
1)原始方法,使用limit,需要自己处理分页逻辑: 对于mysql数据库可以使用limit,如: select * from table limit 5,10; --返回6-15行 对于oracle ...
- Mybatis Generator通用Join的实现
通常,我们使用Mybatis实现join表关联的时候,一般都是通过在xml或注解里写自定义sql实现. 本文通过Mybatis Generator的插件功能新增一个JoinPlugin插件,只要在配置 ...
- SpringBoot+Mybatis+PageHelper实现分页
SpringBoot+Mybatis+PageHelper实现分页 mybatis自己没有分页功能,我们可以通过PageHelper工具来实现分页,非常简单方便 第一步:添加依赖 <depend ...
- spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能
软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...
- MyBatis Generator实现MySQL分页插件
MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求.但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能.本文介绍如何让MyBa ...
随机推荐
- Android开发学习之路--UI之初体验
之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧.下面看下Android Studio下有哪些控件: 这里分为Widgets,Text Fields,Containers,Da ...
- 精通CSS+DIV网页样式与布局--CSS段落效果
在上一篇博文中,小编主要详细的介绍了CSS是如何控制文字的显示效果,随着需求的不断变更,那么我们如何对段落进行相关操作,以达到我们想要的效果呢,接下来,为了需要,小编继续来完善CSS对段落的控制的显示 ...
- [sersync+rsync] centos6.5 远程文件同步部署记录
针对本地文件的修改,自动同步到远程文件夹,远程备份很方面.研究了下大家的主流同步方案一般是 rsync+inotify和rsync+sersync, 我这里使用sersync的方案,当然大部分都是参照 ...
- Ajax及jQuery学习
AJAX(Asynchronous JavaScript and XML),异步的javaScript与XML AJax中一个重要的对象是XMLHttpRequest. function ajaxSu ...
- Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行
Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...
- UNIX环境高级编程——线程与进程区别
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别在于: (1)一个程序至少有一个进程,一个进程至少有一个线程. (2)线程的划分尺度小于进 ...
- Linux之命令的组合
在Linux下有好多经典的操作,其中尤为经典的是命令的组合,不管是作为参数,还是命令之间的配合,都做得比较完善.下面看一下常用的一些命令吧. 1.连续运行多个命令就可以使用':'作为分隔,但是缺点就是 ...
- mixer: sql词法分析器设计
介绍 mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析.也就是我最头大的词法分析和语法分析. 到现在为止,我只 ...
- java常用集合类详解(有例子,集合类糊涂的来看!)
Framework集合框架是一个统一的架构,用来表示和操作集合.集合框架主要是由接口,抽象类和实现类构成.接口:蓝色:实现类:红色Collection|_____Set(HashSet)| ...
- 【uWSGI】 实战之操作经验
以下是uWSGI版本为2.0以上,uwsgi的启动可以把参数加载命令行中,也可以是配置文件 .ini, .xml, .yaml 配置文件中,个人用的比较多得是 .ini 文件.下面总结下自己操作和使用 ...