| | |
| | | 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"; |
| | |
| | | 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; |
| | |
| | | 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"); |