MybatisGenerator插件开发二【分页】

分页查询在小项目的开发中基本是逃不了的,虽然有基于ThreadLocal的PageHelper插件可以直接使用,但还是想从源头解决问题。针对Mysql来说的话,其实只要在生成的Mapper和SqlMap文件中添加limit和offset就可以了。

添加limit、offset

直接上代码

public class MySqlLimitPluginextends PluginAdapter{

    @Override
    public boolean validate(List<String> list){
        return true;
    }

    /**
     * 为每个Example类添加limit和offset属性已经set、get方法
     * @param topLevelClass
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable){

        PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper();

        Field limit = new Field();
        limit.setName("limit");
        limit.setVisibility(JavaVisibility.PRIVATE);
        limit.setType(integerWrapper);
        topLevelClass.addField(limit);

        Method setLimit = new Method();
        setLimit.setVisibility(JavaVisibility.PUBLIC);
        setLimit.setName("setLimit");
        setLimit.addParameter(new Parameter(integerWrapper, "limit"));
        setLimit.addBodyLine("this.limit = limit;");
        topLevelClass.addMethod(setLimit);

        Method getLimit = new Method();
        getLimit.setVisibility(JavaVisibility.PUBLIC);
        getLimit.setReturnType(integerWrapper);
        getLimit.setName("getLimit");
        getLimit.addBodyLine("return limit;");
        topLevelClass.addMethod(getLimit);

        Field offset = new Field();
        offset.setName("offset");
        offset.setVisibility(JavaVisibility.PRIVATE);
        offset.setType(integerWrapper);
        topLevelClass.addField(offset);

        Method setOffset = new Method();
        setOffset.setVisibility(JavaVisibility.PUBLIC);
        setOffset.setName("setOffset");
        setOffset.addParameter(new Parameter(integerWrapper, "offset"));
        setOffset.addBodyLine("this.offset = offset;");
        topLevelClass.addMethod(setOffset);

        Method getOffset = new Method();
        getOffset.setVisibility(JavaVisibility.PUBLIC);
        getOffset.setReturnType(integerWrapper);
        getOffset.setName("getOffset");
        getOffset.addBodyLine("return offset;");
        topLevelClass.addMethod(getOffset);

        return true;
    }

    @Override
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable){
        XmlElement ifLimitNotNullElement = new XmlElement("if");
        ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null"));

        XmlElement ifOffsetNotNullElement = new XmlElement("if");
        ifOffsetNotNullElement.addAttribute(new Attribute("test", "offset != null"));
        ifOffsetNotNullElement.addElement(new TextElement("limit ${offset}, ${limit}"));
        ifLimitNotNullElement.addElement(ifOffsetNotNullElement);

        XmlElement ifOffsetNullElement = new XmlElement("if");
        ifOffsetNullElement.addAttribute(new Attribute("test", "offset == null"));
        ifOffsetNullElement.addElement(new TextElement("limit ${limit}"));
        ifLimitNotNullElement.addElement(ifOffsetNullElement);

        element.addElement(ifLimitNotNullElement);

        return true;
    }
}

modelExampleClassGenerated
方法是在生成的Example类中添加limit和offset成员变量,以及响应的getter、setter方法。 sqlMapSelectByExampleWithoutBLOBsElementGenerated
方法是在生成的id为 selectByExample
的标签中添加limit和offset。

查看生成文件

将插件添加到项目中,并且运行完MybatisGenerator,我们来查看下生成的相关文件:

Example类:

public class AdministratorExample{
    ...
    private Integer limit;
    private Integer offset;
    
    public void setLimit(Integer limit){
        this.limit = limit;
    }

    public Integer getLimit(){
        return limit;
    }
    
    public void setOffset(Integer offset){
        this.offset = offset;
    }

    public Integer getOffset(){
        return offset;
    }
    ...
}

xml文件:

<selectid="selectByExample"parameterType="cn.didadu.dao.entity.AdministratorExample"resultMap="BaseResultMap">
  select
  <iftest="distinct">
    distinct
  </if>
  <includerefid="Base_Column_List"/>
  from administrator
  <iftest="_parameter != null">
    <includerefid="Example_Where_Clause"/>
  </if>
  <iftest="orderByClause != null">
    order by ${orderByClause}
  </if>
  <iftest="limit != null">
    <iftest="offset != null">
      limit ${offset}, ${limit}
    </if>
    <iftest="offset == null">
      limit ${limit}
    </if>
  </if>
</select>

可以看出成功生成了相应的limit和offset。

如何使用

使用方式如下:

AdministratorExample administratorExample = new AdministratorExample();
administratorExample.setOffset(10);
administratorExample.setLimit(100);

本章节就到这里了。

原文 

http://bboyjing.github.io/2019/03/14/MybatisGenerator插件开发二【分页】/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » MybatisGenerator插件开发二【分页】

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址