├── README.md ├── pom.xml └── src └── main └── java └── com └── xxg └── mybatis └── plugins └── MySQLLimitPlugin.java /README.md: -------------------------------------------------------------------------------- 1 | # mybatis-generator-limit-plugin 2 | A MyBatis Generator plugin for MySQL pagination use limit. 3 | 4 | http://xxgblog.com/2016/05/06/mybatis-generator-mysql-pagination/ 5 | 6 | The project moves to https://github.com/wucao/mybatis-generator-mysql-plugin 7 | 8 | ## Usage 9 | 10 | Add the plugin `` into MyBatis Generator configuration file. 11 | 12 | ``` 13 | 14 | 15 | 16 | ... 17 | 18 | 19 | ``` 20 | 21 | ### Running with Maven 22 | 23 | pom.xml 24 | 25 | ``` 26 | 27 | 28 | xxg-repository 29 | http://repo.maven.xxgblog.com/ 30 | 31 | 32 | ``` 33 | 34 | ``` 35 | 36 | 37 | 38 | org.mybatis.generator 39 | mybatis-generator-maven-plugin 40 | 1.3.2 41 | 42 | 43 | mysql 44 | mysql-connector-java 45 | 5.1.34 46 | 47 | 48 | com.xxg 49 | mbg-limit-plugin 50 | 1.0.0 51 | 52 | 53 | 54 | true 55 | 56 | 57 | 58 | 59 | ``` 60 | 61 | Run `mvn mybatis-generator:generator` to generate java and xml files. 62 | 63 | ### Using the Generated Objects 64 | 65 | ``` 66 | XxxExample example = new XxxExample(); 67 | ... 68 | example.setLimit(10); // page size limit 69 | example.setOffset(20); // offset 70 | List list = xxxMapper.selectByExample(example); 71 | ``` 72 | The SQL will be: 73 | `select ... limit 20, 10` 74 | 75 | ``` 76 | XxxExample example = new XxxExample(); 77 | ... 78 | example.setLimit(10); // limit 79 | List list = xxxMapper.selectByExample(example); 80 | ``` 81 | The SQL will be: 82 | `select ... limit 10` 83 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 4.0.0 6 | com.xxg 7 | mbg-limit-plugin 8 | 1.0.0 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | ftp-repository 17 | ftp://v0.ftp.upyun.com 18 | 19 | 20 | 21 | 22 | 23 | 24 | org.apache.maven.wagon 25 | wagon-ftp 26 | 2.10 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.3 34 | 35 | 1.7 36 | 1.7 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.mybatis.generator 45 | mybatis-generator-core 46 | 1.3.2 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/main/java/com/xxg/mybatis/plugins/MySQLLimitPlugin.java: -------------------------------------------------------------------------------- 1 | package com.xxg.mybatis.plugins; 2 | 3 | import java.util.List; 4 | 5 | import org.mybatis.generator.api.IntrospectedTable; 6 | import org.mybatis.generator.api.PluginAdapter; 7 | import org.mybatis.generator.api.dom.java.Field; 8 | import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; 9 | import org.mybatis.generator.api.dom.java.JavaVisibility; 10 | import org.mybatis.generator.api.dom.java.Method; 11 | import org.mybatis.generator.api.dom.java.Parameter; 12 | import org.mybatis.generator.api.dom.java.PrimitiveTypeWrapper; 13 | import org.mybatis.generator.api.dom.java.TopLevelClass; 14 | import org.mybatis.generator.api.dom.xml.Attribute; 15 | import org.mybatis.generator.api.dom.xml.TextElement; 16 | import org.mybatis.generator.api.dom.xml.XmlElement; 17 | 18 | public class MySQLLimitPlugin extends PluginAdapter { 19 | 20 | @Override 21 | public boolean validate(List list) { 22 | return true; 23 | } 24 | 25 | /** 26 | * 为每个Example类添加limit和offset属性已经set、get方法 27 | */ 28 | @Override 29 | public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { 30 | 31 | PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper(); 32 | 33 | Field limit = new Field(); 34 | limit.setName("limit"); 35 | limit.setVisibility(JavaVisibility.PRIVATE); 36 | limit.setType(integerWrapper); 37 | topLevelClass.addField(limit); 38 | 39 | Method setLimit = new Method(); 40 | setLimit.setVisibility(JavaVisibility.PUBLIC); 41 | setLimit.setName("setLimit"); 42 | setLimit.addParameter(new Parameter(integerWrapper, "limit")); 43 | setLimit.addBodyLine("this.limit = limit;"); 44 | topLevelClass.addMethod(setLimit); 45 | 46 | Method getLimit = new Method(); 47 | getLimit.setVisibility(JavaVisibility.PUBLIC); 48 | getLimit.setReturnType(integerWrapper); 49 | getLimit.setName("getLimit"); 50 | getLimit.addBodyLine("return limit;"); 51 | topLevelClass.addMethod(getLimit); 52 | 53 | Field offset = new Field(); 54 | offset.setName("offset"); 55 | offset.setVisibility(JavaVisibility.PRIVATE); 56 | offset.setType(integerWrapper); 57 | topLevelClass.addField(offset); 58 | 59 | Method setOffset = new Method(); 60 | setOffset.setVisibility(JavaVisibility.PUBLIC); 61 | setOffset.setName("setOffset"); 62 | setOffset.addParameter(new Parameter(integerWrapper, "offset")); 63 | setOffset.addBodyLine("this.offset = offset;"); 64 | topLevelClass.addMethod(setOffset); 65 | 66 | Method getOffset = new Method(); 67 | getOffset.setVisibility(JavaVisibility.PUBLIC); 68 | getOffset.setReturnType(integerWrapper); 69 | getOffset.setName("getOffset"); 70 | getOffset.addBodyLine("return offset;"); 71 | topLevelClass.addMethod(getOffset); 72 | 73 | return true; 74 | } 75 | 76 | /** 77 | * 为Mapper.xml的selectByExample添加limit 78 | */ 79 | @Override 80 | public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, 81 | IntrospectedTable introspectedTable) { 82 | 83 | XmlElement ifLimitNotNullElement = new XmlElement("if"); 84 | ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null")); 85 | 86 | XmlElement ifOffsetNotNullElement = new XmlElement("if"); 87 | ifOffsetNotNullElement.addAttribute(new Attribute("test", "offset != null")); 88 | ifOffsetNotNullElement.addElement(new TextElement("limit ${offset}, ${limit}")); 89 | ifLimitNotNullElement.addElement(ifOffsetNotNullElement); 90 | 91 | XmlElement ifOffsetNullElement = new XmlElement("if"); 92 | ifOffsetNullElement.addAttribute(new Attribute("test", "offset == null")); 93 | ifOffsetNullElement.addElement(new TextElement("limit ${limit}")); 94 | ifLimitNotNullElement.addElement(ifOffsetNullElement); 95 | 96 | element.addElement(ifLimitNotNullElement); 97 | 98 | return true; 99 | } 100 | } 101 | --------------------------------------------------------------------------------