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

net.xiaoboli.mgp.ServicePlugin Maven / Gradle / Ivy

package net.xiaoboli.mgp;

import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.generator.api.*;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.logging.Log;
import org.mybatis.generator.logging.LogFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;

public class ServicePlugin extends PluginAdapter {

    // 项目目录,一般为 src/main/java
    private String targetProject;
    private String targetImplProject;

    // service包名,如:service.service
    private String servicePackage;

    // service实现类包名,如:service.service.impl
    private String serviceImplPackage;
    // service接口名前缀
    private String servicePrefix;

    // service接口名后缀
    private String serviceSuffix;

    // mapper接口的父接口
    private String baseMapper;
    // service接口的父接口
    private String baseService;
    // service实现类的父类
    private String baseServiceClass;

    private String recordType;

    private String modelName;

    private FullyQualifiedJavaType model;

    private String serviceName;
    private String serviceImplName;

    private String mapperPublic;
    private String mapperSystem;
    private String mapperNS;
    private String mapperTargetProject;
    private Log log;

    @Override
    public void initialized(IntrospectedTable introspectedTable) {
        this.log = LogFactory.getLog(this.getClass());

        //
        targetProject = properties.getProperty("targetProject", "");
        targetImplProject = properties.getProperty("targetImplProject", "");
        servicePackage = properties.getProperty("servicePackage", "system.service");
        serviceImplPackage = properties.getProperty("serviceImplPackage", "");

        //
        String serviceProject = introspectedTable.getTableConfiguration().getProperty("serviceProject");
        if (StringUtils.isNotBlank(serviceProject)) {
            targetProject = serviceProject;
        }

        //
        String serviceImplProject = introspectedTable.getTableConfiguration().getProperty("serviceImplProject");
        if (StringUtils.isNotBlank(serviceImplProject)) {
            targetImplProject = serviceImplProject;
        }

        //
        String sp = introspectedTable.getTableConfiguration().getProperty("servicePackage");
        if (StringUtils.isNotBlank(sp)) {
            servicePackage = sp;
        }

        //
        String tip = introspectedTable.getTableConfiguration().getProperty("serviceImplPackage");
        if (StringUtils.isNotBlank(tip)) {
            serviceImplPackage = tip;
        }

        //
        targetImplProject = stringHasValue(targetImplProject) ? targetImplProject : targetProject;
        serviceImplPackage = stringHasValue(serviceImplPackage) ? serviceImplPackage : (servicePackage + ".impl");

        //

        if (!stringHasValue(targetProject)) {
            throw new RuntimeException("property serviceProject empty");
        }

        if (!stringHasValue(targetImplProject)) {
            throw new RuntimeException("property targetImplProject empty");
        }

        if (!stringHasValue(servicePackage)) {
            throw new RuntimeException("property servicePackage empty");
        }

        if (!stringHasValue(serviceImplPackage)) {
            throw new RuntimeException("property serviceImplPackage empty");
        }

        // --------------------------------------

        servicePrefix = properties.getProperty("servicePrefix");
        servicePrefix = stringHasValue(servicePrefix) ? servicePrefix : "";
        serviceSuffix = properties.getProperty("serviceSuffix", "Service");
        serviceSuffix = stringHasValue(serviceSuffix) ? serviceSuffix : "";
        baseMapper = properties.getProperty("baseMapper", "framework.base.BaseMapper");
        baseService = properties.getProperty("baseService", "framework.base.BaseService");
        baseServiceClass = properties.getProperty("baseServiceClass", "");
        mapperTargetProject = properties.getProperty("mapperTargetProject", "");

    }

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

    @SneakyThrows
    @Override
    public List contextGenerateAdditionalXmlFiles(IntrospectedTable introspectedTable) {
        List answer = new ArrayList<>();

        try {

            //mapper
            if (stringHasValue(this.mapperTargetProject)) {
                GeneratedXmlFile mapXml = generateMapperXml(introspectedTable);
                if (PluginUtil.canWrite(mapXml))
                    answer.add(mapXml);
                else
                    log.warn(PluginUtil.canonicalPath(mapXml) + " is exists, skip create, you can delete it and regenerate");
            }

        } catch (Exception exception) {
            exception.printStackTrace();
            throw exception;
        }

        return answer;
    }

    @Override
    public List contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) {

        List answer = new ArrayList<>();

        try {
            this.generateAdditionalJavaFiles(introspectedTable, answer);
        } catch (Exception exception) {
            exception.printStackTrace();
            throw exception;
        }

        return answer;
    }

    /**
     * 添加mapper
     *
     * @param interfaze
     * @param topLevelClass
     * @param introspectedTable
     * @return
     */
    @SneakyThrows
    @Override
    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        boolean generated = true;

        String recordType = introspectedTable.getBaseRecordType();
        String modelName = recordType.substring(recordType.lastIndexOf(".") + 1);

        //
        //interface SysUserMapper extends Mapper, BaseMapper {
        if (stringHasValue(baseMapper)) {
            interfaze.addImportedType(new FullyQualifiedJavaType(baseMapper));
            interfaze.addImportedType(new FullyQualifiedJavaType(recordType));

            //
            interfaze.addImportedType(introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType());
            String bs = baseMapper + String.format("<%s, %s>", modelName, introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType().getFullyQualifiedName());
            interfaze.addSuperInterface(new FullyQualifiedJavaType(bs));
        }

        //ADD listQuery
        String modelMethodQuery = (String) introspectedTable.getAttribute("modelMethodQuery");
        String modelMethodResult = (String) introspectedTable.getAttribute("modelMethodResult");
        if (StringUtils.isNotBlank(modelMethodQuery) && StringUtils.isNotBlank(modelMethodResult)) {
            interfaze.addImportedType(new FullyQualifiedJavaType(modelMethodQuery));
            interfaze.addImportedType(new FullyQualifiedJavaType(modelMethodResult));
            interfaze.addImportedType(new FullyQualifiedJavaType("java.util.List"));
            //
            Method listQuery = new Method("listQuery");
            listQuery.addParameter(new Parameter(new FullyQualifiedJavaType(modelMethodQuery), "query"));
            listQuery.setReturnType(new FullyQualifiedJavaType("List<" + modelMethodResult + ">"));
            //
            interfaze.addMethod(listQuery);

        }

        //已有文件检查
        String targetPackage = context.getJavaClientGeneratorConfiguration().getTargetPackage();
        String targetProject = context.getJavaClientGeneratorConfiguration().getTargetProject();
        recordType = introspectedTable.getBaseRecordType();
        String fileName = recordType.substring(recordType.lastIndexOf(".") + 1) + "Mapper.java";

        //已存在检查
        generated = PluginUtil.canWrite(targetProject, targetPackage, fileName);
        if (!generated)
            log.warn(PluginUtil.canonicalPath(targetProject, targetPackage, fileName) + " is exists, skip create, you can delete it and regenerate");

        //
        return generated;
    }

    @SneakyThrows
    private void generateAdditionalJavaFiles(IntrospectedTable introspectedTable, List answer) {

        recordType = introspectedTable.getBaseRecordType();
        modelName = recordType.substring(recordType.lastIndexOf(".") + 1);
        model = new FullyQualifiedJavaType(recordType);
        serviceName = PluginUtil.serviceName(introspectedTable, servicePackage, servicePrefix, serviceSuffix);
        serviceImplName = PluginUtil.serviceImplName(introspectedTable, serviceImplPackage, servicePrefix, serviceSuffix);

        //
        GeneratedJavaFile face = generateServiceInterface(introspectedTable);
        if (PluginUtil.canWrite(face))
            answer.add(face);
        else
            log.warn(PluginUtil.canonicalPath(face) + " is exists, skip create, you can delete it and regenerate");

        GeneratedJavaFile impl = generateServiceImpl(introspectedTable);
        if (PluginUtil.canWrite(impl))
            answer.add(impl);
        else
            log.warn(PluginUtil.canonicalPath(impl) + " is exists, skip create, you can delete it and regenerate");
    }

    private GeneratedXmlFile generateMapperXml(IntrospectedTable introspectedTable) {
        String tableName = introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime();

        //
        Document document = new Document(this.mapperPublic, this.mapperSystem);
        XmlElement root = new XmlElement("mapper");
        root.addAttribute(new Attribute("namespace", this.mapperNS));
        document.setRootElement(root);

        //
        document.getRootElement().addElement(new TextElement(""));

        //
        XmlElement list = new XmlElement("select");
        list.addAttribute(new Attribute("id", "list"));
        list.addAttribute(new Attribute("resultType", introspectedTable.getBaseRecordType()));
        list.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));
        list.addElement(new TextElement(String.format(
                "SELECT\n" +
                        "    \n" +
                        "    FROM %s\n" +
                        "    \n" +
                        "       \n" +
                        "    \n" +
                        "    ORDER BY %s DESC",
                tableName,
                MyBatis3FormattingUtilities.getEscapedColumnName(introspectedTable.getPrimaryKeyColumns().get(0))
        )));
        document.getRootElement().addElement(list);

        //
        String modelMethodQuery = (String) introspectedTable.getAttribute("modelMethodQuery");
        String modelMethodResult = (String) introspectedTable.getAttribute("modelMethodResult");
        if (StringUtils.isNotBlank(modelMethodQuery) && StringUtils.isNotBlank(modelMethodResult)) {
            document.getRootElement().addElement(new TextElement(""));

            //
            list = new XmlElement("select");
            list.addAttribute(new Attribute("id", "listQuery"));
            list.addAttribute(new Attribute("resultType", modelMethodResult));
            list.addAttribute(new Attribute("parameterType", modelMethodQuery));
            list.addElement(new TextElement("SELECT"));
            list.addElement(new TextElement(""));
            list.addElement(new TextElement("FROM " + tableName));
            list.addElement(buildIndexWhere(introspectedTable));
            String keyName = MyBatis3FormattingUtilities.getEscapedColumnName(introspectedTable.getPrimaryKeyColumns().get(0));
            list.addElement(new TextElement("ORDER BY " + keyName + " DESC"));

            //
            document.getRootElement().addElement(list);
        }

        //
        String fileName = modelName + "Mapper.xml";
        String targetPackage = "";
        boolean isMergeable = true;
        GeneratedXmlFile gf = new GeneratedXmlFile(document, fileName, targetPackage, this.mapperTargetProject, isMergeable, context.getXmlFormatter());
        return gf;
    }


    // 生成service接口
    private GeneratedJavaFile generateServiceInterface(IntrospectedTable introspectedTable) {
        FullyQualifiedJavaType service = new FullyQualifiedJavaType(serviceName);

        Interface serviceInterface = new Interface(service);
        serviceInterface.setVisibility(JavaVisibility.PUBLIC);

        // 添加父接口
        if (stringHasValue(baseService)) {
            serviceInterface.addImportedType(new FullyQualifiedJavaType(baseService));
            serviceInterface.addImportedType(new FullyQualifiedJavaType(recordType));
            //
            serviceInterface.addImportedType(introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType());
            String bs = this.baseService + String.format("<%s, %s>", modelName, introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType().getFullyQualifiedName());
            serviceInterface.addSuperInterface(new FullyQualifiedJavaType(bs));
        }

        // 包导入
        serviceInterface.addImportedType(model);

        //
        String modelMethodQuery = (String) introspectedTable.getAttribute("modelMethodQuery");
        String modelMethodResult = (String) introspectedTable.getAttribute("modelMethodResult");
        if (StringUtils.isNotBlank(modelMethodQuery) && StringUtils.isNotBlank(modelMethodResult)) {
            serviceInterface.addImportedType(new FullyQualifiedJavaType(modelMethodQuery));
            serviceInterface.addImportedType(new FullyQualifiedJavaType(modelMethodResult));
            serviceInterface.addImportedType(new FullyQualifiedJavaType("com.github.pagehelper.PageInfo"));
            //
            Method method = new Method("listQuery");
            method.addParameter(new Parameter(new FullyQualifiedJavaType(modelMethodQuery), "query"));
            method.setReturnType(new FullyQualifiedJavaType("PageInfo<" + modelMethodResult + ">"));
            method.addParameter(new Parameter(new FullyQualifiedJavaType("int"), "pageIndex"));
            method.addParameter(new Parameter(new FullyQualifiedJavaType("int"), "pageSize"));
            serviceInterface.addMethod(method);
            //
            method = new Method("listOne");
            method.addParameter(new Parameter(new FullyQualifiedJavaType(modelMethodQuery), "query"));
            method.setReturnType(new FullyQualifiedJavaType(modelMethodResult));
            serviceInterface.addMethod(method);
        }

        //
        GeneratedJavaFile gjf = new GeneratedJavaFile(serviceInterface, targetProject, context.getJavaFormatter());

        //
        return gjf;
    }

    // 生成serviceImpl实现类
    private GeneratedJavaFile generateServiceImpl(IntrospectedTable introspectedTable) {
        FullyQualifiedJavaType service = new FullyQualifiedJavaType(serviceName);
        FullyQualifiedJavaType serviceImpl = new FullyQualifiedJavaType(serviceImplName);
        TopLevelClass clazz = new TopLevelClass(serviceImpl);
        //描述类的作用域修饰符
        clazz.setVisibility(JavaVisibility.PUBLIC);
        //描述类 引入的类
        clazz.addImportedType(service);

        // 包导入
        clazz.addImportedType(model);
        clazz.addImportedType(new FullyQualifiedJavaType("java.util.List"));

        //描述类 的实现接口类
        clazz.addSuperInterface(service);
        if (stringHasValue(baseServiceClass)) {
            clazz.addImportedType(baseServiceClass);
            clazz.addImportedType(recordType);

            //
            clazz.addImportedType(introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType());
            String bs = this.baseServiceClass + String.format("<%s, %s>", modelName, introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType().getFullyQualifiedName());
            clazz.setSuperClass(new FullyQualifiedJavaType(bs));
        }
        clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Service"));
        clazz.addAnnotation("@Service");

        //
        String daoFieldType = introspectedTable.getMyBatis3JavaMapperType();
        String daoFieldName = "mapper";
        //描述类的成员属性
        Field daoField = new Field(daoFieldName, new FullyQualifiedJavaType(daoFieldType));
        clazz.addImportedType(new FullyQualifiedJavaType(daoFieldType));
        clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.beans.factory.annotation.Autowired"));
        clazz.addImportedType(new FullyQualifiedJavaType("lombok.Getter"));
        //描述成员属性 的注解
        daoField.addAnnotation("@Autowired");
        daoField.addAnnotation("@Getter");
        //描述成员属性修饰符
        daoField.setVisibility(JavaVisibility.PRIVATE);
        clazz.addField(daoField);

        //
        String modelMethodQuery = (String) introspectedTable.getAttribute("modelMethodQuery");
        String modelMethodResult = (String) introspectedTable.getAttribute("modelMethodResult");
        if (StringUtils.isNotBlank(modelMethodQuery) && StringUtils.isNotBlank(modelMethodResult)) {
            clazz.addImportedType(new FullyQualifiedJavaType(modelMethodQuery));
            clazz.addImportedType(new FullyQualifiedJavaType(modelMethodResult));
            clazz.addImportedType(new FullyQualifiedJavaType("com.github.pagehelper.PageHelper"));
            clazz.addImportedType(new FullyQualifiedJavaType("com.github.pagehelper.PageInfo"));
            //
            Method method = new Method("listQuery");
            method.setVisibility(JavaVisibility.PUBLIC);
            method.addParameter(new Parameter(new FullyQualifiedJavaType(modelMethodQuery), "query"));
            method.setReturnType(new FullyQualifiedJavaType("PageInfo<" + modelMethodResult + ">"));
            method.addParameter(new Parameter(new FullyQualifiedJavaType("int"), "pageIndex"));
            method.addParameter(new Parameter(new FullyQualifiedJavaType("int"), "pageSize"));
            method.addBodyLine("PageHelper.startPage(pageIndex, pageSize);");
            method.addBodyLine("List<" + new FullyQualifiedJavaType(modelMethodResult).getShortName() + "> list = mapper.listQuery(query);");
            method.addBodyLine("return PageInfo.of(list);");
            clazz.addMethod(method);
            //
            method = new Method("listOne");
            method.setVisibility(JavaVisibility.PUBLIC);
            method.addParameter(new Parameter(new FullyQualifiedJavaType(modelMethodQuery), "query"));
            method.setReturnType(new FullyQualifiedJavaType(modelMethodResult));
            method.addBodyLine("PageHelper.startPage(1, 1, false);");
            method.addBodyLine("List<" + new FullyQualifiedJavaType(modelMethodResult).getShortName() + "> list = mapper.listQuery(query);");
            method.addBodyLine("return list.size() == 0 ? null : list.get(0);");
            clazz.addMethod(method);
        }

        //
        GeneratedJavaFile gjf2 = new GeneratedJavaFile(clazz, targetImplProject, context.getJavaFormatter());
        return gjf2;
    }

    /**
     * 添加自定义方法到mapper
     */
    @Override
    public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
        String tableName = introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime();

        //All_Column_List
        this.addAllColumnElement(document.getRootElement(), introspectedTable);

        //list
        this.addAllWhere(document.getRootElement(), introspectedTable);
        //list
        this.addAllSet(document.getRootElement(), introspectedTable);

        //loadByIds
        XmlElement loadByIds = new XmlElement("select");
        loadByIds.addAttribute(new Attribute("id", "loadByIds"));
        //loadByIds.addAttribute(new Attribute("resultMap", "BaseResultMap"));
        loadByIds.addAttribute(new Attribute("resultType", introspectedTable.getBaseRecordType()));
        loadByIds.addElement(new TextElement(String.format(
                "SELECT\n" +
                        "    \n" +
                        "    FROM %s\n" +
                        "    \n" +
                        "        \n" +
                        "            \n" +
                        "                %s IN \n" +
                        "                #{id}\n" +
                        "            \n" +
                        "            \n" +
                        "                1 = 0\n" +
                        "            \n" +
                        "        \n" +
                        "    ",
                tableName,
                introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName()
        )));
        document.getRootElement().addElement(loadByIds);

        //loadByNotIds
        XmlElement loadByNotIds = new XmlElement("select");
        loadByNotIds.addAttribute(new Attribute("id", "loadByNotIds"));
        // loadByNotIds.addAttribute(new Attribute("resultMap", "BaseResultMap"));
        loadByNotIds.addAttribute(new Attribute("resultType", introspectedTable.getBaseRecordType()));
        loadByNotIds.addElement(new TextElement(String.format(
                "SELECT\n" +
                        "    \n" +
                        "    FROM %s\n" +
                        "    \n" +
                        "        \n" +
                        "            \n" +
                        "                %s NOT IN \n" +
                        "                #{id}\n" +
                        "            \n" +
                        "            \n" +
                        "                1 = 0\n" +
                        "            \n" +
                        "        \n" +
                        "    ",
                tableName,
                introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName()
        )));
        document.getRootElement().addElement(loadByNotIds);

        //deleteByIds
        XmlElement deleteByIds = new XmlElement("delete");
        deleteByIds.addAttribute(new Attribute("id", "deleteByIds"));
        deleteByIds.addElement(new TextElement(String.format(
                "DELETE FROM %s \n" +
                        "    \n" +
                        "        \n" +
                        "            \n" +
                        "                %s IN \n" +
                        "                #{id}\n" +
                        "            \n" +
                        "            \n" +
                        "                1 = 0\n" +
                        "            \n" +
                        "        \n" +
                        "    ",
                tableName,
                introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName()
        )));
        document.getRootElement().addElement(deleteByIds);

        //deleteByNotIds
        XmlElement deleteByNotIds = new XmlElement("delete");
        deleteByNotIds.addAttribute(new Attribute("id", "deleteByNotIds"));
        deleteByNotIds.addElement(new TextElement(String.format(
                "DELETE FROM %s \n" +
                        "    \n" +
                        "        \n" +
                        "            \n" +
                        "                %s NOT IN \n" +
                        "                #{id}\n" +
                        "            \n" +
                        "            \n" +
                        "                1 = 0\n" +
                        "            \n" +
                        "        \n" +
                        "    ",
                tableName,
                introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName()
        )));
        document.getRootElement().addElement(deleteByNotIds);

        //暂存,以便后扩展XML生成
        this.mapperPublic = document.getPublicId();
        this.mapperSystem = document.getSystemId();
        for (Attribute attribute : document.getRootElement().getAttributes()) {
            if (attribute.getName().equals("namespace")) {
                this.mapperNS = attribute.getValue();
                break;
            }
        }

        //
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }

    private void addInsertElement(XmlElement element, IntrospectedTable introspectedTable) {
        XmlElement list = new XmlElement("sql");
        list.addAttribute(new Attribute("id", "insertColumn"));

        /*
        
    insert into A
    
      
        B,
      
      
        C,
      
      
        D
       
    
    
      
        #{b,jdbcType=INTEGER},
      
      
        #{c,jdbcType=VARCHAR},
      
      
        #{d,jdbcType=BIT},
      
    
  
        * */
        //element.addElement(list);
    }

    private void addAllColumnElement(XmlElement element, IntrospectedTable introspectedTable) {
        XmlElement list = new XmlElement("sql");
        list.addAttribute(new Attribute("id", "All_Column_List"));

        // blob
//        list.addElement(new TextElement(""));
//        if (introspectedTable.hasBLOBColumns()) {
//            list.addElement(new TextElement(","));
//            list.addElement(new TextElement(""));
//        }

        int indent = 4;
        List allColumns = introspectedTable.getAllColumns();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < allColumns.size(); i++) {
            IntrospectedColumn column = allColumns.get(i);
            //
//            if ((i + 1) % 10 == 0) {
//                list.addElement(new TextElement(buffer.toString()));
//                buffer = new StringBuffer();
//            }
            //
            if ((buffer.length() + column.getActualColumnName().length() + 2 + indent) >= 100) {
                list.addElement(new TextElement(buffer.toString()));
                buffer = new StringBuffer();
            }
            buffer.append(column.getActualColumnName()).append(", ");
        }
        if (buffer.length() > 0) {
            list.addElement(new TextElement(buffer.toString().substring(0, buffer.length() - 2)));
        }
        element.addElement(list);
    }

    private void addAllSet(XmlElement element, IntrospectedTable introspectedTable) {
        //
        XmlElement sql = new XmlElement("sql");
        sql.addAttribute(new Attribute("id", "setAll"));

        //循环拼接条件列
        for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {

            //跳过主键
            boolean isPK = false;
            for (IntrospectedColumn primaryKeyColumn : introspectedTable.getPrimaryKeyColumns()) {
                if (primaryKeyColumn.getActualColumnName().equals(introspectedColumn.getActualColumnName())) {
                    isPK = true;
                    break;
                }
            }

            if (isPK) {
                //跳过主键
                continue;
            }

            if (introspectedColumn.isAutoIncrement()) {
                //跳过自增
                continue;
            }

            // 拼接 if
            XmlElement notNullElement = new XmlElement("if");
            StringBuilder sb = new StringBuilder();

            // java对象字段
            sb.append(introspectedColumn.getJavaProperty());
            sb.append(" != null ");
            notNullElement.addAttribute(new Attribute("test", sb.toString()));
            sb.setLength(0);

            sb.append(MyBatis3FormattingUtilities
                    .getEscapedColumnName(introspectedColumn));
            sb.append(" = ");
            sb.append(MyBatis3FormattingUtilities
                    .getParameterClause(introspectedColumn));

            sb.append(",");
            notNullElement.addElement(new TextElement(sb.toString()));

            sql.addElement(notNullElement);
        }

        //
        element.addElement(sql);
    }

    private void addAllWhere(XmlElement element, IntrospectedTable introspectedTable) {
        //
        XmlElement list = new XmlElement("sql");
        list.addAttribute(new Attribute("id", "whereAll"));

        //循环拼接条件列
        for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
            // 拼接 if
            XmlElement notNullElement = new XmlElement("if");
            StringBuilder sb = new StringBuilder();

            // java对象字段
            sb.append(introspectedColumn.getJavaProperty());
            sb.append(" != null ");

            // 字符型 增加 and column != ''
            // introspectedColumn.isJdbcCharacterColumn()
            if (introspectedColumn.isStringColumn()) {
                sb.append("and ");

                // java对象字段
                sb.append(introspectedColumn.getJavaProperty());
                sb.append(" != '' ");
            }
            notNullElement.addAttribute(new Attribute("test", sb.toString()));
            sb.setLength(0);

            sb.append(" AND ");
            sb.append(MyBatis3FormattingUtilities
                    .getEscapedColumnName(introspectedColumn));
            sb.append(" = ");
            sb.append(MyBatis3FormattingUtilities
                    .getParameterClause(introspectedColumn));
            notNullElement.addElement(new TextElement(sb.toString()));
            list.addElement(notNullElement);
        }

        element.addElement(list);
    }

    @SneakyThrows
    private XmlElement buildIndexWhere(IntrospectedTable introspectedTable) {
        XmlElement element = new XmlElement("where");

        //
        Set nameSet = PluginUtil.getIndexColumns(introspectedTable);

        if (nameSet.size() == 0) {
            element.addElement(new TextElement(""));
            element.addElement(new TextElement("1 = 0"));
            return element;
        }

        // JavaBeansUtil.getCamelCaseString(column.getIndexType(), false)

        //
//        keySet.addAll(introspectedTable.getPrimaryKeyColumns());
//        keySet.addAll(introspectedTable.getIndex);
        List keySet = new ArrayList<>();
        for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
            if (nameSet.contains(introspectedColumn.getActualColumnName())) {
                keySet.add(introspectedColumn);
            }
        }

        //循环拼接条件列
        for (IntrospectedColumn introspectedColumn : keySet) {
            // 拼接 if
            XmlElement notNullElement = new XmlElement("if");
            StringBuilder sb = new StringBuilder();

            // java对象字段
            sb.append(introspectedColumn.getJavaProperty());
            sb.append(" != null ");

            // 字符型 增加 and column != ''
            // introspectedColumn.isJdbcCharacterColumn()
            if (introspectedColumn.isStringColumn()) {
                sb.append("and ");

                // java对象字段
                sb.append(introspectedColumn.getJavaProperty());
                sb.append(" != '' ");
            }
            notNullElement.addAttribute(new Attribute("test", sb.toString()));
            sb.setLength(0);

            sb.append(" AND ");
            sb.append(MyBatis3FormattingUtilities
                    .getEscapedColumnName(introspectedColumn));
            sb.append(" = ");
            sb.append(MyBatis3FormattingUtilities
                    .getParameterClause(introspectedColumn));
            notNullElement.addElement(new TextElement(sb.toString()));
            //
            element.addElement(notNullElement);
        }

        //
        return element;
    }

//    private void addListElement(XmlElement element, IntrospectedTable introspectedTable) {
//        //
//        XmlElement list = new XmlElement("select");
//
//        list.addAttribute(new Attribute("id", "list"));
//        list.addAttribute(new Attribute("resultMap", introspectedTable.getBaseResultMapId()));
//        list.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));
//        list.addElement(new TextElement("SELECT"));
//        list.addElement(new TextElement(""));
//
//        // 是否有blob字段
////        if (introspectedTable.hasBLOBColumns()) {
////            answer.addElement(new TextElement(",")); //$NON-NLS-1$
////            answer.addElement(getBlobColumnListElement());
////        }
//
//        list.addElement(new TextElement("FROM " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
//        XmlElement whereXmlElement = new XmlElement("where");
//        list.addElement(whereXmlElement);
//
//        whereXmlElement.addElement(new TextElement(" 1=1 "));
//
//        //循环拼接条件列
//        for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
//            // 拼接 if
//            XmlElement selectNotNullElement = new XmlElement("if");
//            StringBuilder sb = new StringBuilder();
//
//            // java对象字段
//            sb.append(introspectedColumn.getJavaProperty());
//            sb.append(" != null ");
//
//            // 字符型 增加 and column != ''
//            if (introspectedColumn.isJdbcCharacterColumn()) {
//                sb.append("and ");
//
//                // java对象字段
//                sb.append(introspectedColumn.getJavaProperty());
//                sb.append(" != '' ");
//            }
//            selectNotNullElement.addAttribute(new Attribute("test", sb.toString()));
//            sb.setLength(0);
//
//            sb.append(" AND ");
//            sb.append(MyBatis3FormattingUtilities
//                    .getEscapedColumnName(introspectedColumn));
//            sb.append(" = ");
//            sb.append(MyBatis3FormattingUtilities
//                    .getParameterClause(introspectedColumn));
//            selectNotNullElement.addElement(new TextElement(sb.toString()));
//            whereXmlElement.addElement(selectNotNullElement);
//        }
//
//        element.addElement(list);
//    }

    @Override
    public boolean clientCountByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapCountByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapExampleWhereClauseElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientDeleteByExampleMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean clientUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapUpdateByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean sqlMapUpdateByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerCountByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerDeleteByExampleMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerInsertSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerUpdateByExampleSelectiveMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerUpdateByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

    @Override
    public boolean providerUpdateByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        return false;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy