Mybatis Generator实现分页功能

Mybatis
Generator实现分页功能

分类: IBATIS2013-07-17 17:03 882人阅读 评论(1) 收藏 举报

mybatisibatisgeneratorpage分页

众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题。网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页。但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能。

Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句。

本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis
Generator生成Mybatis代码时,直接生成基于数据库方言的Sql语句,解决Oralce等数据库的变量绑定,且无需使用Mybatis拦截器去拦截语句判断分页。

一、编写Mybatis Generator Dialect插件

/**

查看文本打印?

  1. * Copyright (C) 2011 Tgwoo Inc.

  2. * http://www.tgwoo.com/

  3. */

  4. package com.tgwoo.core.dao.plugin;
  5. import java.util.List;
  6. import org.mybatis.generator.api.CommentGenerator;

  7. import org.mybatis.generator.api.IntrospectedTable;

  8. import org.mybatis.generator.api.PluginAdapter;

  9. import org.mybatis.generator.api.dom.java.Field;

  10. import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

  11. import org.mybatis.generator.api.dom.java.JavaVisibility;

  12. import org.mybatis.generator.api.dom.java.Method;

  13. import org.mybatis.generator.api.dom.java.Parameter;

  14. import org.mybatis.generator.api.dom.java.TopLevelClass;

  15. import org.mybatis.generator.api.dom.xml.Attribute;

  16. import org.mybatis.generator.api.dom.xml.Document;

  17. import org.mybatis.generator.api.dom.xml.TextElement;

  18. import org.mybatis.generator.api.dom.xml.XmlElement;
  19. /**

  20. * @author pan.wei

  21. * @date 2011-11-30 下午08:36:11

  22. */

  23. public class OraclePaginationPlugin extends PluginAdapter {
  24. @Override

  25. public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,

  26. IntrospectedTable introspectedTable) {

  27. // add field, getter, setter for limit clause

  28. addPage(topLevelClass, introspectedTable, "page");

  29. return super.modelExampleClassGenerated(topLevelClass,

  30. introspectedTable);

  31. }
  32. @Override

  33. public boolean sqlMapDocumentGenerated(Document document,

  34. IntrospectedTable introspectedTable) {

  35. XmlElement parentElement = document.getRootElement();
  36. // 产生分页语句前半部分

  37. XmlElement paginationPrefixElement = new XmlElement("sql");

  38. paginationPrefixElement.addAttribute(new Attribute("id",

  39. "OracleDialectPrefix"));

  40. XmlElement pageStart = new XmlElement("if");

  41. pageStart.addAttribute(new Attribute("test", "page != null"));

  42. pageStart.addElement(new TextElement(

  43. "select * from ( select row_.*, rownum rownum_ from ( "));

  44. paginationPrefixElement.addElement(pageStart);

  45. parentElement.addElement(paginationPrefixElement);
  46. // 产生分页语句后半部分

  47. XmlElement paginationSuffixElement = new XmlElement("sql");

  48. paginationSuffixElement.addAttribute(new Attribute("id",

  49. "OracleDialectSuffix"));

  50. XmlElement pageEnd = new XmlElement("if");

  51. pageEnd.addAttribute(new Attribute("test", "page != null"));

  52. pageEnd.addElement(new TextElement(

  53. "<![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>"));

  54. paginationSuffixElement.addElement(pageEnd);

  55. parentElement.addElement(paginationSuffixElement);
  56. return super.sqlMapDocumentGenerated(document, introspectedTable);

  57. }
  58. @Override

  59. public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(

  60. XmlElement element, IntrospectedTable introspectedTable) {
  61. XmlElement pageStart = new XmlElement("include"); //$NON-NLS-1$

  62. pageStart.addAttribute(new Attribute("refid", "OracleDialectPrefix"));

  63. element.getElements().add(0, pageStart);
  64. XmlElement isNotNullElement = new XmlElement("include"); //$NON-NLS-1$

  65. isNotNullElement.addAttribute(new Attribute("refid",

  66. "OracleDialectSuffix"));

  67. element.getElements().add(isNotNullElement);
  68. return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,

  69. introspectedTable);

  70. }
  71. /**

  72. * @param topLevelClass

  73. * @param introspectedTable

  74. * @param name

  75. */

  76. private void addPage(TopLevelClass topLevelClass,

  77. IntrospectedTable introspectedTable, String name) {

  78. topLevelClass.addImportedType(new FullyQualifiedJavaType(

  79. "com.tgwoo.core.dao.pojo.Page"));

  80. CommentGenerator commentGenerator = context.getCommentGenerator();

  81. Field field = new Field();

  82. field.setVisibility(JavaVisibility.PROTECTED);

  83. field.setType(new FullyQualifiedJavaType("com.tgwoo.core.dao.pojo.Page"));

  84. field.setName(name);

  85. commentGenerator.addFieldComment(field, introspectedTable);

  86. topLevelClass.addField(field);

  87. char c = name.charAt(0);

  88. String camel = Character.toUpperCase(c) + name.substring(1);

  89. Method method = new Method();

  90. method.setVisibility(JavaVisibility.PUBLIC);

  91. method.setName("set" + camel);

  92. method.addParameter(new Parameter(new FullyQualifiedJavaType(

  93. "com.tgwoo.core.dao.pojo.Page"), name));

  94. method.addBodyLine("this." + name + "=" + name + ";");

  95. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  96. topLevelClass.addMethod(method);

  97. method = new Method();

  98. method.setVisibility(JavaVisibility.PUBLIC);

  99. method.setReturnType(new FullyQualifiedJavaType(

  100. "com.tgwoo.core.dao.pojo.Page"));

  101. method.setName("get" + camel);

  102. method.addBodyLine("return " + name + ";");

  103. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  104. topLevelClass.addMethod(method);

  105. }
  106. /**

  107. * This plugin is always valid - no properties are required

  108. */

  109. public boolean validate(List<String> warnings) {

  110. return true;

  111. }

  112. }

二、增加插件到Mybatis Generator配置文件中

<?xml version="1.0" encoding="UTF-8" ?>

查看文本打印?

  1. <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >

  2. <generatorConfiguration >

  3. <classPathEntry location="E:\work\eclipseWorkspace\myEclipse\CTSPMTS\WebRoot\WEB-INF\lib\ojdbc14.jar" />
  4. <context id="oracle" >

  5. <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"></plugin>

  6. <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>

  7. <!-- Pagination -->

  8. <plugin type="com.tgwoo.core.dao.plugin.OraclePaginationPlugin"></plugin>
  9. <commentGenerator>

  10. <property name="suppressDate" value="true" />

  11. <property name="suppressAllComments" value="true" />

  12. </commentGenerator>
  13. <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@192.168.0.2:1521:ctspmt" userId="ctspmt" password="ctspmt123" />

  14. <javaModelGenerator targetPackage="com.tgwoo.ctspmt.model" targetProject="CTSPMTS/src" />

  15. <sqlMapGenerator targetPackage="com.tgwoo.ctspmt.data" targetProject="CTSPMTS/src" />

  16. <javaClientGenerator targetPackage="com.tgwoo.ctspmt.data" targetProject="CTSPMTS/src" type="XMLMAPPER" /><!--
  17. <table schema="ctspmt" tableName="mt_e_interface_log"/>

  18. --><!--

  19. <table schema="ctspmt" tableName="mt_e_msg" />

  20. <table schema="ctspmt" tableName="mt_e_msg_log" />

  21. <table schema="ctspmt" tableName="mt_e_msg_receiver" />

  22. <table schema="ctspmt" tableName="st_e_org" />

  23. <table schema="ctspmt" tableName="st_e_role" />

  24. <table schema="ctspmt" tableName="st_e_user" />

  25. <table schema="ctspmt" tableName="mt_e_user_msg_conf" />

  26. <table schema="ctspmt" tableName="mt_j_user_device" />

  27. <table schema="ctspmt" tableName="st_j_user_role" />

  28. <table schema="ctspmt" tableName="ST_E_UNIQUE_KEY" />

  29. --><table schema="ctspmt" tableName="mt_v_msg_item" />

  30. </context>
  31. </generatorConfiguration>

三、示例

/**

查看文本打印?

  1. * Copyright (C) 2011 Tgwoo Inc.

  2. * http://www.tgwoo.com/

  3. */

  4. package com.tgwoo.ctspmt.test;
  5. import com.tgwoo.core.config.SpringBeanProxy;

  6. import com.tgwoo.core.dao.pojo.Page;

  7. import com.tgwoo.ctspmt.data.MtVMsgItemMapper;

  8. import com.tgwoo.ctspmt.model.MtVMsgItemExample;
  9. /**

  10. * @author pan.wei

  11. * @date 2011-11-25 下午01:26:17

  12. */

  13. public class Test {

  14. /**

  15. * @param args

  16. */

  17. public static void main(String[] args) {

  18. //get spring mapper instance

  19. MtVMsgItemMapper mapper = SpringBeanProxy.getCtx().getBean(

  20. MtVMsgItemMapper.class);

  21. MtVMsgItemExample ex = new MtVMsgItemExample();

  22. Page page = new Page(0, 10);

  23. ex.setPage(page);

  24. ex.createCriteria().andMsgCodeEqualTo("222");

  25. // set count,up to you

  26. page.setCount(mapper.countByExample(ex));

  27. int row = mapper.selectByExample(ex).size();

  28. System.out.println("============row:" + row + "================");

  29. }
  30. }

四、分页类

查看文本打印?

  1. package com.tgwoo.core.dao.pojo;
  2. /**

  3. * @author pan.wei

  4. * @date 2011-12-1 上午11:36:12

  5. */

  6. public class Page {

  7. // 分页查询开始记录位置

  8. private int begin;

  9. // 分页查看下结束位置

  10. private int end;

  11. // 每页显示记录数

  12. private int length;

  13. // 查询结果总记录数

  14. private int count;

  15. // 当前页码

  16. private int current;

  17. // 总共页数

  18. private int total;
  19. public Page() {

  20. }
  21. /**

  22. * 构造函数

  23. *

  24. * @param begin

  25. * @param length

  26. */

  27. public Page(int begin, int length) {

  28. this.begin = begin;

  29. this.length = length;

  30. this.end = this.begin + this.length;

  31. this.current = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;

  32. }
  33. /**

  34. * @param begin

  35. * @param length

  36. * @param count

  37. */

  38. public Page(int begin, int length, int count) {

  39. this(begin, length);

  40. this.count = count;

  41. }
  42. /**

  43. * @return the begin

  44. */

  45. public int getBegin() {

  46. return begin;

  47. }
  48. /**

  49. * @return the end

  50. */

  51. public int getEnd() {

  52. return end;

  53. }
  54. /**

  55. * @param end

  56. *            the end to set

  57. */

  58. public void setEnd(int end) {

  59. this.end = end;

  60. }
  61. /**

  62. * @param begin

  63. *            the begin to set

  64. */

  65. public void setBegin(int begin) {

  66. this.begin = begin;

  67. if (this.length != 0) {

  68. this.current = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;

  69. }

  70. }
  71. /**

  72. * @return the length

  73. */

  74. public int getLength() {

  75. return length;

  76. }
  77. /**

  78. * @param length

  79. *            the length to set

  80. */

  81. public void setLength(int length) {

  82. this.length = length;

  83. if (this.begin != 0) {

  84. this.current = (int) Math.floor((this.begin * 1.0d) / this.length) + 1;

  85. }

  86. }
  87. /**

  88. * @return the count

  89. */

  90. public int getCount() {

  91. return count;

  92. }
  93. /**

  94. * @param count

  95. *            the count to set

  96. */

  97. public void setCount(int count) {

  98. this.count = count;

  99. this.total = (int) Math.floor((this.count * 1.0d) / this.length);

  100. if (this.count % this.length != 0) {

  101. this.total++;

  102. }

  103. }
  104. /**

  105. * @return the current

  106. */

  107. public int getCurrent() {

  108. return current;

  109. }
  110. /**

  111. * @param current

  112. *            the current to set

  113. */

  114. public void setCurrent(int current) {

  115. this.current = current;

  116. }
  117. /**

  118. * @return the total

  119. */

  120. public int getTotal() {

  121. if (total == 0) {

  122. return 1;

  123. }

  124. return total;

  125. }
  126. /**

  127. * @param total

  128. *            the total to set

  129. */

  130. public void setTotal(int total) {

  131. this.total = total;

  132. }
  133. }

五、生成后的代码

1、Example代码

查看文本打印?

  1. package com.tgwoo.ctspmt.model;
  2. import com.tgwoo.core.dao.pojo.Page;

  3. import java.math.BigDecimal;

  4. import java.util.ArrayList;

  5. import java.util.Date;

  6. import java.util.Iterator;

  7. import java.util.List;
  8. public class MtVMsgItemExample {

  9. protected String orderByClause;
  10. protected boolean distinct;
  11. protected List<Criteria> oredCriteria;
  12. protected Page page;
  13. ...

2、mapper.xml

查看文本打印?

  1. ...

  2. <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.tgwoo.ctspmt.model.MtVMsgItemExample" >

  3. <include refid="OracleDialectPrefix" />

  4. select

  5. <if test="distinct" >

  6. distinct

  7. </if>

  8. <include refid="Base_Column_List" />

  9. from CTSPMT.MT_V_MSG_ITEM

  10. <if test="_parameter != null" >

  11. <include refid="Example_Where_Clause" />

  12. </if>

  13. <if test="orderByClause != null" >

  14. order by ${orderByClause}

  15. </if>

  16. <include refid="OracleDialectSuffix" />

  17. </select>

  18. ...

  19. <sql id="OracleDialectPrefix" >

  20. <if test="page != null" >

  21. select * from ( select row_.*, rownum rownum_ from (

  22. </if>

  23. </sql>

  24. <sql id="OracleDialectSuffix" >

  25. <if test="page != null" >

  26. <![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>

  27. </if>

  28. </sql>

  29. ...

附件是Mybatis Generatorjar包。

其他数据库的方言可以按照Oracle的去改写,有写好的希望能共享下。

-------------------------------------------------------------------------------------------------------

maven管理:

1、pom.xml

查看文本打印?

  1. <build>

  2. <plugins>

  3. <plugin>

  4. <groupId>org.mybatis.generator</groupId>

  5. <artifactId>mybatis-generator-maven-plugin</artifactId>

  6. <version>1.3.1</version>

  7. <executions>

  8. <execution>

  9. <id>Generate MyBatis Artifacts</id>

  10. <goals>

  11. <goal>generate</goal>

  12. </goals>

  13. </execution>

  14. </executions>

  15. <dependencies>

  16. <dependency>

  17. <groupId>com.oracle</groupId>

  18. <artifactId>ojdbc14</artifactId>

  19. <version>10.2.0.4.0</version>

  20. </dependency>

  21. </dependencies>

  22. </plugin>

  23. </plugins>

  24. </build>

查看文本打印?

2、generatorConfig.xml

查看文本打印?

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE generatorConfiguration

  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

  5. <generatorConfiguration>

  6. <context id="oracleGenerator" targetRuntime="MyBatis3">

  7. <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"></plugin>

  8. <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>

  9. <!-- Pagination -->

  10. <plugin

  11. type="com.tgwoo.test.core.dao.mybatis.generator.plugin.pagination.OraclePaginationPlugin"></plugin>
  12. <!-- 取消注释 -->

  13. <commentGenerator>

  14. <property name="suppressDate" value="true" />

  15. <property name="suppressAllComments" value="true" />

  16. </commentGenerator>

  17. <!-- 配置连接数据信息 -->

  18. <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"

  19. connectionURL="jdbc:oracle:thin:@192.168.0.2:1521:test" userId="test"

  20. password="test123" />

  21. <javaTypeResolver>

  22. <property name="forceBigDecimals" value="false" />

  23. </javaTypeResolver>
  24. <!-- 配置自动生成的Model的保存路径与其它参数 -->

  25. <javaModelGenerator targetPackage="com.tgwoo.test.dao.model"

  26. targetProject=".\src\main\java">

  27. <property name="enableSubPackages" value="false" />

  28. <property name="trimStrings" value="true" />

  29. </javaModelGenerator>
  30. <!-- 配置自动生成的Mappper.xml映射的保存路径与其它参数 -->

  31. <sqlMapGenerator targetPackage="com.tgwoo.test.dao"

  32. targetProject=".\src\main\resources">

  33. <property name="enableSubPackages" value="false" />

  34. </sqlMapGenerator>
  35. <!-- 配置自动生成的Mappper.java接口的保存路径与其它参数 -->

  36. <javaClientGenerator type="XMLMAPPER"

  37. targetPackage="com.tgwoo.test.dao" targetProject=".\src\main\java">

  38. <property name="enableSubPackages" value="false" />

  39. </javaClientGenerator>
  40. <!-- 生成表对应的操作与实体对象 -->

  41. <table schema="test" tableName="testTable">

  42. <columnOverride column="id" javaType="Long" />

  43. </table>

  44. </context>

  45. </generatorConfiguration>

3、run

Goals:mybatis-generator:generate

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

查看文本打印?

  1. package org.leef.db.mybatis.plugin;
  2. import java.util.List;
  3. import org.mybatis.generator.api.CommentGenerator;

  4. import org.mybatis.generator.api.IntrospectedTable;

  5. import org.mybatis.generator.api.PluginAdapter;

  6. import org.mybatis.generator.api.ShellRunner;

  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.TopLevelClass;

  13. import org.mybatis.generator.api.dom.xml.Attribute;

  14. import org.mybatis.generator.api.dom.xml.Document;

  15. import org.mybatis.generator.api.dom.xml.TextElement;

  16. import org.mybatis.generator.api.dom.xml.XmlElement;
  17. /**

  18. * @author pan.wei

  19. * @date 2011-11-30 下午08:36:11

  20. */

  21. public class OraclePaginationPlugin extends PluginAdapter {
  22. @Override

  23. public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,

  24. IntrospectedTable introspectedTable) {

  25. // add field, getter, setter for limit clause

  26. addPage(topLevelClass, introspectedTable, "page");

  27. addDialect(topLevelClass, introspectedTable, "dialect");

  28. return super.modelExampleClassGenerated(topLevelClass,

  29. introspectedTable);

  30. }
  31. @Override

  32. public boolean sqlMapDocumentGenerated(Document document,

  33. IntrospectedTable introspectedTable) {

  34. XmlElement parentElement = document.getRootElement();
  35. // 产生分页语句前半部分

  36. XmlElement paginationPrefixElement = new XmlElement("sql");

  37. paginationPrefixElement.addAttribute(new Attribute("id",

  38. "OracleDialectPrefix"));

  39. XmlElement pageStart = new XmlElement("if");

  40. pageStart.addAttribute(new Attribute("test", "page != null"));

  41. XmlElement pageDialect1 = new XmlElement("if");

  42. pageDialect1.addAttribute(new Attribute("test", "dialect == ‘oralce‘"));

  43. pageStart.addElement(pageDialect1);

  44. pageDialect1.addElement(new TextElement(

  45. "select * from ( select row_.*, rownum rownum_ from ( "));

  46. paginationPrefixElement.addElement(pageStart);

  47. parentElement.addElement(paginationPrefixElement);
  48. // 产生分页语句后半部分

  49. XmlElement paginationSuffixElement = new XmlElement("sql");

  50. paginationSuffixElement.addAttribute(new Attribute("id",

  51. "OracleDialectSuffix"));

  52. XmlElement pageEnd = new XmlElement("if");

  53. pageEnd.addAttribute(new Attribute("test", "page != null"));

  54. XmlElement pageDialect2 = new XmlElement("if");

  55. pageDialect2.addAttribute(new Attribute("test", "dialect == ‘oralce‘"));

  56. pageEnd.addElement(pageDialect2);

  57. pageDialect2.addElement(new TextElement(

  58. "<![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>"));
  59. //----- mysql语句。

  60. XmlElement mysqlDialect = new XmlElement("if");

  61. mysqlDialect.addAttribute(new Attribute("test", "dialect == ‘mysql‘"));

  62. pageEnd.addElement(mysqlDialect);

  63. mysqlDialect.addElement(new TextElement(

  64. "limit #{page.start} , #{page.limit}"));

  65. paginationSuffixElement.addElement(pageEnd);
  66. parentElement.addElement(paginationSuffixElement);
  67. return super.sqlMapDocumentGenerated(document, introspectedTable);

  68. }
  69. @Override

  70. public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(

  71. XmlElement element, IntrospectedTable introspectedTable) {
  72. XmlElement pageStart = new XmlElement("include"); //$NON-NLS-1$

  73. pageStart.addAttribute(new Attribute("refid", "OracleDialectPrefix"));

  74. element.getElements().add(0, pageStart);
  75. XmlElement isNotNullElement = new XmlElement("include"); //$NON-NLS-1$

  76. isNotNullElement.addAttribute(new Attribute("refid",

  77. "OracleDialectSuffix"));

  78. element.getElements().add(isNotNullElement);
  79. return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,

  80. introspectedTable);

  81. }
  82. /**

  83. * @param topLevelClass

  84. * @param introspectedTable

  85. * @param name

  86. */

  87. private void addDialect(TopLevelClass topLevelClass,

  88. IntrospectedTable introspectedTable, String name) {

  89. CommentGenerator commentGenerator = context.getCommentGenerator();

  90. Field field = new Field();

  91. field.setVisibility(JavaVisibility.PRIVATE);

  92. field.setType(new FullyQualifiedJavaType("String"));

  93. field.setName(name + " = \"mysql\"");

  94. commentGenerator.addFieldComment(field, introspectedTable);

  95. topLevelClass.addField(field);

  96. char c = name.charAt(0);

  97. String camel = Character.toUpperCase(c) + name.substring(1);

  98. Method method = new Method();

  99. method.setVisibility(JavaVisibility.PUBLIC);

  100. method.setName("set" + camel);

  101. method.addParameter(new Parameter(new FullyQualifiedJavaType(

  102. "String"), name));

  103. method.addBodyLine("this." + name + "=" + name + ";");

  104. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  105. topLevelClass.addMethod(method);

  106. method = new Method();

  107. method.setVisibility(JavaVisibility.PUBLIC);

  108. method.setReturnType(new FullyQualifiedJavaType(

  109. "String"));

  110. method.setName("get" + camel);

  111. method.addBodyLine("return " + name + ";");

  112. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  113. topLevelClass.addMethod(method);

  114. }
  115. /**

  116. * @param topLevelClass

  117. * @param introspectedTable

  118. * @param name

  119. */

  120. private void addPage(TopLevelClass topLevelClass,

  121. IntrospectedTable introspectedTable, String name) {

  122. topLevelClass.addImportedType(new FullyQualifiedJavaType(

  123. "com.hnisi.e3itm.base.util.Page"));

  124. CommentGenerator commentGenerator = context.getCommentGenerator();

  125. Field field = new Field();

  126. field.setVisibility(JavaVisibility.PROTECTED);

  127. field.setType(new FullyQualifiedJavaType("com.hnisi.e3itm.base.util.Page"));

  128. field.setName(name);

  129. commentGenerator.addFieldComment(field, introspectedTable);

  130. topLevelClass.addField(field);

  131. char c = name.charAt(0);

  132. String camel = Character.toUpperCase(c) + name.substring(1);

  133. Method method = new Method();

  134. method.setVisibility(JavaVisibility.PUBLIC);

  135. method.setName("set" + camel);

  136. method.addParameter(new Parameter(new FullyQualifiedJavaType(

  137. "com.hnisi.e3itm.base.util.Page"), name));

  138. method.addBodyLine("this." + name + "=" + name + ";");

  139. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  140. topLevelClass.addMethod(method);

  141. method = new Method();

  142. method.setVisibility(JavaVisibility.PUBLIC);

  143. method.setReturnType(new FullyQualifiedJavaType(

  144. "com.hnisi.e3itm.base.util.Page"));

  145. method.setName("get" + camel);

  146. method.addBodyLine("return " + name + ";");

  147. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  148. topLevelClass.addMethod(method);

  149. }
  150. /**

  151. * This plugin is always valid - no properties are required

  152. */

  153. public boolean validate(List<String> warnings) {

  154. return true;

  155. }
  156. public static void generate() {

  157. String config = PaginationPlugin.class.getClassLoader().getResource(

  158. "generatorConfig.xml").getFile();

  159. String[] arg = { "-configfile", config, "-overwrite" };

  160. ShellRunner.main(arg);

  161. }

  162. public static void main(String[] args) {

  163. generate();

  164. }

  165. }

///////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////
mysql

查看文本打印?

  1. package org.leef.db.mybatis.plugin;

  2. import java.util.List;

  3. import org.mybatis.generator.api.CommentGenerator;

  4. import org.mybatis.generator.api.IntrospectedTable;

  5. import org.mybatis.generator.api.PluginAdapter;

  6. import org.mybatis.generator.api.ShellRunner;

  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.TopLevelClass;

  13. import org.mybatis.generator.api.dom.xml.Attribute;

  14. import org.mybatis.generator.api.dom.xml.TextElement;

  15. import org.mybatis.generator.api.dom.xml.XmlElement;

  16. /**

  17. * <pre>

  18. * add pagination using mysql limit.

  19. * This class is only used in ibator code generator.

  20. * </pre>

  21. */

  22. public class PaginationPlugin extends PluginAdapter {

  23. @Override

  24. public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,

  25. IntrospectedTable introspectedTable) {

  26. // add field, getter, setter for limit clause

  27. addLimit(topLevelClass, introspectedTable, "limitStart");

  28. addLimit(topLevelClass, introspectedTable, "limitEnd");

  29. return super.modelExampleClassGenerated(topLevelClass,

  30. introspectedTable);

  31. }

  32. @Override

  33. public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(

  34. XmlElement element, IntrospectedTable introspectedTable) {

  35. XmlElement isParameterPresenteElemen = (XmlElement) element

  36. .getElements().get(element.getElements().size() - 1);

  37. XmlElement isNotNullElement = new XmlElement("isGreaterEqual"); //$NON-NLS-1$

  38. isNotNullElement.addAttribute(new Attribute("property", "limitStart")); //$NON-NLS-1$ //$NON-NLS-2$

  39. isNotNullElement.addAttribute(new Attribute("compareValue", "0")); //$NON-NLS-1$ //$NON-NLS-2$

  40. isNotNullElement.addElement(new TextElement(

  41. "limit $limitStart$ , $limitEnd$"));

  42. isParameterPresenteElemen.addElement(isNotNullElement);

  43. return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,

  44. introspectedTable);

  45. }

  46. private void addLimit(TopLevelClass topLevelClass,

  47. IntrospectedTable introspectedTable, String name) {

  48. CommentGenerator commentGenerator = context.getCommentGenerator();

  49. Field field = new Field();

  50. field.setVisibility(JavaVisibility.PROTECTED);

  51. field.setType(FullyQualifiedJavaType.getIntInstance());

  52. field.setName(name);

  53. field.setInitializationString("-1");

  54. commentGenerator.addFieldComment(field, introspectedTable);

  55. topLevelClass.addField(field);

  56. char c = name.charAt(0);

  57. String camel = Character.toUpperCase(c) + name.substring(1);

  58. Method method = new Method();

  59. method.setVisibility(JavaVisibility.PUBLIC);

  60. method.setName("set" + camel);

  61. method.addParameter(new Parameter(FullyQualifiedJavaType

  62. .getIntInstance(), name));

  63. method.addBodyLine("this." + name + "=" + name + ";");

  64. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  65. topLevelClass.addMethod(method);

  66. method = new Method();

  67. method.setVisibility(JavaVisibility.PUBLIC);

  68. method.setReturnType(FullyQualifiedJavaType.getIntInstance());

  69. method.setName("get" + camel);

  70. method.addBodyLine("return " + name + ";");

  71. commentGenerator.addGeneralMethodComment(method, introspectedTable);

  72. topLevelClass.addMethod(method);

  73. }

  74. /**

  75. * This plugin is always valid - no properties are required

  76. */

  77. public boolean validate(List<String> warnings) {

  78. return true;

  79. }

  80. public static void generate() {

  81. String config = PaginationPlugin.class.getClassLoader().getResource(

  82. "generatorConfig.xml").getFile();

  83. String[] arg = { "-configfile", config, "-overwrite" };

  84. ShellRunner.main(arg);

  85. }

  86. public static void main(String[] args) {

  87. generate();

  88. }

  89. }

Mybatis Generator实现分页功能,布布扣,bubuko.com

时间: 2024-10-13 12:34:12

Mybatis Generator实现分页功能的相关文章

mybatis如何实现分页功能?

1)原始方法,使用limit,需要自己处理分页逻辑: 对于mysql数据库可以使用limit,如: select * from table limit 5,10; --返回6-15行 对于oracle数据库可以使用rownum,如: --如:从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下 SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 Where t2

Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)

众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能. Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句. 本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis

spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能

软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-framework/ MyBatis是一个基于Java的数据持久层框架,其原名是iBatis,在升级到3.0版本后,更名为MyBatis.https://github.com/mybatis/mybatis-3/ MyBatis Generator是一个MyBatis的代码生成器,通过配置,可自动生成数据操作

MyBatis Generator实现MySQL分页插件

MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求.但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能.本文介绍如何让MyBatis Generator生成的代码具有分页功能. MyBatis Generator结合Maven的配置和使用 在实现分页之前,首先简单介绍MyBatis Generator如何使用. MyBatis Generator配置文件 MyBatis Generator通常会有一个xml配置文件,用来指

mybatis结合generator进行分页插件PluginAdapter开发

使用org.mybatis.generator生成UserExample时,无法进行分页,使用下面这个类运行generator便可以生成分页相关的属性了 package org.mybatis.generator.plugin; import java.util.List; import org.mybatis.generator.api.CommentGenerator; import org.mybatis.generator.api.IntrospectedTable; import or

mybatis generator生成带有分页的Mybatis代码

MyBatis开发,最让人开心的就是可以随意写SQL,这样有多好的性能的SQL都可以进行调优. 但是MyBatis的优点也是它的缺点,不论什么项目都需要编写SQL,令人头疼的要命,一般业务(例如单表操作)的简单查询.修改.删除.插入,都需要自己手工去编写SQL. 还好有第三方的软件给我解决这些事情,可以像使用Hibernate一样使用MyBatis,当需要进行特殊定制的再进行修改. 1.      本文档主要描述 1.表格: 2.视图:3.存储过程:4.自定义的MyBatis 1.1.     

Mybatis无需更改原有代码1分钟完美实现分页功能插件(不服你咬我)

首先,本博文为第三方插件的使用方法.实例,不涉及mybatis提供的interceptor接口及其他源码内容,大神请绕行~~ 背景:新撘工程使用了mybatis3.2.8,想要实现分页查询功能,遂找之,成. 一.为尊重开发人员成果,先上URL. [email protected]:http://git.oschina.net/free/Mybatis_PageHelper(里面已经有很详细的使用说明) GitHub:https://github.com/pagehelper/Mybatis-Pa

MyBatis精通之路之分页功能的实现

MyBatis精通之路之分页功能的实现(数组分页.sql分页.拦截器,RowBounds分页) 原创 2017年04月27日 21:34:48 标签: mybatis / java / j2ee / mysql / 分页 4162 前言:学习hibernate & mybatis等持久层框架的时候,不外乎对数据库的增删改查操作.而使用最多的当是数据库的查找操作, 而当数据库数据过多时,符合查找条件的数据可能也会是很庞大的数据.往往在这个时候,我们都不会希望一次性的将所有的数据一起性读取出来,并且

Java后台管理系统(八):MyBatis分页功能实现

使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写 count 和 select,幸好我们有 pagehelper 分页插件,pagehelper 是一个强大实用的 MyBatis 分页插件,可以帮助我们快速的实现分页功能.那么,接下来我们就来一起体验下吧. 添加依赖 在 kitty-admin pom.xml 文件内添加分页插件依赖包. pom.xml <!-- pagehelp