日期:2014-05-16  浏览次数:20826 次

修改mybatis的MBG工具源码,支持mysql分页
   最近要做一个项目(私人的,呵呵),因为新公司的新项目是用 spring2.5+ibatis 开发的,所以为了熟悉ibatis ,我的私人项目就决定使用spring3.0 + mybatis3.0 来边熟练边做。
 
   我是一个懒人,在mybatis官网的时候偶然看到竟然有表生成器MBG(一开始还以为只是生成实体对象),就下载下来用了(省了写bean的时间,呵呵)。没想到这工具竟然不是IDE的插件(和hibernate差好多啊),而是要手写(支持用各种方式,比如ant,或者java代码)生成文件,没办法,又下载了这工具的文档看了下,花了点时间,总算用java把这工具写好了。
   写好之后,意外发现了,这工具不单帮我生成了实体bean,还帮我生成了相对应的XML文件(里面竟然连增,删,改,查 已经都写好了,不过仅支持单表操作,不知道和我的表没有设外键有没关系,没试过)以及 dao的接口mapper文件,这下爽死了,连配置文件和接口都省的写了(至少省了单表操作的sql)。
    使用了下,发现问题了,查询不支持分页,无语,但是我又不甘心啊,如果表都用这玩意生成那我不是爽死了,可以省了很多事,所以我又去官网down了这工具的源码下来研究,并修改了源码,终于支持分页了(我只增加了mysql的分页),哈哈。。
    废话不多说了,直接上修改方法。

    1、修改源码要注意的事情:源码包的路径是绝对不能修改的,因为发现源码里面有些配置文件的路径是写死的, - - 这悲剧的。。
    2、其他的不多说,有兴趣自己研究,不算很难,我只说我要修改的文件。
      (1)\org\mybatis\generator\codegen\mybatis3\xmlmapper 这个包里面的类都是为了生成配置xml文件,在里面的elements包下的SelectByExampleWithoutBLOBsElementGenerator.java文件,这个文件是写查询的sql语句,修改如下:
         修改addElements方法如下:
          public void addElements(XmlElement parentElement) {
        String fqjt = introspectedTable.getExampleType();

        XmlElement answer = new XmlElement("select"); //$NON-NLS-1$

        answer.addAttribute(new Attribute("id", //$NON-NLS-1$
                introspectedTable.getSelectByExampleStatementId()));
        answer.addAttribute(new Attribute(
                "resultMap", introspectedTable.getBaseResultMapId())); //$NON-NLS-1$
        answer.addAttribute(new Attribute("parameterType", fqjt)); //$NON-NLS-1$

        context.getCommentGenerator().addComment(answer);

        answer.addElement(new TextElement("select")); //$NON-NLS-1$
        XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "distinct")); //$NON-NLS-1$ //$NON-NLS-2$
        ifElement.addElement(new TextElement("distinct")); //$NON-NLS-1$
        answer.addElement(ifElement);

        StringBuilder sb = new StringBuilder();
        if (stringHasValue(introspectedTable
                .getSelectByExampleQueryId())) {
            sb.append('\'');
            sb.append(introspectedTable.getSelectByExampleQueryId());
            sb.append("' as QUERYID,"); //$NON-NLS-1$
            answer.addElement(new TextElement(sb.toString()));
        }
        answer.addElement(getBaseColumnListElement());

        sb.setLength(0);
        sb.append("from "); //$NON-NLS-1$
        sb.append(introspectedTable
                .getAliasedFullyQualifiedTableNa