分类: IBATIS2013-07-17 17:03 882人阅读 评论(1) 收藏 举报
众所周知,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实现分页功能的更多相关文章

  1. SpringBoot集成Mybatis并具有分页功能PageHelper

    SpringBoot集成Mybatis并具有分页功能PageHelper   环境:IDEA编译工具   第一步:生成测试的数据库表和数据   SET FOREIGN_KEY_CHECKS=0;   ...

  2. sql,mybatis,javascript分页功能的实现

    用三种不同的方法实现多数据的分页功能.原生sql和mybatis的操作需要每次点击不同页数时都发送http请求,进行一次数据库查询,如果放在前端页面写js语句则不需要每次都请求一次,下面是三种不同的方 ...

  3. mybatis框架的分页功能

    需求说明:为用户管理之查询用户列表功能增加分页实现      列表结果按照创建时间降序排列 /** * 需求说明:为用户管理之查询用户列表功能增加分页实现 列表结果按照创建时间降序排列 * @para ...

  4. mybatis如何实现分页功能?

    1)原始方法,使用limit,需要自己处理分页逻辑: 对于mysql数据库可以使用limit,如: select * from table limit 5,10; --返回6-15行 对于oracle ...

  5. Mybatis Generator通用Join的实现

    通常,我们使用Mybatis实现join表关联的时候,一般都是通过在xml或注解里写自定义sql实现. 本文通过Mybatis Generator的插件功能新增一个JoinPlugin插件,只要在配置 ...

  6. SpringBoot+Mybatis+PageHelper实现分页

    SpringBoot+Mybatis+PageHelper实现分页 mybatis自己没有分页功能,我们可以通过PageHelper工具来实现分页,非常简单方便 第一步:添加依赖 <depend ...

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

    软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...

  8. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  9. MyBatis Generator实现MySQL分页插件

    MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求.但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能.本文介绍如何让MyBa ...

随机推荐

  1. SDL2源代码分析8:视频显示总结

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  2. SDK目录结构

    android sdk里的各目录作用 AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. SDK Manager.exe:sdk管理工具,用于管理.下载sdk.sdk工具,能及扩展 ...

  3. 【Vbox】centos虚拟机安装usb网卡驱动

    前面安装增强pack之后 usb设备是可以识别了,但是无法正常使用,应该是无线网卡驱动没有的原因. 查看usb设备 os:centos6.6 内核:2.6.32-504.el6.x86_64 [roo ...

  4. Android进阶(二十七)Android原生扰人烦的布局

    Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...

  5. iOS中 用FMDB封装一个SQLite数据库

    建立一个单例: DataBaseHandle.h #import <Foundation/Foundation.h> @class PersonModel; @class FMDataba ...

  6. Mysql中limit的用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...

  7. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  8. pig读取部分列 (全部列中的少部分列)

    pig流式数据,load数据时,不能读入任意列. 但是,可以从头读,只能连续几列.就是前几列.比如10列数据,可以只读前3列.但不能读第3列: 如:数据testdata [wizad@sr104 lm ...

  9. 网站开发进阶(二十八)初探localStorage

    初探localStorage       注: localStorage经典项目应用案例 HTML5中提供了localStorage对象可以将数据长期保存在客户端,直到人为清除. localStora ...

  10. Swift的基础之关于“!”和“?”的使用介绍

    swift编程,不外乎是定义属性或者函数(方法),访问属性或者调用函数,类型转换,?和!在这几个过程中,都有一展身手的时候,而且,每次要考虑使用的时候,它们俩都会一起出现在我们的大脑中,用还是不用,如 ...