admin
2021-06-30 d577762cafe94d9399d77cb4c6955ab176ff35ef
Mybatis自动化代码生成优化
1个文件已删除
2个文件已修改
1个文件已添加
177 ■■■■■ 已修改文件
src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/generater/GeneratorTest.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils.iml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java
New file
@@ -0,0 +1,38 @@
package org.yeshi.utils.generater.entity;
public class MybatisColumnData {
    private String column;
    private String property;
    private String type;
    public MybatisColumnData(String column, String property, String type) {
        this.column = column;
        this.property = property;
        this.type = type;
    }
    public String getColumn() {
        return column;
    }
    public void setColumn(String column) {
        this.column = column;
    }
    public String getProperty() {
        return property;
    }
    public void setProperty(String property) {
        this.property = property;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}
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");
src/test/java/com/generater/GeneratorTest.java
@@ -3,25 +3,35 @@
import org.springframework.data.annotation.Id;
import org.yeshi.utils.generater.SpringComponentGenerater;
import org.yeshi.utils.generater.entity.MongoDBDaoData;
import org.yeshi.utils.generater.mybatis.Column;
import org.yeshi.utils.generater.mybatis.MyBatisMapperUtil;
import org.yeshi.utils.generater.mybatis.Table;
import java.util.Date;
public class GeneratorTest {
    public static void main(String[] args) throws Exception {
        SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(BaseDao.class).setDaoPackageName("com.generator.result").setEntityClass(Entity.class).create(), "D:\\workspace\\server\\utils\\src\\test\\java\\com\\generater\\result");
        //SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(BaseDao.class).setDaoPackageName("com.generator.result").setEntityClass(Entity.class).create(), "D:\\workspace\\server\\utils\\src\\test\\java\\com\\generater\\result");
        MyBatisMapperUtil.createMapper(Entity.class);
    }
    @Table("tb_test")
    public static class Entity {
        @Id
        @Column(name = "id")
        private String id;
        @Column(name = "`name`")
        private String name;
        @Column(name = "`age`")
        private Integer age;
        @Column(name = "create_time")
        private Date createTime;
        public String getId() {
            return id;
        }
utils.iml
File was deleted