All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mboog.generator.plugins.pagination.OraclePaginationPlugin Maven / Gradle / Ivy

There is a newer version: 1.2.4
Show newest version
package mboog.generator.plugins.pagination;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Element;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

/**
 * @author LiYi
 */
public class OraclePaginationPlugin extends AbstractPaginationPlugin {

    @Override
    public String getDataBaseType() {
        return "Oracle";
    }

    @Override
    public boolean sqlMapExampleWhereClauseElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        for (Attribute attribute : element.getAttributes()) {
            // 确定进入 Example_Where_Clause XML
            if ("id".equals(attribute.getName()) && introspectedTable.getExampleWhereClauseId().equals(attribute.getValue())) {
                for (Element e : element.getElements()) {
                    if (e instanceof XmlElement) {
                        XmlElement exml = (XmlElement) e;
                        // 在where 内部添加条件块
                        if ("where".equals(exml.getName())) {
                            try {
                                XmlElement rownum = new XmlElement("if");
                                rownum.addAttribute(
                                        new Attribute("test", "limitEnd != null and orderByClause == null"));
                                rownum.addElement(new TextElement("and ROWNUM < ${limitEnd}"));
                                exml.getElements().add(rownum);
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                            break;
                        }
                    }
                }
                break;
            }
        }

        return super.sqlMapExampleWhereClauseElementGenerated(element, introspectedTable);
    }

    @Override
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
                                                                     IntrospectedTable introspectedTable) {
        builderXML(element);
        return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
    }

    /**
     * 生成XML
     *
     * @param element
     */
    private void builderXML(XmlElement element) {
        try {
            // 获取备注
            List comments = new ArrayList();
            for (Element e : element.getElements()) {
                comments.add(e);
                if ("-->".equals(e.getFormattedContent(0))) {
                    break;
                }
            }

            // 无分页
            XmlElement when1 = new XmlElement("when");
            when1.addAttribute(new Attribute("test", "limitStart == null"));
            for (int i = comments.size(); i < element.getElements().size(); i++) {
                Element e = element.getElements().get(i);
                when1.addElement(e);
            }

            // 有分页,无排序
            XmlElement when2 = new XmlElement("when");
            when2.addAttribute(new Attribute("test", "limitStart != null and orderByClause == null"));
            when2.addElement(new TextElement("select * from(\n"));
            //排除最后的 order by 条件
            for (int i = comments.size(); i < element.getElements().size() - 1; i++) {
                Element e = element.getElements().get(i);
                if (e instanceof TextElement) {
                    TextElement etemp = (TextElement) e;
                    if (etemp.getContent().startsWith("from ")) {
                        when2.addElement(new TextElement(","));
                        when2.addElement(new TextElement("ROWNUM as rowno"));
                    }
                }
                when2.addElement(e);
            }
            when2.addElement(new TextElement(""));
            when2.addElement(new TextElement(") table_alias"));
            when2.addElement(new TextElement("where"));
            when2.addElement(new TextElement("\ttable_alias.rowno >= ${limitStart}"));

            // 有分页,有排序
            XmlElement when3 = new XmlElement("when");
            when3.addAttribute(new Attribute("test", "limitStart != null and orderByClause != null"));
            when3.addElement(new TextElement("select * from ("));
            when3.addElement(new TextElement("\tselect table_warp_alias.*, ROWNUM as rowno from("));
            when3.addElement(new TextElement(""));
            for (int i = comments.size(); i < element.getElements().size(); i++) {
                Element e = element.getElements().get(i);
                when3.addElement(e);
            }
            when3.addElement(new TextElement(""));
            when3.addElement(new TextElement("\t) table_warp_alias"));
            when3.addElement(new TextElement("\twhere"));
            when3.addElement(new TextElement("\t\tROWNUM < ${limitEnd}"));
            when3.addElement(new TextElement(") table_alias"));
            when3.addElement(new TextElement("where"));
            when3.addElement(new TextElement("\ttable_alias.rowno >= ${limitStart}"));

            XmlElement chooseXMLElement = new XmlElement("choose");
            chooseXMLElement.addElement(when1);
            chooseXMLElement.addElement(when2);
            chooseXMLElement.addElement(when3);

            Field field = element.getClass().getDeclaredField("elements");
            field.setAccessible(true);
            // 清空内部element
            field.set(element, new ArrayList());
            // 设置备注
            for (Element e : comments) {
                element.addElement(e);
            }
            // 设置 chooseXMLElement
            element.addElement(chooseXMLElement);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean validate(List warnings) {
        return true;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy