admin
2021-06-30 d577762cafe94d9399d77cb4c6955ab176ff35ef
src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
@@ -1,16 +1,20 @@
package org.yeshi.utils.generater.mybatis;
import java.beans.Transient;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.yeshi.utils.generater.entity.MybatisColumnData;
public class MyBatisMapperUtil {
   private static String basePath = "D:/mybatis";
@@ -48,15 +52,91 @@
      return "";
   }
    private static List<MybatisColumnData> createMapperDaoQuery(int importPosition, StringBuffer buffer, Class<?> clz) {
        List<MybatisColumnData> queryColumnData = new ArrayList<>();
        buffer.append("public static class DaoQuery{");
        buffer.append("\n\t");
        Field[] fields = clz.getDeclaredFields();
        Set<String> imports = new HashSet<>();
        for (Field fd : fields) {
            String property = fd.getName();
            Annotation[] as = fd.getAnnotations();
            String columnName = fd.getName();
            for (Annotation a : as) {
                if (a instanceof Transient || a instanceof org.springframework.data.annotation.Transient) {
                    property = null;
                    break;
                }
                if (a instanceof Column) {
                    columnName = ((Column) a).name();
                }
            }
            String type = null;
            if (property != null) {
                //加
                String genericType = fd.getGenericType().getTypeName();
                if (genericType.indexOf(".") > -1) {
                    imports.add(genericType);
                    type = genericType.split("\\.")[genericType.split("\\.").length - 1];
                } else {
                    type = genericType;
                }
                if (type.equalsIgnoreCase("Date")) {
                    String tempProperty = "min" + property.substring(0, 1).toUpperCase() + property.substring(1);
                    buffer.append(String.format("\tpublic %s %s", type, tempProperty));
                    queryColumnData.add(new MybatisColumnData(columnName, tempProperty, type));
                    buffer.append("\n\t");
                    tempProperty = "max" + property.substring(0, 1).toUpperCase() + property.substring(1);
                    buffer.append(String.format("\tpublic %s %s", type, tempProperty));
                    queryColumnData.add(new MybatisColumnData(columnName, tempProperty, type));
                    buffer.append("\n\t");
                } else {
                    buffer.append(String.format("\tpublic %s %s", type, property));
                    queryColumnData.add(new MybatisColumnData(columnName, property, type));
                    buffer.append("\n\t");
                }
            }
        }
        buffer.append("\tpublic long start;");
        buffer.append("\n\t");
        buffer.append("\tpublic int count;");
        buffer.append("\n\t");
        buffer.append("\tpublic List<String> sortList;");
        buffer.append("\n\t");
        buffer.append("}");
        buffer.append("\n");
        imports.add("org.apache.ibatis.annotations.Param");
        for (String im : imports) {
            buffer.insert(importPosition, "\n" + String.format("import %s;", im));
        }
        return queryColumnData;
    }
   public static void createMapper(Class<?> clz) {
      // 生成mapper java文件
      String pks = getDaoPackageName(clz);
      StringBuffer buffer = new StringBuffer("package " + pks + ";");
        int importPosition = buffer.length();
      buffer.append("\n\n");
      buffer.append("import " + clz.getName() + ";");
      buffer.append("\n\n");
      buffer.append(String.format("public interface %sMapper extends BaseMapper<%s> {", clz.getSimpleName(),clz.getSimpleName()));
      buffer.append("\n\n\t");
        buffer.append(String.format("%s selectByPrimaryKeyForUpdate(@Param(\"id\") id);",clz.getSimpleName()));
        buffer.append("\n\n\t");
        buffer.append(String.format("List<%s> list(@Param(\"query\") query);", clz.getSimpleName()));
        buffer.append("\n\n\t");
        buffer.append("long count(@Param(\"query\") query);");
        buffer.append("\n\n\t");
        List<MybatisColumnData> queryColumnData = createMapperDaoQuery(importPosition, buffer, clz);
      buffer.append("}");
      String daoName = String.format("%sMapper.java", clz.getSimpleName());
      String daoPath = basePath + "/dao/" + daoName;
@@ -170,8 +250,53 @@
         select.addText(String.format("from %s where %s = #{%s,jdbcType=BIGINT} for update", tableName, idKeys.column,
               idKeys.attribute));
            //添加sql
            sql = root.addElement("sql");
            sql.addAttribute("id", "listWhereSQL");
            for (MybatisColumnData columnData : queryColumnData) {
                org.dom4j.Element ife = sql.addElement("if");
                ife.addAttribute("test", String.format("query.%s!=null", columnData.getProperty()));
                if (columnData.getType().equalsIgnoreCase("Date")) {
                    if (columnData.getProperty().startsWith("min"))
                        ife.addText(String.format("AND %s >= #{query.%s}", columnData.getColumn(), columnData.getProperty()));
                    else
                        ife.addText(String.format("AND   #{query.%s} > %s", columnData.getProperty(), columnData.getColumn()));
                } else {
                    ife.addText(String.format("AND %s = #{query.%s}", columnData.getColumn(), columnData.getProperty()));
                }
            }
            //批量查询
            select = root.addElement("select");
            select.addAttribute("id", "list");
            select.addAttribute("resultMap", "BaseResultMap");
            select.addText("select");
            include = select.addElement("include");
            include.addAttribute("refid", "Base_Column_List");
            select.addText(String.format("from %s where 1=1", tableName));
            include = select.addElement("include");
            include.addAttribute("refid", "listWhereSQL");
            org.dom4j.Element ife = select.addElement("if");
            ife.addAttribute("test", "query.sortList!=null");
            org.dom4j.Element foreach = ife.addElement("foreach");
            foreach.addAttribute("collection", "query.sortList");
            foreach.addAttribute("item", "item");
            foreach.addAttribute("open", " order by ");
            foreach.addAttribute("separator", ",");
            foreach.addText(" #{item}");
            select.addText("limit #{query.start},#{query.count}");
            //批量计数
            select = root.addElement("select");
            select.addAttribute("id", "count");
            select.addAttribute("resultType", "java.lang.Long");
            select.addText(String.format(" select count(*) from %s where 1=1", tableName));
            include = select.addElement("include");
            include.addAttribute("refid", "listWhereSQL");
         org.dom4j.Element delete = root.addElement("delete");
         delete.addAttribute("id", "deleteByPrimaryKey");