From d577762cafe94d9399d77cb4c6955ab176ff35ef Mon Sep 17 00:00:00 2001
From: admin <2780501319@qq.com>
Date: 星期三, 30 六月 2021 02:36:59 +0800
Subject: [PATCH] Mybatis自动化代码生成优化

---
 src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java |  647 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 386 insertions(+), 261 deletions(-)

diff --git a/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java b/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
index b8bcbfb..8487d86 100644
--- a/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
@@ -1,319 +1,444 @@
 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";
+    private static String basePath = "D:/mybatis";
 
-	static {
-		// 鍒涘缓宸ヤ綔鐩綍
-		if (!new File(basePath).exists())
-			new File(basePath).mkdirs();
-	}
+    static {
+        // 鍒涘缓宸ヤ綔鐩綍
+        if (!new File(basePath).exists())
+            new File(basePath).mkdirs();
+    }
 
-	// 鑾峰彇dao鎵�鍦ㄧ殑鍖呭悕
-	private static String getDaoPackageName(Class<?> bean) {
-		String name = bean.getName();
-		String[] ns = name.split("\\.");
-		if (ns.length > 2) {
-			String pks = "";
-			for (int i = 0; i < ns.length - 2; i++) {
-				pks += ns[i] + ".";
-			}
-			return pks + "dao";
-		}
-		return "";
-	}
+    // 鑾峰彇dao鎵�鍦ㄧ殑鍖呭悕
+    private static String getDaoPackageName(Class<?> bean) {
+        String name = bean.getName();
+        String[] ns = name.split("\\.");
+        if (ns.length > 2) {
+            String pks = "";
+            for (int i = 0; i < ns.length - 2; i++) {
+                pks += ns[i] + ".";
+            }
+            return pks + "dao";
+        }
+        return "";
+    }
 
-	private static String getMapperPackageName(Class<?> bean) {
-		String name = bean.getName();
-		String[] ns = name.split("\\.");
-		if (ns.length > 2) {
-			String pks = "";
-			for (int i = 0; i < ns.length - 2; i++) {
-				pks += ns[i] + ".";
-			}
-			return pks + "mapper";
-		}
-		return "";
-	}
+    private static String getMapperPackageName(Class<?> bean) {
+        String name = bean.getName();
+        String[] ns = name.split("\\.");
+        if (ns.length > 2) {
+            String pks = "";
+            for (int i = 0; i < ns.length - 2; i++) {
+                pks += ns[i] + ".";
+            }
+            return pks + "mapper";
+        }
+        return "";
+    }
 
-	public static void createMapper(Class<?> clz) {
-		// 鐢熸垚mapper java鏂囦欢
-		String pks = getDaoPackageName(clz);
-		StringBuffer buffer = new StringBuffer("package " + pks + ";");
-		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 daoName = String.format("%sMapper.java", clz.getSimpleName());
-		String daoPath = basePath + "/dao/" + daoName;
-		try {
-			if (!new File(basePath + "/dao/").exists())
-				new File(basePath + "/dao/").mkdirs();
-			if (!new File(daoPath).exists())
-				new File(daoPath).createNewFile();
-			FileOutputStream fos = new FileOutputStream(new File(daoPath));
-			PrintWriter pw = new PrintWriter(fos);
-			pw.write(buffer.toString().toCharArray());
-			pw.flush();
-			pw.close();
-			fos.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
+    private static List<MybatisColumnData> createMapperDaoQuery(int importPosition, StringBuffer buffer, Class<?> clz) {
+        List<MybatisColumnData> queryColumnData = new ArrayList<>();
 
-		/**
-		 * 鐢熸垚Mapper xml鏂囦欢
-		 */
-		// 鑾峰彇闇�瑕佹槧灏勭殑鍒�
-		List<AttributeColumnMap> keysList = new ArrayList<>();
-		Field[] fields = clz.getDeclaredFields();
-		for (Field fd : fields) {
-			Annotation[] as = fd.getAnnotations();
-			for (Annotation a : as) {
-				if (a instanceof Column) {
-					Column c = (Column) a;
-					keysList.add(new AttributeColumnMap(fd.getName(), c.name(), fd.getType().getName()));
-				}
-			}
-		}
-		String tableName = "";
-		Annotation[] as = clz.getAnnotations();
-		for (Annotation a : as) {
-			if (a instanceof Table) {
-				Table t = (Table) a;
-				tableName = t.value();
-			}
-		}
+        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();
+                }
+            }
 
-		try {
-			String mapperName = String.format("%sMapper.xml", clz.getSimpleName());
-			String mapperPath = basePath + "/mapper/" + mapperName;
+            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");
 
-			org.dom4j.Document document = DocumentHelper.createDocument();
-			document.addDocType("mapper", "-//mybatis.org//DTD Mapper 3.0//EN",
-					"http://mybatis.org/dtd/mybatis-3-mapper.dtd");
-			org.dom4j.Element root = document.addElement("mapper");
-			root.addAttribute("namespace", pks + "." + mapperName.replace(".xml", ""));
+        imports.add("org.apache.ibatis.annotations.Param");
+        for (String im : imports) {
+            buffer.insert(importPosition, "\n" + String.format("import %s;", im));
+        }
+        return queryColumnData;
+    }
 
-			org.dom4j.Element resultMap = root.addElement("resultMap");
-			resultMap.addAttribute("id", "BaseResultMap");
-			resultMap.addAttribute("type", clz.getName());
+    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");
 
-			AttributeColumnMap idKeys = getAttributeColumnMapByAttribute("id", keysList);
-			if (idKeys != null) {
-				org.dom4j.Element id = resultMap.addElement("id");
-				id.addAttribute("column", idKeys.column);
-				id.addAttribute("property", idKeys.attribute);
-				id.addAttribute("jdbcType", ColumnParseUtil.getJDBCType(idKeys.type));
-			}
+        buffer.append(String.format("%s selectByPrimaryKeyForUpdate(@Param(\"id\") id);",clz.getSimpleName()));
+        buffer.append("\n\n\t");
 
-			for (AttributeColumnMap key : keysList) {
-				if (key.attribute.equalsIgnoreCase(idKeys.attribute) || ColumnParseUtil.getJDBCType(key.type) == null)
-					continue;
-				org.dom4j.Element result = resultMap.addElement("result");
-				result.addAttribute("column", key.column);
-				result.addAttribute("property", key.attribute);
-				result.addAttribute("jdbcType", ColumnParseUtil.getJDBCType(key.type));
-			}
+        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");
 
-			// 灞炴�у�间腑鍖呭惈瀹炰綋
-			for (AttributeColumnMap key : keysList) {
-				if (ColumnParseUtil.getJDBCType(key.type) == null) {
-					Class<?> propertyClass = Class.forName(key.type);
-					String propertyMapper = getDaoPackageName(propertyClass) + "." + propertyClass.getSimpleName()
-							+ "Mapper";
-					org.dom4j.Element association = resultMap.addElement("association");
-					association.addAttribute("property", key.attribute);
-					association.addAttribute("column", key.column);
-					association.addAttribute("resultMap", propertyMapper + ".BaseResultMap");
-					key.attribute = key.attribute + ".id";
-					key.type = "java.lang.Long";
-				}
-			}
-
-			org.dom4j.Element sql = root.addElement("sql");
-			sql.addAttribute("id", "Base_Column_List");
-			sql.setText(getColumns(keysList));
-
-			org.dom4j.Element select = root.addElement("select");
-			select.addAttribute("id", "selectByPrimaryKey");
-			select.addAttribute("resultMap", "BaseResultMap");
-			select.addAttribute("parameterType", "java.lang.Long");
-			select.addText("select");
-			org.dom4j.Element include = select.addElement("include");
-			include.addAttribute("refid", "Base_Column_List");
-			select.addText(String.format("from %s where %s = #{%s,jdbcType=BIGINT}", tableName, idKeys.column,
-					idKeys.attribute));
+        List<MybatisColumnData> queryColumnData = createMapperDaoQuery(importPosition, buffer, clz);
 
 
-			select = root.addElement("select");
-			select.addAttribute("id", "selectByPrimaryKeyForUpdate");
-			select.addAttribute("resultMap", "BaseResultMap");
-			select.addAttribute("parameterType", "java.lang.Long");
-			select.addText("select");
-			 include = select.addElement("include");
-			include.addAttribute("refid", "Base_Column_List");
-			select.addText(String.format("from %s where %s = #{%s,jdbcType=BIGINT} for update", tableName, idKeys.column,
-					idKeys.attribute));
+        buffer.append("}");
+        String daoName = String.format("%sMapper.java", clz.getSimpleName());
+        String daoPath = basePath + "/dao/" + daoName;
+        try {
+            if (!new File(basePath + "/dao/").exists())
+                new File(basePath + "/dao/").mkdirs();
+            if (!new File(daoPath).exists())
+                new File(daoPath).createNewFile();
+            FileOutputStream fos = new FileOutputStream(new File(daoPath));
+            PrintWriter pw = new PrintWriter(fos);
+            pw.write(buffer.toString().toCharArray());
+            pw.flush();
+            pw.close();
+            fos.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        /**
+         * 鐢熸垚Mapper xml鏂囦欢
+         */
+        // 鑾峰彇闇�瑕佹槧灏勭殑鍒�
+        List<AttributeColumnMap> keysList = new ArrayList<>();
+        Field[] fields = clz.getDeclaredFields();
+        for (Field fd : fields) {
+            Annotation[] as = fd.getAnnotations();
+            for (Annotation a : as) {
+                if (a instanceof Column) {
+                    Column c = (Column) a;
+                    keysList.add(new AttributeColumnMap(fd.getName(), c.name(), fd.getType().getName()));
+                }
+            }
+        }
+        String tableName = "";
+        Annotation[] as = clz.getAnnotations();
+        for (Annotation a : as) {
+            if (a instanceof Table) {
+                Table t = (Table) a;
+                tableName = t.value();
+            }
+        }
+
+        try {
+            String mapperName = String.format("%sMapper.xml", clz.getSimpleName());
+            String mapperPath = basePath + "/mapper/" + mapperName;
+
+            org.dom4j.Document document = DocumentHelper.createDocument();
+            document.addDocType("mapper", "-//mybatis.org//DTD Mapper 3.0//EN",
+                    "http://mybatis.org/dtd/mybatis-3-mapper.dtd");
+            org.dom4j.Element root = document.addElement("mapper");
+            root.addAttribute("namespace", pks + "." + mapperName.replace(".xml", ""));
+
+            org.dom4j.Element resultMap = root.addElement("resultMap");
+            resultMap.addAttribute("id", "BaseResultMap");
+            resultMap.addAttribute("type", clz.getName());
+
+            AttributeColumnMap idKeys = getAttributeColumnMapByAttribute("id", keysList);
+            if (idKeys != null) {
+                org.dom4j.Element id = resultMap.addElement("id");
+                id.addAttribute("column", idKeys.column);
+                id.addAttribute("property", idKeys.attribute);
+                id.addAttribute("jdbcType", ColumnParseUtil.getJDBCType(idKeys.type));
+            }
+
+            for (AttributeColumnMap key : keysList) {
+                if (key.attribute.equalsIgnoreCase(idKeys.attribute) || ColumnParseUtil.getJDBCType(key.type) == null)
+                    continue;
+                org.dom4j.Element result = resultMap.addElement("result");
+                result.addAttribute("column", key.column);
+                result.addAttribute("property", key.attribute);
+                result.addAttribute("jdbcType", ColumnParseUtil.getJDBCType(key.type));
+            }
+
+            // 灞炴�у�间腑鍖呭惈瀹炰綋
+            for (AttributeColumnMap key : keysList) {
+                if (ColumnParseUtil.getJDBCType(key.type) == null) {
+                    Class<?> propertyClass = Class.forName(key.type);
+                    String propertyMapper = getDaoPackageName(propertyClass) + "." + propertyClass.getSimpleName()
+                            + "Mapper";
+                    org.dom4j.Element association = resultMap.addElement("association");
+                    association.addAttribute("property", key.attribute);
+                    association.addAttribute("column", key.column);
+                    association.addAttribute("resultMap", propertyMapper + ".BaseResultMap");
+                    key.attribute = key.attribute + ".id";
+                    key.type = "java.lang.Long";
+                }
+            }
+
+            org.dom4j.Element sql = root.addElement("sql");
+            sql.addAttribute("id", "Base_Column_List");
+            sql.setText(getColumns(keysList));
+
+            org.dom4j.Element select = root.addElement("select");
+            select.addAttribute("id", "selectByPrimaryKey");
+            select.addAttribute("resultMap", "BaseResultMap");
+            select.addAttribute("parameterType", "java.lang.Long");
+            select.addText("select");
+            org.dom4j.Element include = select.addElement("include");
+            include.addAttribute("refid", "Base_Column_List");
+            select.addText(String.format("from %s where %s = #{%s,jdbcType=BIGINT}", tableName, idKeys.column,
+                    idKeys.attribute));
 
 
+            select = root.addElement("select");
+            select.addAttribute("id", "selectByPrimaryKeyForUpdate");
+            select.addAttribute("resultMap", "BaseResultMap");
+            select.addAttribute("parameterType", "java.lang.Long");
+            select.addText("select");
+            include = select.addElement("include");
+            include.addAttribute("refid", "Base_Column_List");
+            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");
 
 
-			org.dom4j.Element delete = root.addElement("delete");
-			delete.addAttribute("id", "deleteByPrimaryKey");
-			delete.addAttribute("parameterType", "java.lang.Long");
-			delete.setText(String.format("delete from %s where %s = #{%s,jdbcType=BIGINT}", tableName, idKeys.column,
-					idKeys.attribute));
+            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));
 
-			org.dom4j.Element insert = root.addElement("insert");
-			insert.addAttribute("id", "insert");
-			insert.addAttribute("parameterType", clz.getName());
-			insert.addAttribute("useGeneratedKeys", "true");
-			insert.addAttribute("keyProperty", "id");
-			StringBuffer text = new StringBuffer();
-			text.append(String.format("insert into %s (", tableName));
-			text.append(getColumns(keysList));
-			text.append(")");
-			text.append(" values (");
-			for (AttributeColumnMap acm : keysList)
-				text.append(getKeyPair(acm)).append(",");
-			text.deleteCharAt(text.length() - 1);
-			text.append(")");
-			insert.setText(text.toString());
+            include = select.addElement("include");
+            include.addAttribute("refid", "listWhereSQL");
 
-			org.dom4j.Element insertSelective = root.addElement("insert");
-			insertSelective.addAttribute("id", "insertSelective");
-			insertSelective.addAttribute("parameterType", clz.getName());
-			insertSelective.addAttribute("useGeneratedKeys", "true");
-			insertSelective.addAttribute("keyProperty", "id");
-			insertSelective.addText("insert into " + tableName);
+            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}");
 
-			org.dom4j.Element trim = insertSelective.addElement("trim");
-			trim.addAttribute("prefix", "(");
-			trim.addAttribute("suffix", ")");
-			trim.addAttribute("suffixOverrides", ",");
-			for (AttributeColumnMap acm : keysList) {
-				org.dom4j.Element iff = trim.addElement("if");
-				iff.addAttribute("test",
-						(acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
-				iff.setText(acm.column + ",");
-			}
+            //鎵归噺璁℃暟
+            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");
 
-			insertSelective.addText("values");
 
-			trim = insertSelective.addElement("trim");
-			trim.addAttribute("prefix", "(");
-			trim.addAttribute("suffix", ")");
-			trim.addAttribute("suffixOverrides", ",");
-			for (AttributeColumnMap acm : keysList) {
-				org.dom4j.Element iff = trim.addElement("if");
-				iff.addAttribute("test",
-						(acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
-				iff.setText(getKeyPair(acm) + ",");
-			}
+            org.dom4j.Element delete = root.addElement("delete");
+            delete.addAttribute("id", "deleteByPrimaryKey");
+            delete.addAttribute("parameterType", "java.lang.Long");
+            delete.setText(String.format("delete from %s where %s = #{%s,jdbcType=BIGINT}", tableName, idKeys.column,
+                    idKeys.attribute));
 
-			// update
+            org.dom4j.Element insert = root.addElement("insert");
+            insert.addAttribute("id", "insert");
+            insert.addAttribute("parameterType", clz.getName());
+            insert.addAttribute("useGeneratedKeys", "true");
+            insert.addAttribute("keyProperty", "id");
+            StringBuffer text = new StringBuffer();
+            text.append(String.format("insert into %s (", tableName));
+            text.append(getColumns(keysList));
+            text.append(")");
+            text.append(" values (");
+            for (AttributeColumnMap acm : keysList)
+                text.append(getKeyPair(acm)).append(",");
+            text.deleteCharAt(text.length() - 1);
+            text.append(")");
+            insert.setText(text.toString());
 
-			org.dom4j.Element update = root.addElement("update");
-			update.addAttribute("id", "updateByPrimaryKey");
-			update.addAttribute("parameterType", clz.getName());
-			text = new StringBuffer(String.format("update %s set ", tableName));
-			for (AttributeColumnMap acm : keysList) {
-				if (acm.attribute.equalsIgnoreCase(idKeys.attribute))
-					continue;
-				text.append(String.format("%s = #{%s,jdbcType=%s}", acm.column, acm.attribute,
-						ColumnParseUtil.getJDBCType(acm.type))).append(",");
-			}
-			text.deleteCharAt(text.length() - 1);
+            org.dom4j.Element insertSelective = root.addElement("insert");
+            insertSelective.addAttribute("id", "insertSelective");
+            insertSelective.addAttribute("parameterType", clz.getName());
+            insertSelective.addAttribute("useGeneratedKeys", "true");
+            insertSelective.addAttribute("keyProperty", "id");
+            insertSelective.addText("insert into " + tableName);
 
-			text.append(String.format(" where %s = #{%s,jdbcType=%s}", idKeys.column, idKeys.attribute,
-					ColumnParseUtil.getJDBCType(idKeys.type)));
+            org.dom4j.Element trim = insertSelective.addElement("trim");
+            trim.addAttribute("prefix", "(");
+            trim.addAttribute("suffix", ")");
+            trim.addAttribute("suffixOverrides", ",");
+            for (AttributeColumnMap acm : keysList) {
+                org.dom4j.Element iff = trim.addElement("if");
+                iff.addAttribute("test",
+                        (acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
+                iff.setText(acm.column + ",");
+            }
 
-			update.setText(text.toString());
+            insertSelective.addText("values");
 
-			// updateSelective
-			org.dom4j.Element updateSelective = root.addElement("update");
-			updateSelective.addAttribute("id", "updateByPrimaryKeySelective");
-			updateSelective.addAttribute("parameterType", clz.getName());
-			updateSelective.addText("update " + tableName);
-			org.dom4j.Element set = updateSelective.addElement("set");
+            trim = insertSelective.addElement("trim");
+            trim.addAttribute("prefix", "(");
+            trim.addAttribute("suffix", ")");
+            trim.addAttribute("suffixOverrides", ",");
+            for (AttributeColumnMap acm : keysList) {
+                org.dom4j.Element iff = trim.addElement("if");
+                iff.addAttribute("test",
+                        (acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
+                iff.setText(getKeyPair(acm) + ",");
+            }
 
-			for (AttributeColumnMap acm : keysList) {
-				if (acm.attribute.equalsIgnoreCase(idKeys.attribute))
-					continue;
-				org.dom4j.Element iff = set.addElement("if");
-				iff.addAttribute("test",
-						(acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
-				iff.setText(acm.column + "=" + getKeyPair(acm) + ",");
-			}
+            // update
 
-			updateSelective.addText(String.format(" where %s = #{%s,jdbcType=%s}", idKeys.column, idKeys.attribute,
-					ColumnParseUtil.getJDBCType(idKeys.type)));
+            org.dom4j.Element update = root.addElement("update");
+            update.addAttribute("id", "updateByPrimaryKey");
+            update.addAttribute("parameterType", clz.getName());
+            text = new StringBuffer(String.format("update %s set ", tableName));
+            for (AttributeColumnMap acm : keysList) {
+                if (acm.attribute.equalsIgnoreCase(idKeys.attribute))
+                    continue;
+                text.append(String.format("%s = #{%s,jdbcType=%s}", acm.column, acm.attribute,
+                        ColumnParseUtil.getJDBCType(acm.type))).append(",");
+            }
+            text.deleteCharAt(text.length() - 1);
 
-			// 鍒涘缓mapper鏂囦欢
+            text.append(String.format(" where %s = #{%s,jdbcType=%s}", idKeys.column, idKeys.attribute,
+                    ColumnParseUtil.getJDBCType(idKeys.type)));
 
-			if (!new File(basePath + "/mapper/").exists())
-				new File(basePath + "/mapper/").mkdirs();
-			if (!new File(mapperPath).exists())
-				new File(mapperPath).createNewFile();
+            update.setText(text.toString());
 
-			XMLWriter writer = new XMLWriter(new FileOutputStream(new File(mapperPath)),
-					OutputFormat.createPrettyPrint());
-			writer.setEscapeText(false);// 瀛楃鏄惁杞箟,榛樿true
-			writer.write(document);
-			writer.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
+            // updateSelective
+            org.dom4j.Element updateSelective = root.addElement("update");
+            updateSelective.addAttribute("id", "updateByPrimaryKeySelective");
+            updateSelective.addAttribute("parameterType", clz.getName());
+            updateSelective.addText("update " + tableName);
+            org.dom4j.Element set = updateSelective.addElement("set");
 
-	private static AttributeColumnMap getAttributeColumnMapByAttribute(String attributeName,
-			List<AttributeColumnMap> list) {
-		for (AttributeColumnMap acm : list)
-			if (acm.attribute.equalsIgnoreCase(attributeName))
-				return acm;
-		return null;
-	}
+            for (AttributeColumnMap acm : keysList) {
+                if (acm.attribute.equalsIgnoreCase(idKeys.attribute))
+                    continue;
+                org.dom4j.Element iff = set.addElement("if");
+                iff.addAttribute("test",
+                        (acm.attribute.indexOf(".") > -1 ? acm.attribute.split("\\.")[0] : acm.attribute) + " != null");
+                iff.setText(acm.column + "=" + getKeyPair(acm) + ",");
+            }
 
-	private static String getColumns(List<AttributeColumnMap> list) {
-		String columns = "";
-		for (AttributeColumnMap map : list)
-			columns += map.column + ",";
-		return columns.length() > 0 ? columns.substring(0, columns.length() - 1) : columns;
-	}
+            updateSelective.addText(String.format(" where %s = #{%s,jdbcType=%s}", idKeys.column, idKeys.attribute,
+                    ColumnParseUtil.getJDBCType(idKeys.type)));
 
-	private static String getKeyPair(AttributeColumnMap map) {
-		return String.format("#{%s,jdbcType=%s}", map.attribute, ColumnParseUtil.getJDBCType(map.type));
-	}
+            // 鍒涘缓mapper鏂囦欢
+
+            if (!new File(basePath + "/mapper/").exists())
+                new File(basePath + "/mapper/").mkdirs();
+            if (!new File(mapperPath).exists())
+                new File(mapperPath).createNewFile();
+
+            XMLWriter writer = new XMLWriter(new FileOutputStream(new File(mapperPath)),
+                    OutputFormat.createPrettyPrint());
+            writer.setEscapeText(false);// 瀛楃鏄惁杞箟,榛樿true
+            writer.write(document);
+            writer.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static AttributeColumnMap getAttributeColumnMapByAttribute(String attributeName,
+                                                                       List<AttributeColumnMap> list) {
+        for (AttributeColumnMap acm : list)
+            if (acm.attribute.equalsIgnoreCase(attributeName))
+                return acm;
+        return null;
+    }
+
+    private static String getColumns(List<AttributeColumnMap> list) {
+        String columns = "";
+        for (AttributeColumnMap map : list)
+            columns += map.column + ",";
+        return columns.length() > 0 ? columns.substring(0, columns.length() - 1) : columns;
+    }
+
+    private static String getKeyPair(AttributeColumnMap map) {
+        return String.format("#{%s,jdbcType=%s}", map.attribute, ColumnParseUtil.getJDBCType(map.type));
+    }
 
 }
 
 class AttributeColumnMap {
-	String attribute;
-	String column;
-	String type;
+    String attribute;
+    String column;
+    String type;
 
-	public AttributeColumnMap(String attribute, String column, String type) {
-		this.attribute = attribute;
-		this.column = column;
-		this.type = type;
-	}
+    public AttributeColumnMap(String attribute, String column, String type) {
+        this.attribute = attribute;
+        this.column = column;
+        this.type = type;
+    }
 
-	public AttributeColumnMap() {
+    public AttributeColumnMap() {
 
-	}
+    }
 }

--
Gitblit v1.8.0