From 664cc2fd39177fd3daa6d3988396c704d130882c Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期二, 12 十月 2021 19:06:55 +0800
Subject: [PATCH] 自动化代码生成优化

---
 src/main/java/org/yeshi/utils/bean/BeanUtil.java                                       |   36 +
 src/main/resources/generater/service/method/impl/mybatis/delete.ftl                    |    4 
 src/main/resources/generater/service/method/impl/mybatis/save.ftl                      |   12 
 src/main/resources/generater/service/service.template                                  |    2 
 src/main/resources/generater/service/method/impl/mybatis/add.ftl                       |    7 
 src/main/resources/generater/service/method/impl/mongo/save.ftl                        |    6 
 src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java                  |   14 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormHttpRequestInfoVO.java       |    2 
 src/test/java/com/generater/TestEntity2.java                                           |  136 +++++
 src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java           |    1 
 src/main/java/org/yeshi/utils/generater/vo/service/ServiceMetodInfoVO.java             |    2 
 src/main/resources/generater/exception.template                                        |   11 
 src/main/java/org/yeshi/utils/generater/vo/service/ServiceImplInfoVO.java              |  214 +++++++
 src/main/resources/generater/service/method/impl/mybatis/updateSlective.ftl            |    7 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormInputRegexVerifyVO.java      |    2 
 src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java                          |    4 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java            |    2 
 src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java                       |   95 +-
 src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java                  |   78 ++
 src/main/resources/generater/admin/adminController.template                            |   61 +-
 src/main/resources/generater/service/method/impl/mongo/updateSlective.ftl              |    7 
 src/main/resources/generater/dao/mybatisDBDao.template                                 |   34 +
 src/main/resources/generater/dao/mybatisDBXML.ftl                                      |  143 +++++
 src/main/resources/generater/service/method/impl/mongo/selectByPrimaryKey.ftl          |    4 
 src/main/resources/generater/service/serviceImpl.template                              |    7 
 src/main/resources/generater/dao/mongoDBDao.template                                   |   92 +++
 src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java                  |   50 -
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java               |    2 
 src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java |   39 +
 src/main/resources/generater/service/method/impl/mongo/list.ftl                        |    7 
 src/main/resources/generater/service/method/impl/mybatis/list.ftl                      |    7 
 src/main/java/org/yeshi/utils/generater/util/EntityUtil.java                           |   31 +
 src/main/resources/generater/service/method/impl/mongo/delete.ftl                      |    4 
 src/test/java/com/generater/GeneratorTest.java                                         |  110 +++
 src/main/java/org/yeshi/utils/generater/entity/DaoQueryColumnData.java                 |   22 
 src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java                 |   10 
 src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java                     |  208 +++++++
 src/test/java/com/generater/TestEntity.java                                            |    2 
 src/main/resources/generater/service/method/impl/mongo/count.ftl                       |    5 
 /dev/null                                                                              |    2 
 src/test/java/com/generater/Test.java                                                  |    0 
 src/main/resources/generater/service/method/impl/mybatis/selectByPrimaryKey.ftl        |    2 
 src/main/resources/generater/service/method/impl/mongo/add.ftl                         |   13 
 src/main/resources/generater/service/method/impl/mybatis/count.ftl                     |    5 
 src/main/java/org/yeshi/utils/generater/annotation/admin/AdminController.java          |    2 
 src/main/java/org/yeshi/utils/generater/vo/ExceptionVO.java                            |   69 ++
 src/main/java/org/yeshi/utils/generater/entity/MapperQueryColumnData.java              |   36 +
 src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java                  |    2 
 48 files changed, 1,422 insertions(+), 189 deletions(-)

diff --git a/src/main/java/org/yeshi/utils/bean/BeanUtil.java b/src/main/java/org/yeshi/utils/bean/BeanUtil.java
new file mode 100644
index 0000000..ff80cfa
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/bean/BeanUtil.java
@@ -0,0 +1,36 @@
+package org.yeshi.utils.bean;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: BeanUtil
+ * @description: TODO
+ * @date 2021/10/11 14:01
+ */
+public class BeanUtil {
+
+    //澶嶅埗灞炴��
+    public static Object copyProperties(Object source, Object target) throws IllegalAccessException {
+        Map<String, Field> targetFieldMap = new HashMap<>();
+        Field[] fs = target.getClass().getDeclaredFields();
+        for (Field field : fs) {
+            targetFieldMap.put(field.getName(), field);
+        }
+        fs = source.getClass().getDeclaredFields();
+        for (Field field : fs) {
+            if (targetFieldMap.get(field.getName()) == null)
+                continue;
+            //鑾峰彇瀵硅薄鐨勫睘鎬у��
+            field.setAccessible(true);
+            Object resultValue = field.get(source);
+            targetFieldMap.get(field.getName()).setAccessible(true);
+            targetFieldMap.get(field.getName()).set(target, resultValue);
+        }
+        return target;
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java b/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
index 7b17272..f8d9302 100644
--- a/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
+++ b/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
@@ -1,56 +1,6 @@
 package org.yeshi.utils.generater;
 
-import org.yeshi.utils.FreemarkerUtils;
-import org.yeshi.utils.generater.entity.ExceptionData;
-import org.yeshi.utils.generater.entity.MongoDBDaoData;
-import org.yeshi.utils.generater.vo.ServiceInfoVO;
-
-import java.io.File;
-
 public class SpringComponentGenerater {
-
-    /**
-     * 鍒涘缓mongodb鐨刣ao
-     *
-     * @param data
-     * @param targetDir
-     * @throws Exception
-     */
-    public static void createMongoDao(MongoDBDaoData data, String targetDir) throws Exception {
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/mongoDBDao.template"), new File(targetDir, data.getDaoName() + ".java").getAbsolutePath(), data);
-    }
-
-    /**
-     * 鍒涘缓鏈嶅姟
-     *
-     * @param data
-     * @param targetDir
-     * @throws Exception
-     */
-    public static void createService(ServiceInfoVO data, String targetDir) throws Exception {
-
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/service/service.template"), new File(targetDir, data.getServiceClassName() + ".java").getAbsolutePath(), data);
-    }
-
-    /**
-     * 鍒涘缓鏈嶅姟瀹炵幇
-     *
-     * @param data
-     * @param targetDir
-     * @throws Exception
-     */
-    public static void createServiceImpl(ServiceInfoVO data, String targetDir) throws Exception {
-
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/service/serviceImpl.template"), new File(targetDir, data.getServiceClassName() + "Impl.java").getAbsolutePath(), data);
-    }
-
-
-
-    public static void createException(ExceptionData data, String targetDir) throws Exception {
-
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("exception.template"), new File(targetDir, data.getEntityClassName() + "Exception.java").getAbsolutePath(), data);
-    }
-
 
 
 }
diff --git a/src/main/java/org/yeshi/utils/generater/annotation/admin/AdminController.java b/src/main/java/org/yeshi/utils/generater/annotation/admin/AdminController.java
index 0e40e8a..19d1453 100644
--- a/src/main/java/org/yeshi/utils/generater/annotation/admin/AdminController.java
+++ b/src/main/java/org/yeshi/utils/generater/annotation/admin/AdminController.java
@@ -35,6 +35,8 @@
     //榛樿寮�鍚垎椤�
     boolean page() default true;
 
+    boolean jsonp() default false;
+
     Class searchForm() default Void.class;
 
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
index d241acc..14af015 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
@@ -13,7 +13,7 @@
 
     public ClassInfo(String name, String clazz) {
         this.name = name;
-        this.clazz = clazz;
+        this.clazz = clazz.replace("$",".");
     }
 
     public String getName() {
@@ -29,6 +29,6 @@
     }
 
     public void setClazz(String clazz) {
-        this.clazz = clazz;
+        this.clazz = clazz.replace("$",".");
     }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/DaoQueryColumnData.java b/src/main/java/org/yeshi/utils/generater/entity/DaoQueryColumnData.java
index 35a3e97..d025f33 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/DaoQueryColumnData.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/DaoQueryColumnData.java
@@ -7,9 +7,19 @@
     //鏌ヨ鏂瑰紡
     private DaoQueryCondition.QueryType queryType;
 
-    public DaoQueryColumnData(String columnName, String type, DaoQueryCondition.QueryType queryType) {
-        super(columnName, type);
+    //閽堝鐨勫垪
+    private MybatisColumnData columnData;
+
+
+    public DaoQueryColumnData(String property, String type, DaoQueryCondition.QueryType queryType) {
+        super(property, type);
         this.queryType = queryType;
+    }
+
+    public DaoQueryColumnData(String property, MybatisColumnData columnData, String type, DaoQueryCondition.QueryType queryType) {
+        super(property, type);
+        this.queryType = queryType;
+        this.columnData = columnData;
     }
 
 
@@ -20,4 +30,12 @@
     public void setQueryType(DaoQueryCondition.QueryType queryType) {
         this.queryType = queryType;
     }
+
+    public MybatisColumnData getColumnData() {
+        return columnData;
+    }
+
+    public void setColumnData(MybatisColumnData columnData) {
+        this.columnData = columnData;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java b/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java
deleted file mode 100644
index 4b99e47..0000000
--- a/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.yeshi.utils.generater.entity;
-
-public class ExceptionData extends BaseData {
-    private String baseClass;
-    private String baseClassName;
-    private String entityClassName;
-
-    public static class Builder {
-        private Class baseClass;
-        private String packageName;
-        private Class entityClass;
-
-        public Builder setBaseClass(Class baseClass) {
-            this.baseClass = baseClass;
-            return this;
-        }
-
-        public Builder setPackageName(String packageName) {
-            this.packageName = packageName;
-            return this;
-        }
-
-        public Builder setEntityClass(Class entityClass) {
-            this.entityClass = entityClass;
-            return this;
-        }
-
-        public ExceptionData build() {
-            ExceptionData data = new ExceptionData();
-            data.setBaseClass(baseClass.getName());
-            data.setBaseClassName(baseClass.getSimpleName());
-            data.setEntityClass(entityClass.getName());
-            data.setEntityClassName(entityClass.getSimpleName());
-            data.setPackageName(packageName);
-            return data;
-        }
-    }
-
-    public String getBaseClass() {
-        return baseClass;
-    }
-
-    public void setBaseClass(String baseClass) {
-        this.baseClass = baseClass;
-    }
-
-    public String getBaseClassName() {
-        return baseClassName;
-    }
-
-    public void setBaseClassName(String baseClassName) {
-        this.baseClassName = baseClassName;
-    }
-
-    public String getEntityClassName() {
-        return entityClassName;
-    }
-
-    public void setEntityClassName(String entityClassName) {
-        this.entityClassName = entityClassName;
-    }
-}
diff --git a/src/main/java/org/yeshi/utils/generater/entity/MapperQueryColumnData.java b/src/main/java/org/yeshi/utils/generater/entity/MapperQueryColumnData.java
new file mode 100644
index 0000000..4bfa72b
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/entity/MapperQueryColumnData.java
@@ -0,0 +1,36 @@
+package org.yeshi.utils.generater.entity;
+
+import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+
+public class MapperQueryColumnData {
+
+    //鏌ヨ鏂瑰紡
+    private DaoQueryCondition.QueryType queryType;
+    private String property;
+    private MybatisColumnData column;
+
+
+    public DaoQueryCondition.QueryType getQueryType() {
+        return queryType;
+    }
+
+    public void setQueryType(DaoQueryCondition.QueryType queryType) {
+        this.queryType = queryType;
+    }
+
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    public MybatisColumnData getColumn() {
+        return column;
+    }
+
+    public void setColumn(MybatisColumnData column) {
+        this.column = column;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java b/src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java
index 935cff1..26f0e49 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java
@@ -4,12 +4,16 @@
 
     private String column;
     private String property;
+    //jdbcType
     private String type;
 
-    public MybatisColumnData(String column, String property, String type) {
+    private String jdbcType;
+
+    public MybatisColumnData(String column, String property, String type, String jdbcType) {
         this.column = column;
         this.property = property;
         this.type = type;
+        this.jdbcType = jdbcType;
     }
 
     public String getColumn() {
@@ -35,4 +39,12 @@
     public void setType(String type) {
         this.type = type;
     }
+
+    public String getJdbcType() {
+        return jdbcType;
+    }
+
+    public void setJdbcType(String jdbcType) {
+        this.jdbcType = jdbcType;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java b/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
index 96eed04..480ad85 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
@@ -97,6 +97,7 @@
                 if (an instanceof AdminController) {
                     Class searchFormClass = ((AdminController) an).searchForm();
                     AdminGeneraterInfo info = new AdminGeneraterInfo();
+                    info.setEntity(entity);
                     info.setControllerData((AdminController) an);
                     info.setSearchFormRows(AnotationUtil.getFormRowData(searchFormClass));
                     info.setAddFormRows(AnotationUtil.getFormRowData(entity));
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 e649018..e8427d3 100644
--- a/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
@@ -86,15 +86,15 @@
                 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));
+                    queryColumnData.add(new MybatisColumnData(columnName, tempProperty, type,ColumnParseUtil.getJDBCType(genericType)));
                     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));
+                    queryColumnData.add(new MybatisColumnData(columnName, tempProperty, type,ColumnParseUtil.getJDBCType(genericType)));
                     buffer.append("\n\t");
                 } else {
                     buffer.append(String.format("\tpublic %s %s;", type, property));
-                    queryColumnData.add(new MybatisColumnData(columnName, property, type));
+                    queryColumnData.add(new MybatisColumnData(columnName, property, type,ColumnParseUtil.getJDBCType(genericType)));
                     buffer.append("\n\t");
                 }
             }
@@ -115,6 +115,8 @@
         return queryColumnData;
     }
 
+
+
     public static void createMapper(Class<?> clz) {
         // 鐢熸垚mapper java鏂囦欢
         String pks = getDaoPackageName(clz);
@@ -127,7 +129,7 @@
         buffer.append("\n\n\t");
 
         //TODO 纭畾ID绫诲瀷
-        buffer.append(String.format("%s selectByPrimaryKeyForUpdate(@Param(\"id\") Long id);",clz.getSimpleName()));
+        buffer.append(String.format("%s selectByPrimaryKeyForUpdate(@Param(\"id\") Long id);", clz.getSimpleName()));
         buffer.append("\n\n\t");
 
         buffer.append(String.format("List<%s> list(@Param(\"query\") DaoQuery query);", clz.getSimpleName()));
diff --git a/src/main/java/org/yeshi/utils/generater/util/EntityUtil.java b/src/main/java/org/yeshi/utils/generater/util/EntityUtil.java
new file mode 100644
index 0000000..8d15295
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/util/EntityUtil.java
@@ -0,0 +1,31 @@
+package org.yeshi.utils.generater.util;
+
+import org.springframework.data.annotation.Id;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+
+/**
+ * @author Administrator
+ * @title: EntityUtil
+ * @description: 瀹炰綋甯姪绫�
+ * @date 2021/10/11 12:13
+ */
+public class EntityUtil {
+
+    //鑾峰彇涓婚敭ID
+    public static Field getIdentifyId(Class clazz) {
+        Field[] fs = clazz.getDeclaredFields();
+        for (Field fd : fs) {
+            Annotation[] as = fd.getAnnotations();
+            if (as != null)
+                for (Annotation a : as) {
+                    if (a instanceof Id) {
+                        return fd;
+                    }
+                }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ExceptionVO.java b/src/main/java/org/yeshi/utils/generater/vo/ExceptionVO.java
new file mode 100644
index 0000000..85eac0a
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/ExceptionVO.java
@@ -0,0 +1,69 @@
+package org.yeshi.utils.generater.vo;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.entity.BaseData;
+import org.yeshi.utils.generater.entity.ClassInfo;
+
+import javax.annotation.Nullable;
+
+/**
+ * @author Administrator
+ * @title: ExceptionVO
+ * @description: 鑷畾涔夊紓甯歌緭鍑�
+ * @date 2021/10/12 10:30
+ */
+public class ExceptionVO extends BaseData {
+
+    private ClassInfo base;
+
+    public static class Builder {
+        private ClassInfo base;
+        private Class entity;
+        private String packageName;
+
+
+        public Builder setBase(@Nullable ClassInfo base) {
+            this.base = base;
+            return this;
+        }
+
+        public Builder setEntity(Class entity) {
+            this.entity = entity;
+            return this;
+        }
+
+        public Builder setPackageName(String packageName) {
+            this.packageName = packageName;
+            return this;
+        }
+
+        public ExceptionVO build() throws Exception {
+            if (entity == null) {
+                throw new Exception("entity涓嶈兘涓虹┖");
+            }
+
+            if (this.base == null) {
+                this.base = new ClassInfo(Exception.class.getSimpleName(), Exception.class.getName());
+            }
+
+            if (StringUtil.isNullOrEmpty(packageName)) {
+                throw new Exception("packageName涓嶈兘涓虹┖");
+            }
+
+            ExceptionVO vo = new ExceptionVO();
+            vo.setBase(base);
+            vo.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
+            vo.setPackageName(packageName);
+            return vo;
+        }
+    }
+
+
+    public ClassInfo getBase() {
+        return base;
+    }
+
+    public void setBase(ClassInfo base) {
+        this.base = base;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java
deleted file mode 100644
index a731968..0000000
--- a/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.yeshi.utils.generater.vo;
-
-import org.yeshi.utils.generater.entity.BaseData;
-import org.yeshi.utils.generater.entity.ClassInfo;
-
-import java.util.List;
-
-public class ServiceImplInfoVO extends BaseData {
-    private ClassInfo service;
-    private ClassInfo dao;
-
-    //鏂规硶鍒楄〃
-    private List<ServiceMetodInfoVO> metodInfoList;
-
-
-    public static class Builder {
-        private Class entityClass;
-        private String packageName;
-        private Class daoClass;
-        private Class serviceClass;
-
-        public Builder setServiceClass(Class serviceClass) {
-            this.serviceClass = serviceClass;
-            return this;
-        }
-
-        public Builder setEntityClass(Class entityClass) {
-            this.entityClass = entityClass;
-            return this;
-        }
-
-        public Builder setPackageName(String packageName) {
-            this.packageName = packageName;
-            return this;
-        }
-
-        public Builder setDaoClass(Class daoClass) {
-            this.daoClass = daoClass;
-            return this;
-        }
-
-        public ServiceImplInfoVO build() {
-            ServiceImplInfoVO serviceData = new ServiceImplInfoVO();
-            serviceData.setEntity(entityClass);
-            serviceData.setEntity(new ClassInfo(entityClass.getSimpleName(), entityClass.getName()));
-            serviceData.setPackageName(packageName);
-            return serviceData;
-        }
-
-    }
-
-    public ClassInfo getService() {
-        return service;
-    }
-
-    public void setService(ClassInfo service) {
-        this.service = service;
-    }
-
-    public ClassInfo getDao() {
-        return dao;
-    }
-
-    public void setDao(ClassInfo dao) {
-        this.dao = dao;
-    }
-
-    @Override
-    public ClassInfo getEntity() {
-        return entity;
-    }
-
-    @Override
-    public void setEntity(ClassInfo entity) {
-        this.entity = entity;
-    }
-
-    public List<ServiceMetodInfoVO> getMetodInfoList() {
-        return metodInfoList;
-    }
-
-    public void setMetodInfoList(List<ServiceMetodInfoVO> metodInfoList) {
-        this.metodInfoList = metodInfoList;
-    }
-}
-
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
similarity index 79%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
index 41ba237..baf35ef 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
@@ -1,19 +1,9 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.controller;
 
 import org.yeshi.utils.StringUtil;
-import org.yeshi.utils.generater.annotation.admin.form.Select;
-import org.yeshi.utils.generater.annotation.admin.form.Text;
-import org.yeshi.utils.generater.annotation.admin.form.TextArea;
 import org.yeshi.utils.generater.entity.ClassInfo;
-import org.yeshi.utils.generater.entity.KeyValue;
 import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
-import org.yeshi.utils.generater.entity.admin.FormRowData;
-import org.yeshi.utils.generater.entity.admin.FormVerifyType;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.yeshi.utils.generater.util.EntityUtil;
 
 /**
  * @author Administrator
@@ -28,6 +18,9 @@
     private ClassInfo entity;
     private ClassInfo service;
     private ClassInfo query;
+    private boolean jsonp;
+    //涓婚敭绫诲瀷
+    private String identifyIdType;
 
 
     public static class Builder {
@@ -77,9 +70,11 @@
             AdminControllerInfoVO vo = new AdminControllerInfoVO();
             vo.setMapping(generaterInfo.getControllerData().mapping());
             vo.setEntity(new ClassInfo(generaterInfo.getEntity().getSimpleName(), generaterInfo.getEntity().getName()));
+            vo.setJsonp(generaterInfo.getControllerData().jsonp());
             vo.setPackageName(packageName);
             vo.setQueryVO(query);
             vo.setService(service);
+            vo.setIdentifyIdType(EntityUtil.getIdentifyId(generaterInfo.getEntity()).getType().getSimpleName());
             return vo;
         }
 
@@ -125,4 +120,24 @@
     public void setQueryVO(ClassInfo query) {
         this.query = query;
     }
+
+    public void setQuery(ClassInfo query) {
+        this.query = query;
+    }
+
+    public boolean isJsonp() {
+        return jsonp;
+    }
+
+    public void setJsonp(boolean jsonp) {
+        this.jsonp = jsonp;
+    }
+
+    public String getIdentifyIdType() {
+        return identifyIdType;
+    }
+
+    public void setIdentifyIdType(String identifyIdType) {
+        this.identifyIdType = identifyIdType;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
similarity index 98%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
index 70f16c3..049eb12 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.page;
 
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.generater.annotation.admin.form.Select;
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormHttpRequestInfoVO.java
similarity index 95%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/page/FormHttpRequestInfoVO.java
index 216a4d6..f2e804e 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormHttpRequestInfoVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.page;
 
 
 import java.util.Map;
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormInputRegexVerifyVO.java
similarity index 92%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/page/FormInputRegexVerifyVO.java
index 5162e26..4a93e3f 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormInputRegexVerifyVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.page;
 
 /**
  * @author Administrator
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
similarity index 98%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
index ece31e3..ffaf0ea 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.page;
 
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.generater.annotation.admin.form.Select;
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
similarity index 99%
rename from src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
index 2cfdeeb..26febb4 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo.admin;
+package org.yeshi.utils.generater.vo.admin.page;
 
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.generater.annotation.admin.form.Select;
diff --git a/src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java b/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
similarity index 71%
rename from src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java
rename to src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
index 21637a9..d214ea5 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
@@ -1,8 +1,12 @@
-package org.yeshi.utils.generater.entity;
+package org.yeshi.utils.generater.vo.dao;
 
 import org.springframework.data.annotation.Id;
 import org.springframework.data.annotation.Transient;
 import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+import org.yeshi.utils.generater.entity.BaseData;
+import org.yeshi.utils.generater.entity.ClassInfo;
+import org.yeshi.utils.generater.entity.ColumnData;
+import org.yeshi.utils.generater.entity.DaoQueryColumnData;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
@@ -11,11 +15,11 @@
 import java.util.List;
 import java.util.Set;
 
-public class MongoDBDaoData extends BaseData {
+public class MongoDBDaoVO extends BaseData {
 
     private String daoName;
-    private String baseDaoClassName;
-    private String entityClassName;
+    private ClassInfo baseDao;
+    private ClassInfo entity;
     private Set<String> importClasses;
 
     private ColumnData identityColumn;
@@ -25,43 +29,41 @@
 
     public static class Builder {
 
-        private Class baseDaoClass;
+        private ClassInfo baseDao;
+        private Class entity;
+        private ClassInfo dao;
 
-        private Class entityClass;
-
-        private String daoPackageName;
-
-        private String daoName;
-
-
-        public Builder setBaseDaoClass(Class clazz) {
-            this.baseDaoClass = clazz;
+        public Builder setBaseDao(ClassInfo baseDao) {
+            this.baseDao = baseDao;
             return this;
         }
 
-        public Builder setEntityClass(Class clazz) {
-            this.entityClass = clazz;
+        public Builder setEntity(Class entity) {
+            this.entity = entity;
             return this;
         }
 
-        public Builder setDaoPackageName(String daoPackageName) {
-            this.daoPackageName = daoPackageName;
+        public Builder setDao(ClassInfo dao) {
+            this.dao = dao;
             return this;
         }
 
-        public Builder setDaoName(String daoName) {
-            this.daoName = daoName;
-            return this;
-        }
+        public MongoDBDaoVO build() throws Exception {
 
-
-        public MongoDBDaoData create() {
-
-            if (daoName == null) {
-                daoName = entityClass.getSimpleName() + "Dao";
+            if (entity == null) {
+                throw new Exception("entity涓嶈兘涓虹┖");
             }
 
-            Field[] fields = entityClass.getDeclaredFields();
+            if (baseDao == null) {
+                throw new Exception("baseDao涓嶈兘涓虹┖");
+            }
+
+            if (dao == null) {
+                throw new Exception("dao涓嶈兘涓虹┖");
+            }
+
+
+            Field[] fields = entity.getDeclaredFields();
             String identityColumnName = null;
             String identityColumnType = null;
             List<ColumnData> columlist = new ArrayList<>();
@@ -71,12 +73,9 @@
                 if (fd.getModifiers() != 1 && fd.getModifiers() != 2) {
                     continue;
                 }
-
                 String columName = fd.getName();
                 String columnDataType = fd.getGenericType().getTypeName();
                 Annotation[] as = fd.getAnnotations();
-
-
                 if (columName != null) {
                     for (Annotation a : as) {
                         //涓婚敭
@@ -130,18 +129,17 @@
             importClasses.add("java.util.ArrayList");
 
 
-            MongoDBDaoData data = new MongoDBDaoData();
-            data.setBaseDaoClassName(baseDaoClass.getSimpleName());
+            MongoDBDaoVO data = new MongoDBDaoVO();
+            data.setBaseDao(baseDao);
             data.setColumnDataList(columnDataList);
             data.setDaoQueryColumnDataList(daoQueryColumnList);
-            data.setDaoName(daoName);
-            data.setEntityClass(entityClass.getName());
-            data.setEntityClassName(entityClass.getSimpleName());
+            data.setDaoName(dao.getName());
+            data.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
             data.setIdentityColumn(new ColumnData(identityColumnName, identityColumnType));
-            data.setPackageName(daoPackageName);
+            data.setPackageName(dao.getClazz().replace("." + dao.getName(), ""));
 
-            importClasses.add(baseDaoClass.getName());
-            importClasses.add(entityClass.getName());
+            importClasses.add(baseDao.getClazz());
+            importClasses.add(entity.getName());
             data.setImportClasses(importClasses);
 
             return data;
@@ -157,22 +155,23 @@
         this.daoName = daoName;
     }
 
-    public String getBaseDaoClassName() {
-        return baseDaoClassName;
+    public ClassInfo getBaseDao() {
+        return baseDao;
     }
 
-    public void setBaseDaoClassName(String baseDaoClassName) {
-        this.baseDaoClassName = baseDaoClassName;
+    public void setBaseDao(ClassInfo baseDao) {
+        this.baseDao = baseDao;
     }
 
-    public String getEntityClassName() {
-        return entityClassName;
+    @Override
+    public ClassInfo getEntity() {
+        return entity;
     }
 
-    public void setEntityClassName(String entityClassName) {
-        this.entityClassName = entityClassName;
+    @Override
+    public void setEntity(ClassInfo entity) {
+        this.entity = entity;
     }
-
 
     public ColumnData getIdentityColumn() {
         return identityColumn;
diff --git a/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java b/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
new file mode 100644
index 0000000..ee9a630
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
@@ -0,0 +1,208 @@
+package org.yeshi.utils.generater.vo.dao;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.Transient;
+import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+import org.yeshi.utils.generater.entity.*;
+import org.yeshi.utils.generater.mybatis.Column;
+import org.yeshi.utils.generater.mybatis.ColumnParseUtil;
+import org.yeshi.utils.generater.mybatis.Table;
+import org.yeshi.utils.generater.vo.ExceptionVO;
+
+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;
+
+public class MyBatisDBDaoVO extends BaseData {
+
+    private ClassInfo mapper;
+    private ClassInfo baseMapper;
+    //涓婚敭
+    private MybatisColumnData identify;
+    //灞炴��
+    private List<MybatisColumnData> columnList;
+    private List<DaoQueryColumnData> queryList;
+    private String table;
+
+    public static class Builder {
+
+        private ClassInfo baseMapper;
+        private Class entity;
+        private ClassInfo mapper;
+
+        public Builder setBaseMapper(ClassInfo baseMapper) {
+            this.baseMapper = baseMapper;
+            return this;
+        }
+
+        public Builder setEntity(Class entity) {
+            this.entity = entity;
+            return this;
+        }
+
+        public Builder setMapper(ClassInfo mapper) {
+            this.mapper = mapper;
+            return this;
+        }
+
+        //鑾峰彇table
+
+        private String getTableName(Class clz) throws Exception {
+            Annotation[] as = clz.getAnnotations();
+            for (Annotation a : as) {
+                if (a instanceof Table) {
+                    Table t = (Table) a;
+                    return t.value();
+                }
+            }
+            throw new Exception("鏈幏鍙栧埌琛ㄥ悕绉�");
+        }
+
+        public MyBatisDBDaoVO build() throws Exception {
+
+            if (entity == null) {
+                throw new Exception("entity涓嶈兘涓虹┖");
+            }
+
+            if (baseMapper == null) {
+                throw new Exception("baseMapper涓嶈兘涓虹┖");
+            }
+
+            if (mapper == null) {
+                throw new Exception("mapper涓嶈兘涓虹┖");
+            }
+
+            //鑾峰彇table鍚嶇О
+            String table = getTableName(entity);
+
+            Field[] fields = entity.getDeclaredFields();
+            MybatisColumnData identity = null;
+            List<MybatisColumnData> columlist = new ArrayList<>();
+            List<DaoQueryColumnData> daoQueryColumnList = new ArrayList<>();
+            for (Field fd : fields) {
+                //private/public 闈瀎inal锛宻tatic灞炴�ф墠浼氬弬涓庤В鏋�
+                if (fd.getModifiers() != 1 && fd.getModifiers() != 2) {
+                    continue;
+                }
+                boolean valid = true;
+
+                Annotation[] as = fd.getAnnotations();
+                for (Annotation a : as) {
+                    //涓嶅弬涓庤В鏋�
+                    if (a instanceof Transient || a instanceof java.beans.Transient) {
+                        valid = false;
+                        break;
+                    }
+                }
+
+                if (!valid) {
+                    continue;
+                }
+
+                String property = fd.getName();
+                String column = fd.getName();
+                for (Annotation a : as) {
+                    //涓嶅弬涓庤В鏋�
+                    if (a instanceof Column) {
+                        column = ((Column) a).name();
+                        break;
+                    }
+                }
+
+                MybatisColumnData columData = new MybatisColumnData(column, property, fd.getType().getSimpleName(), ColumnParseUtil.getJDBCType(fd.getType().getName()));
+
+
+                for (Annotation a : as) {
+                    //涓婚敭
+                    if (a instanceof Id) {
+                        identity = columData;
+                        valid = false;
+                        break;
+                    }
+                }
+
+                if (!valid) {
+                    continue;
+                }
+
+                columlist.add(columData);
+
+
+                //鑾峰彇鏌ヨ鏉′欢
+                for (Annotation a : as) {
+                    if (a instanceof DaoQueryCondition) {
+                        daoQueryColumnList.add(new DaoQueryColumnData(columData.getProperty(), columData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
+                        break;
+                    }
+                }
+            }
+
+            if (identity == null)
+                throw new Exception("灏氭湭鎸囧畾涓婚敭");
+
+
+            MyBatisDBDaoVO vo = new MyBatisDBDaoVO();
+            vo.setBaseMapper(baseMapper);
+            vo.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
+            vo.setIdentify(identity);
+            vo.setTable(table);
+            vo.setQueryList(daoQueryColumnList);
+            vo.setPackageName(mapper.getClazz().replace("." + mapper.getName(), ""));
+            vo.setMapper(mapper);
+            vo.setColumnList(columlist);
+            return vo;
+        }
+    }
+
+    public ClassInfo getMapper() {
+        return mapper;
+    }
+
+    public void setMapper(ClassInfo mapper) {
+        this.mapper = mapper;
+    }
+
+    public ClassInfo getBaseMapper() {
+        return baseMapper;
+    }
+
+    public void setBaseMapper(ClassInfo baseMapper) {
+        this.baseMapper = baseMapper;
+    }
+
+
+    public MybatisColumnData getIdentify() {
+        return identify;
+    }
+
+    public void setIdentify(MybatisColumnData identify) {
+        this.identify = identify;
+    }
+
+    public List<MybatisColumnData> getColumnList() {
+        return columnList;
+    }
+
+    public void setColumnList(List<MybatisColumnData> columnList) {
+        this.columnList = columnList;
+    }
+
+    public List<DaoQueryColumnData> getQueryList() {
+        return queryList;
+    }
+
+    public void setQueryList(List<DaoQueryColumnData> queryList) {
+        this.queryList = queryList;
+    }
+
+    public String getTable() {
+        return table;
+    }
+
+    public void setTable(String table) {
+        this.table = table;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/service/ServiceImplInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceImplInfoVO.java
new file mode 100644
index 0000000..0920e4f
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceImplInfoVO.java
@@ -0,0 +1,214 @@
+package org.yeshi.utils.generater.vo.service;
+
+import org.yeshi.utils.FreemarkerUtils;
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.entity.BaseData;
+import org.yeshi.utils.generater.entity.ClassInfo;
+import org.yeshi.utils.generater.util.EntityUtil;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ServiceImplInfoVO extends BaseData {
+    private ClassInfo service;
+    private ClassInfo dao;
+    //鏂规硶鍒楄〃
+    private List<ServiceMetodInfoVO> metodInfoList;
+    private ClassInfo daoQuery;
+    private ClassInfo query;
+
+
+    public static class Builder {
+        private Class entity;
+        private String packageName;
+        private ClassInfo dao;
+        private ClassInfo service;
+        private ClassInfo query;
+        private ClassInfo daoQuery;
+
+        public Builder setEntity(Class entity) {
+            this.entity = entity;
+            return this;
+        }
+
+        public Builder setPackageName(String packageName) {
+            this.packageName = packageName;
+            return this;
+        }
+
+        public Builder setDao(ClassInfo dao) {
+            this.dao = dao;
+            return this;
+        }
+
+        public Builder setService(ClassInfo service) {
+            this.service = service;
+            return this;
+        }
+
+        public Builder setQuery(ClassInfo query) {
+            this.query = query;
+            return this;
+        }
+
+        public Builder setDaoQuery(ClassInfo daoQuery) {
+            this.daoQuery = daoQuery;
+            return this;
+        }
+
+        private void validParams() throws Exception {
+            if (entity == null) {
+                throw new Exception("entity涓嶈兘涓虹┖");
+            }
+            if (packageName == null) {
+                throw new Exception("packageName涓嶈兘涓虹┖");
+            }
+            if (dao == null) {
+                throw new Exception("dao涓嶈兘涓虹┖");
+            }
+            if (service == null) {
+                throw new Exception("service涓嶈兘涓虹┖");
+            }
+            if (query == null) {
+                throw new Exception("query涓嶈兘涓虹┖");
+            }
+            if (daoQuery == null) {
+                throw new Exception("daoQuery涓嶈兘涓虹┖");
+            }
+        }
+
+        private String getMethodContentTemplatePath(String type) {
+            String basePath = "generater/service/method/impl/";
+            if (dao.getName().endsWith("Mapper")) {
+                basePath += "mybatis/";
+            } else {
+                basePath += "mongo/";
+            }
+
+            switch (type) {
+                case "list":
+                    return basePath + "list.ftl";
+                case "count":
+                    return basePath + "count.ftl";
+                case "add":
+                    return basePath + "add.ftl";
+                case "save":
+                    return basePath + "save.ftl";
+                case "get":
+                    return basePath + "selectByPrimaryKey.ftl";
+                case "update":
+                    return basePath + "updateSlective.ftl";
+                case "delete":
+                    return basePath + "delete.ftl";
+            }
+            return null;
+        }
+
+        public ServiceImplInfoVO build() throws Exception {
+            validParams();
+            Field identifyId = EntityUtil.getIdentifyId(entity);
+            if (identifyId == null) {
+                throw new Exception("灏氭湭鎵惧埌涓婚敭灞炴��");
+            }
+
+            ServiceImplInfoVO serviceData = new ServiceImplInfoVO();
+            serviceData.setDao(dao);
+            serviceData.setService(service);
+            serviceData.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
+            serviceData.setPackageName(packageName);
+            serviceData.setDaoQuery(daoQuery);
+            serviceData.setQuery(query);
+
+            //璁剧疆鎺ュ彛
+            List<ServiceMetodInfoVO> metodInfoVOList = new ArrayList<>();
+            /*******娣诲姞鏂规硶寮�濮�*******/
+            List<String> params = null;
+            ServiceMetodInfoVO metodInfo = null;
+            //list鏂规硶
+            params = new ArrayList<>();
+            params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
+            params.add(" int page");
+            params.add(" int pageSize");
+            metodInfo = new ServiceMetodInfoVO("public", String.format("List<%s>", serviceData.getEntity().getName()), "list", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("list"))));
+            metodInfoVOList.add(metodInfo);
+            //count鏂规硶
+            params = new ArrayList<>();
+            params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "long", "count", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("count"))));
+            metodInfoVOList.add(metodInfo);
+            //get鏂规硶
+            params = new ArrayList<>();
+            params.add(identifyId.getType().getSimpleName() + " id");
+            metodInfo = new ServiceMetodInfoVO("public", serviceData.getEntity().getName(), "get", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("get"))));
+            metodInfoVOList.add(metodInfo);
+            //add鏂规硶
+            params = new ArrayList<>();
+            params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "void", "add", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("add"))));
+            metodInfoVOList.add(metodInfo);
+            //update鏂规硶
+            params = new ArrayList<>();
+            params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "void", "update", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("update"))));
+            metodInfoVOList.add(metodInfo);
+            //delete鏂规硶
+            params = new ArrayList<>();
+            params.add(String.format("List<%s> idList", identifyId.getType().getSimpleName()));
+            metodInfo = new ServiceMetodInfoVO("public", String.format("void", serviceData.getEntity().getName()), "delete", StringUtil.concat(params, ","));
+            metodInfo.setContent(FreemarkerUtils.generateInputStream(serviceData, getClass().getClassLoader().getResourceAsStream(getMethodContentTemplatePath("delete"))));
+            metodInfoVOList.add(metodInfo);
+
+            /*******娣诲姞鏂规硶缁撴潫*******/
+            serviceData.setMetodInfoList(metodInfoVOList);
+            return serviceData;
+        }
+
+    }
+
+    public ClassInfo getService() {
+        return service;
+    }
+
+    public void setService(ClassInfo service) {
+        this.service = service;
+    }
+
+    public ClassInfo getDao() {
+        return dao;
+    }
+
+    public void setDao(ClassInfo dao) {
+        this.dao = dao;
+    }
+
+    public List<ServiceMetodInfoVO> getMetodInfoList() {
+        return metodInfoList;
+    }
+
+    public void setMetodInfoList(List<ServiceMetodInfoVO> metodInfoList) {
+        this.metodInfoList = metodInfoList;
+    }
+
+    public ClassInfo getDaoQuery() {
+        return daoQuery;
+    }
+
+    public void setDaoQuery(ClassInfo daoQuery) {
+        this.daoQuery = daoQuery;
+    }
+
+    public ClassInfo getQuery() {
+        return query;
+    }
+
+    public void setQuery(ClassInfo query) {
+        this.query = query;
+    }
+}
+
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
similarity index 60%
rename from src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
index 67924f7..3e7610e 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
@@ -1,9 +1,11 @@
-package org.yeshi.utils.generater.vo;
+package org.yeshi.utils.generater.vo.service;
 
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.generater.entity.BaseData;
 import org.yeshi.utils.generater.entity.ClassInfo;
+import org.yeshi.utils.generater.util.EntityUtil;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -12,6 +14,7 @@
     private ClassInfo dao;
     //鏂规硶鍒楄〃
     private List<ServiceMetodInfoVO> metodInfoList;
+    private ClassInfo query;
 
 
     public static class Builder {
@@ -48,12 +51,62 @@
         }
 
 
+        private String getRemarksLine(String content) {
+            return "\t * " + content + "\n";
+        }
+
+        //鑾峰彇鏂规硶鐨勬敞閲�
+        private String getMethodRemarks(String type) {
+            StringBuilder builder = new StringBuilder();
+            builder.append("/**\n");
+            switch (type) {
+                case "list":
+                    builder.append(getRemarksLine("鑾峰彇鍒楄〃"));
+                    builder.append(getRemarksLine("@param " + StringUtil.firstCharToLower(query.getName())));
+                    builder.append(getRemarksLine("@param page"));
+                    builder.append(getRemarksLine("@param pageSize"));
+                    builder.append(getRemarksLine("@return"));
+                    break;
+                default:
+                    builder.append(getRemarksLine(""));
+            }
+
+            builder.append("\t */");
+            return builder.toString();
+        }
+
+        private void validParams() throws Exception {
+            if (entity == null) {
+                throw new Exception("entity涓嶈兘涓虹┖");
+            }
+            if (packageName == null) {
+                throw new Exception("packageName涓嶈兘涓虹┖");
+            }
+            if (dao == null) {
+                throw new Exception("dao涓嶈兘涓虹┖");
+            }
+            if (service == null) {
+                throw new Exception("service涓嶈兘涓虹┖");
+            }
+            if (query == null) {
+                throw new Exception("query涓嶈兘涓虹┖");
+            }
+
+        }
+
+
         public ServiceInfoVO build() throws Exception {
+            validParams();
+            Field identifyId = EntityUtil.getIdentifyId(entity);
+            if (identifyId == null) {
+                throw new Exception("灏氭湭鎵惧埌涓婚敭灞炴��");
+            }
             ServiceInfoVO serviceData = new ServiceInfoVO();
             serviceData.setDao(dao);
             serviceData.setService(service);
             serviceData.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
             serviceData.setPackageName(packageName);
+            serviceData.setQuery(query);
             //璁剧疆鎺ュ彛
             List<ServiceMetodInfoVO> metodInfoVOList = new ArrayList<>();
             /*******娣诲姞鏂规硶寮�濮�*******/
@@ -62,38 +115,45 @@
             //list鏂规硶
             params = new ArrayList<>();
             params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
-            params.add("int page");
-            params.add("int pageSize");
+            params.add(" int page");
+            params.add(" int pageSize");
             metodInfo = new ServiceMetodInfoVO("public", String.format("List<%s>", serviceData.getEntity().getName()), "list", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("list"));
+
             metodInfoVOList.add(metodInfo);
             //count鏂规硶
             params = new ArrayList<>();
             params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
             metodInfo = new ServiceMetodInfoVO("public", "long", "count", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("count"));
             metodInfoVOList.add(metodInfo);
             //get鏂规硶
             params = new ArrayList<>();
-            params.add("String id");
+            params.add(identifyId.getType().getSimpleName() + " id");
             metodInfo = new ServiceMetodInfoVO("public", serviceData.getEntity().getName(), "get", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("get"));
             metodInfoVOList.add(metodInfo);
             //add鏂规硶
             params = new ArrayList<>();
             params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
             metodInfo = new ServiceMetodInfoVO("public", "void", "add", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("add"));
             metodInfoVOList.add(metodInfo);
             //update鏂规硶
             params = new ArrayList<>();
             params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
             metodInfo = new ServiceMetodInfoVO("public", "void", "update", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("update"));
             metodInfoVOList.add(metodInfo);
             //delete鏂规硶
             params = new ArrayList<>();
-            params.add("List<String> idList");
+            params.add(String.format("List<%s> idList", identifyId.getType().getSimpleName()));
             metodInfo = new ServiceMetodInfoVO("public", String.format("void", serviceData.getEntity().getName()), "delete", StringUtil.concat(params, ","));
+            metodInfo.setNote(getMethodRemarks("delete"));
             metodInfoVOList.add(metodInfo);
 
             /*******娣诲姞鏂规硶缁撴潫*******/
-
+            serviceData.setMetodInfoList(metodInfoVOList);
 
             return serviceData;
         }
@@ -124,5 +184,11 @@
         this.metodInfoList = metodInfoList;
     }
 
+    public ClassInfo getQuery() {
+        return query;
+    }
 
+    public void setQuery(ClassInfo query) {
+        this.query = query;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceMetodInfoVO.java
similarity index 96%
rename from src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java
rename to src/main/java/org/yeshi/utils/generater/vo/service/ServiceMetodInfoVO.java
index cbb7d35..b34a46d 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceMetodInfoVO.java
@@ -1,4 +1,4 @@
-package org.yeshi.utils.generater.vo;
+package org.yeshi.utils.generater.vo.service;
 
 /**
  * @author Administrator
diff --git a/src/main/resources/exception.template b/src/main/resources/exception.template
deleted file mode 100644
index 1352fe7..0000000
--- a/src/main/resources/exception.template
+++ /dev/null
@@ -1,13 +0,0 @@
-package ${packageName};
-
-import ${baseClass};
-
-public class ${entityClassName}Exception extends ${baseClassName}{
-
-
- public ${entityClassName}Exception(int code, String msg) {
-        super(code, msg);
- }
-
-
-}
diff --git a/src/main/resources/generater/admin/adminController.template b/src/main/resources/generater/admin/adminController.template
index f7d8311..6ac0695 100644
--- a/src/main/resources/generater/admin/adminController.template
+++ b/src/main/resources/generater/admin/adminController.template
@@ -22,14 +22,24 @@
 @RequestMapping("${mapping}")
 public class AdminAppController {
 
-    <#assign serviceObjName=${service.name?uncap_first}">
+    <#assign serviceObjName="${service.name?uncap_first}">
+    <#assign entityObjName="${entity.name?uncap_first}">
     @Resource
     private ${service.name} ${serviceObjName};
 
+
+    private String loadPrint(String callback, String root){
+        <#if jsonp>
+        return JsonUtil.loadJSONP(callback,root);
+        <#else>
+          return root;
+        </#if>
+    }
+
     @ResponseBody
     @RequestMapping("list")
-    public String list(${query.name} query, int page, int limit) {
-        List<${entityName}> list = ${serviceObjName}.list(query,page,limit);
+    public String list(${query.name} query, int page, int limit, String callback) {
+        List<${entity.name}> list = ${serviceObjName}.list(query,page,limit);
         long count = ${serviceObjName}.count(query);
         JSONObject data = new JSONObject();
         Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
@@ -42,60 +52,53 @@
 
         data.put("list", gson.toJson(list));
         data.put("count", count);
-        return JsonUtil.loadTrueResult(data);
+        return loadPrint(callback,JsonUtil.loadTrueResult(data));
     }
 
     @ResponseBody
     @RequestMapping("delete")
-    public String delete(String ids) {
-        JSONArray array = JSONArray.fromObject(ids);
-        List<String> idList=new ArrayList<>();
-        for (int i = 0; i < array.size(); i++) {
-            idList.add(array.optString(i));
-        }
+    public String delete(String ids, String callback) {
+        Type type = new TypeToken<List<${identifyIdType}>>(){}.get();
+        List<${identifyIdType}> idList=new Gson().from(ids,type);
         ${serviceObjName}.delete(idList);
-        return JsonUtil.loadTrueResult("");
+        return loadPrint(callback, JsonUtil.loadTrueResult(""));
     }
-
-
-
-
 
     @ResponseBody
     @RequestMapping("add")
-    public String add(${entity.name} bean, HttpSession session) {
+    public String add(${entity.name} bean, HttpSession session, String callback) {
         try{
             ${serviceObjName}.add(bean);
-            return JsonUtil.loadTrueResult("");
+            return loadPrint(callback, JsonUtil.loadTrueResult(""));
         }catch(Exception e){
-            return JsonUtil.loadFalseResult(e.getMessage);
+            return loadPrint(callback, JsonUtil.loadFalseResult(e.getMessage));
         }
     }
 
     @ResponseBody
     @RequestMapping("get")
-    public String add(String id, HttpSession session) {
-        try{
-            ${serviceObjName}.get(id);
-            return JsonUtil.loadTrueResult("");
-        }catch(Exception e){
-            return JsonUtil.loadFalseResult(e.getMessage);
+    public String get(${identifyIdType} id, HttpSession session, String callback) {
+        ${entity.name} entity = ${serviceObjName}.get(id);
+        if (entity !=null){
+            return loadPrint(callback,JsonUtil.loadTrueResult(entity));
+        } else {
+            return loadPrint(callback,JsonUtil.loadFalseResult("ID涓嶅瓨鍦�"));
         }
     }
 
 
     @ResponseBody
     @RequestMapping("update")
-    public String update(${entity.name} bean, HttpSession session) {
-        if (app.getId() == null) {
-            return JsonUtil.loadFalseResult("ID涓嶈兘涓虹┖");
+    public String update(${entity.name} bean, HttpSession session,String callback) {
+        if (bean.getId() == null) {
+            return loadPrint(callback, JsonUtil.loadFalseResult("ID涓嶈兘涓虹┖"));
         }
         try{
             ${serviceObjName}.updateSelective(bean);
         }catch(Exception e){
-            return JsonUtil.loadFalseResult(e.getMessage);
+            return loadPrint(callback,JsonUtil.loadFalseResult(e.getMessage));
         }
-        return JsonUtil.loadTrueResult("");
+        return loadPrint(callback,JsonUtil.loadTrueResult(""));
     }
 
 
diff --git a/src/main/resources/generater/dao/mongoDBDao.template b/src/main/resources/generater/dao/mongoDBDao.template
new file mode 100644
index 0000000..eeea6ba
--- /dev/null
+++ b/src/main/resources/generater/dao/mongoDBDao.template
@@ -0,0 +1,92 @@
+package ${packageName};
+
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Repository;
+
+<#list importClasses as value>
+import ${value};
+</#list>
+
+
+@Repository
+public class ${daoName} extends ${baseDao.name}<${entity.name}>{
+
+  public void updateSelective(${entity.name} bean) {
+        Query query = new Query();
+        Update update=new Update();
+        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
+        <#if columnDataList??>
+        	<#list columnDataList as value>
+        if(bean.${value.columnMehtod} != null) {
+            update.set("${value.columnName}", bean.${value.columnMehtod});
+        }
+        	</#list>
+        </#if>
+        update.set("updateTime", new Date());
+        update(query, update);
+  }
+
+
+  public List<${entity.name}> list(DaoQuery daoQuery){
+        Query query = getQuery(daoQuery);
+        if (daoQuery.sortList!=null && daoQuery.sortList.size()>0){
+            query.with(new Sort(daoQuery.sortList));
+        }
+        query.skip(daoQuery.start);
+        query.limit(daoQuery.count);
+        return findList(query);
+  }
+
+  public long count(DaoQuery daoQuery){
+        Query query=getQuery(daoQuery);
+        return count(query);
+  }
+
+  private Query getQuery(DaoQuery daoQuery){
+            List<Criteria> andList=new ArrayList<>();
+             <#list daoQueryColumnDataList as value>
+                 <#if (value.type!"") == "Date">
+                 if(daoQuery.min${value.columnName?cap_first}!=null){
+                      andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
+                 }
+                 if(daoQuery.max${value.columnName?cap_first}!=null){
+                      andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
+                 }
+                 <#else>
+                 if(daoQuery.${value.columnName}!=null){
+                   <#if (value.queryType!"") == "equal">
+                      andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
+                   <#else>
+                        andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
+                   </#if>
+                 }
+                 </#if>
+            </#list>
+            Query query=new Query();
+            Criteria[]  ands=new Criteria[andList.size()];
+            andList.toArray(ands);
+            if(ands.length>0){
+                query.addCriteria(new Criteria().andOperator(ands));
+            }
+            return query;
+  }
+
+  public static class DaoQuery{
+     <#if daoQueryColumnDataList??>
+       <#list daoQueryColumnDataList as value>
+        <#if (value.type!"") == "Date">
+        public ${value.type} min${value.columnName?cap_first};
+        public ${value.type} max${value.columnName?cap_first};
+        <#else>
+        public ${value.type} ${value.columnName};
+         </#if>
+       </#list>
+     </#if>
+        public int start;
+        public int count;
+        public List<Sort.Order> sortList;
+  }
+}
diff --git a/src/main/resources/generater/dao/mybatisDBDao.template b/src/main/resources/generater/dao/mybatisDBDao.template
new file mode 100644
index 0000000..3e7fd8a
--- /dev/null
+++ b/src/main/resources/generater/dao/mybatisDBDao.template
@@ -0,0 +1,34 @@
+package ${packageName};
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import ${baseMapper.clazz};
+import ${entity.clazz};
+
+public interface ${mapper.name} extends ${baseMapper.name}<${entity.name}> {
+
+  ${entity.name} selectByPrimaryKeyForUpdate(@Param("id") ${identify.type} id);
+
+  List<${entity.name}> list(@Param("query") DaoQuery query);
+
+  long count(@Param("query") DaoQuery query);
+
+  public static class DaoQuery{
+     <#if queryList??>
+       <#list queryList as value>
+        <#if (value.type!"") == "Date">
+        public ${value.type} min${value.columnName?cap_first};
+        public ${value.type} max${value.columnName?cap_first};
+        <#else>
+        public ${value.type} ${value.columnName};
+         </#if>
+       </#list>
+     </#if>
+        public long start;
+        public int count;
+        public List<String> sortList;
+  }
+
+}
\ No newline at end of file
diff --git a/src/main/resources/generater/dao/mybatisDBXML.ftl b/src/main/resources/generater/dao/mybatisDBXML.ftl
new file mode 100644
index 0000000..6456016
--- /dev/null
+++ b/src/main/resources/generater/dao/mybatisDBXML.ftl
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${mapper.clazz}">
+    <resultMap id="BaseResultMap"
+               type="${entity.clazz}">
+        <id column="${identify.column}" property="${identify.property}" jdbcType="${identify.jdbcType}"/>
+        <#list columnList as column>
+        <result column="${column.column}" property="${column.property}" jdbcType="${column.jdbcType}"/>
+        </#list>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        <trim suffixOverrides=",">
+        <#list columnList as column>${column.column},</#list>
+        </trim>
+    </sql>
+
+    <select id="selectByPrimaryKey" resultMap="BaseResultMap"
+            parameterType="java.lang.Long">
+        select
+        <include refid="Base_Column_List"/>
+        from ${table} where ${identify.column} = <#noparse>#{</#noparse>id, jdbcType=${identify.jdbcType}}
+    </select>
+
+    <select id="selectByPrimaryKeyForUpdate" resultMap="BaseResultMap"
+            parameterType="java.lang.Long">
+        select
+        <include refid="Base_Column_List"/>
+        from ${table} where ${identify.column} = <#noparse>#{</#noparse>id,jdbcType=${identify.jdbcType}} for update
+    </select>
+
+
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+        delete from
+        ${table} where ${identify.column} = <#noparse>#{</#noparse>id,jdbcType=${identify.jdbcType}}
+    </delete>
+    <insert id="insert"
+            parameterType="${entity.class}"
+            useGeneratedKeys="true" keyProperty="${identify.property}">
+        insert into
+        ${table}
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+        <#list columnList as column>
+            ${column.column}},
+        </#list>
+
+        </trim>
+        values
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+        <#list columnList as column>
+            <#noparse>#{</#noparse>${column.property}},jdbcType=${column.jdbcType}},
+        </#list>
+
+        </trim>
+
+    </insert>
+    <insert id="insertSelective"
+            parameterType="${entity.class}"
+            useGeneratedKeys="true" keyProperty="${identify.property}">
+        insert into ${table}
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="${identify.property} != null">${identify.column},</if>
+            <#list columnList as column>
+             <if test="${column.property} != null">${column.column},</if>
+            </#list>
+        </trim>
+        values
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="${identify.property} != null"><#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}},</if>
+            <#list columnList as column>
+             <if test="${column.property} != null"><#noparse>#{</#noparse>${column.property},jdbcType=${column.jdbcType}},</if>
+            </#list>
+        </trim>
+    </insert>
+    <update id="updateByPrimaryKey"
+            parameterType="${entity.class}">
+        update ${table}
+        <set>
+            <if test="${identify.property} != null">${identify.column} = <#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}},</if>
+              <#list columnList as column>
+                  <if test="${column.property} != null">${column.column} = <#noparse>#{</#noparse>${column.property},jdbcType=${column.jdbcType}},</if>
+              </#list>
+        </set>
+        where ${identify.column} = <#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}}
+    </update>
+    <update id="updateByPrimaryKeySelective"
+            parameterType="${entity.class}">
+        update ${table}
+        <set>
+              <#list columnList as column>
+             <if test="${column.property} != null">${column.column} = <#noparse>#{</#noparse>${column.property},jdbcType=${column.jdbcType}},</if>
+              </#list>
+        </set>
+        where ${identify.column} = <#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}}
+    </update>
+
+    <sql id="listWhere">
+        <#list queryList as query>
+        <if test="query.${query.columnName}!=null">
+            <#if query.queryType=="equal">
+                and ${query.columnData.column} = <#noparse>#{</#noparse>query.${query.columnName}}
+            </#if>
+             <#if query.queryType=="start">
+                and ${query.columnData.column} like '<#noparse>#{</#noparse>query.${query.columnName}}%'
+             </#if>
+             <#if query.queryType=="end">
+                and ${query.columnData.column} like '%<#noparse>#{</#noparse>query.${query.columnName}}'
+             </#if>
+             <#if query.queryType=="contains">
+                and ${query.columnData.column} = '%<#noparse>#{</#noparse>query.${query.columnName}}%'
+             </#if>
+        </if>
+        </#list>
+    </sql>
+
+    <select id="list"
+            resultMap="BaseResultMap">
+        SELECT * FROM  ${table}
+        <where>
+            <include refid="listWhere">
+            </include>
+        </where>
+        <if test="query.sortList!=null">
+            <foreach collection="query.sortList" open=" order by " separator="," item="item">
+            <#noparse>#{</#noparse>item}
+            </foreach>
+        </if>
+        limit <#noparse>#{</#noparse>query.start},<#noparse>#{</#noparse>query.count}
+    </select>
+
+
+    <select id="count"
+            resultType="java.lang.Long">
+        SELECT count(*) FROM  ${table}
+        <where>
+            <include refid="listWhere">
+            </include>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/resources/generater/exception.template b/src/main/resources/generater/exception.template
new file mode 100644
index 0000000..f982635
--- /dev/null
+++ b/src/main/resources/generater/exception.template
@@ -0,0 +1,11 @@
+package ${packageName};
+
+import ${base.clazz};
+
+public class ${entity.name}Exception extends ${base.name}{
+
+    public ${entity.name}Exception(int code, String msg) {
+        super(code, msg);
+    }
+
+}
diff --git a/src/main/resources/generater/mongoDBDao.template b/src/main/resources/generater/mongoDBDao.template
deleted file mode 100644
index cc5ba65..0000000
--- a/src/main/resources/generater/mongoDBDao.template
+++ /dev/null
@@ -1,92 +0,0 @@
-package ${packageName};
-
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Repository;
-
-<#list importClasses as value>
-import ${value};
-</#list>
-
-
-@Repository
-public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{
-
-  public void updateSelective(${entityClassName} bean) {
-        Query query = new Query();
-        Update update=new Update();
-        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
-        <#if columnDataList??>
-        	<#list columnDataList as value>
-        if(bean.${value.columnMehtod} != null) {
-            update.set("${value.columnName}", bean.${value.columnMehtod});
-        }
-        	</#list>
-        </#if>
-        update.set("updateTime", new Date());
-        update(query, update);
-  }
-
-
-  public List<${entityClassName}> list(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        if(daoQuery.sortList!=null&&daoQuery.sortList.size()>0){
-            query.with(new Sort(daoQuery.sortList));
-        }
-        query.skip(daoQuery.start);
-        query.limit(daoQuery.count);
-        return findList(query);
-  }
-
-  public long count(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        return count(query);
-  }
-
-    private Query getQuery(DaoQuery daoQuery){
-          List<Criteria> andList=new ArrayList<>();
-           <#list daoQueryColumnDataList as value>
-               <#if (value.type!"") == "Date">
-               if(daoQuery.min${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
-               }
-               if(daoQuery.max${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
-               }
-               <#else>
-               if(daoQuery.${value.columnName}!=null){
-                 <#if (value.queryType!"") == "equal">
-                    andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
-                 <#else>
-                      andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
-                 </#if>
-               }
-               </#if>
-          </#list>
-          Query query=new Query();
-          Criteria[]  ands=new Criteria[andList.size()];
-          andList.toArray(ands);
-          if(ands.length>0){
-              query.addCriteria(new Criteria().andOperator(ands));
-          }
-          return query;
-    }
-
-  public static class DaoQuery{
-     <#if daoQueryColumnDataList??>
-       <#list daoQueryColumnDataList as value>
-        <#if (value.type!"") == "Date">
-        public ${value.type} min${value.columnName?cap_first};
-        public ${value.type} max${value.columnName?cap_first};
-        <#else>
-        public ${value.type} ${value.columnName};
-         </#if>
-       </#list>
-     </#if>
-        public int start;
-        public int count;
-        public List<Sort.Order> sortList;
-  }
-}
diff --git a/src/main/resources/generater/service/method/add.template b/src/main/resources/generater/service/method/add.template
deleted file mode 100644
index a34478d..0000000
--- a/src/main/resources/generater/service/method/add.template
+++ /dev/null
@@ -1,4 +0,0 @@
-//鏌ヨ涓婚敭ID鏄惁瀛樺湪
- dao.find(if(${entity.name}.getId()))
-
-
diff --git a/src/main/resources/generater/service/method/count.template b/src/main/resources/generater/service/method/count.template
deleted file mode 100644
index fd83e79..0000000
--- a/src/main/resources/generater/service/method/count.template
+++ /dev/null
@@ -1,14 +0,0 @@
-package ${packageName};
-
-import ${entityClass};
-
-
-public interface ${serviceClassName} {
-
-<#list metodInfoList as method>
-    ${method.note}
-    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
-
-</#list>
-
-}
diff --git a/src/main/resources/generater/service/method/delete.template b/src/main/resources/generater/service/method/delete.template
deleted file mode 100644
index fd83e79..0000000
--- a/src/main/resources/generater/service/method/delete.template
+++ /dev/null
@@ -1,14 +0,0 @@
-package ${packageName};
-
-import ${entityClass};
-
-
-public interface ${serviceClassName} {
-
-<#list metodInfoList as method>
-    ${method.note}
-    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
-
-</#list>
-
-}
diff --git a/src/main/resources/generater/service/method/impl/mongo/add.ftl b/src/main/resources/generater/service/method/impl/mongo/add.ftl
new file mode 100644
index 0000000..36ea557
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/add.ftl
@@ -0,0 +1,13 @@
+
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     //鏌ヨ涓婚敭ID鏄惁瀛樺湪
+     if(${daoObjName}.get(${entityObjName}.getId())!=null){
+        throw Exception("宸插瓨鍦�");
+     }
+
+     if(${entityObjName}.getCreateTime()==null){
+        ${entityObjName}.setCreateTime(new Date());
+     }
+     //淇濆瓨
+     ${daoObjName}.save(bean);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/count.ftl b/src/main/resources/generater/service/method/impl/mongo/count.ftl
new file mode 100644
index 0000000..21de435
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/count.ftl
@@ -0,0 +1,5 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign queryObjName="${query.name?uncap_first}" >
+    ${daoQuery.name} daoQuery = new ${daoQuery.name}();
+    BeanUtil.copyProperties(${queryObjName}, daoQuery);
+    ${daoObjName}.count(daoQuery);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/delete.ftl b/src/main/resources/generater/service/method/impl/mongo/delete.ftl
new file mode 100644
index 0000000..797fd91
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/delete.ftl
@@ -0,0 +1,4 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+     for (String id : idList){
+        ${daoObjName}.delete(id);
+     }
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/list.ftl b/src/main/resources/generater/service/method/impl/mongo/list.ftl
new file mode 100644
index 0000000..b9c385d
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/list.ftl
@@ -0,0 +1,7 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign queryObjName="${query.name?uncap_first}" >
+    ${daoQuery.name} daoQuery = new ${daoQuery.name}();
+    BeanUtil.copyProperties(${queryObjName}, daoQuery);
+    daoQuery.start=(page-1)*pageSize;
+    daoQuery.count=pageSize;
+    ${daoObjName}.list(daoQuery);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/save.ftl b/src/main/resources/generater/service/method/impl/mongo/save.ftl
new file mode 100644
index 0000000..32e925a
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/save.ftl
@@ -0,0 +1,6 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     if(${entityObjName}.getCreateTime()==null){
+          ${entityObjName}.setCreateTime(new Date());
+     }
+     ${daoObjName}.save(${entityObjName});
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/selectByPrimaryKey.ftl b/src/main/resources/generater/service/method/impl/mongo/selectByPrimaryKey.ftl
new file mode 100644
index 0000000..207272e
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/selectByPrimaryKey.ftl
@@ -0,0 +1,4 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+    Query query=new Query();
+    query.addCriteria(Criteria.where("_id").is(id));
+    return ${daoObjName}.findOne(query);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mongo/updateSlective.ftl b/src/main/resources/generater/service/method/impl/mongo/updateSlective.ftl
new file mode 100644
index 0000000..8724dbf
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mongo/updateSlective.ftl
@@ -0,0 +1,7 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     if(${entityObjName}.getUpdateTime()==null){
+        ${entityObjName}.setUpdateTime(new Date());
+     }
+     //鏇存柊
+     ${daoObjName}.updateSelective(${entityObjName});
diff --git a/src/main/resources/generater/service/method/impl/mybatis/add.ftl b/src/main/resources/generater/service/method/impl/mybatis/add.ftl
new file mode 100644
index 0000000..23ee748
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/add.ftl
@@ -0,0 +1,7 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     if(bean.getCreateTime()==null){
+        bean.setCreateTime(new Date());
+     }
+     //淇濆瓨
+     ${daoObjName}.insertSelective(bean);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/count.ftl b/src/main/resources/generater/service/method/impl/mybatis/count.ftl
new file mode 100644
index 0000000..21de435
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/count.ftl
@@ -0,0 +1,5 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign queryObjName="${query.name?uncap_first}" >
+    ${daoQuery.name} daoQuery = new ${daoQuery.name}();
+    BeanUtil.copyProperties(${queryObjName}, daoQuery);
+    ${daoObjName}.count(daoQuery);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/delete.ftl b/src/main/resources/generater/service/method/impl/mybatis/delete.ftl
new file mode 100644
index 0000000..81ca7b1
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/delete.ftl
@@ -0,0 +1,4 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+     for (String id : idList){
+        ${daoObjName}.deleteByPrimaryKey(id);
+     }
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/list.ftl b/src/main/resources/generater/service/method/impl/mybatis/list.ftl
new file mode 100644
index 0000000..b9c385d
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/list.ftl
@@ -0,0 +1,7 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign queryObjName="${query.name?uncap_first}" >
+    ${daoQuery.name} daoQuery = new ${daoQuery.name}();
+    BeanUtil.copyProperties(${queryObjName}, daoQuery);
+    daoQuery.start=(page-1)*pageSize;
+    daoQuery.count=pageSize;
+    ${daoObjName}.list(daoQuery);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/save.ftl b/src/main/resources/generater/service/method/impl/mybatis/save.ftl
new file mode 100644
index 0000000..c948a03
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/save.ftl
@@ -0,0 +1,12 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     if(${entityObjName}.getId()!=null){
+        //鏇存柊
+         if(${entityObjName}.getUpdateTime()==null){
+            ${entityObjName}.setUpdateTime(new Date());
+         }
+         ${daoObjName}.updateByPrimaryKey(  ${entityObjName});
+     }else{
+     //淇濆瓨
+         add(${entityObjName});
+    }
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/selectByPrimaryKey.ftl b/src/main/resources/generater/service/method/impl/mybatis/selectByPrimaryKey.ftl
new file mode 100644
index 0000000..a87dba2
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/selectByPrimaryKey.ftl
@@ -0,0 +1,2 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+    return ${daoObjName}.selectByPrimaryKey(id);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/impl/mybatis/updateSlective.ftl b/src/main/resources/generater/service/method/impl/mybatis/updateSlective.ftl
new file mode 100644
index 0000000..bf4a551
--- /dev/null
+++ b/src/main/resources/generater/service/method/impl/mybatis/updateSlective.ftl
@@ -0,0 +1,7 @@
+<#assign daoObjName="${dao.name?uncap_first}" >
+<#assign entityObjName="${entity.name?uncap_first}" >
+     if(${entityObjName}.getUpdateTime()==null){
+        ${entityObjName}.setUpdateTime(new Date());
+     }
+     //淇濆瓨
+     ${daoObjName}.updateByPrimaryKey(${entityObjName});
\ No newline at end of file
diff --git a/src/main/resources/generater/service/method/list.template b/src/main/resources/generater/service/method/list.template
deleted file mode 100644
index fd83e79..0000000
--- a/src/main/resources/generater/service/method/list.template
+++ /dev/null
@@ -1,14 +0,0 @@
-package ${packageName};
-
-import ${entityClass};
-
-
-public interface ${serviceClassName} {
-
-<#list metodInfoList as method>
-    ${method.note}
-    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
-
-</#list>
-
-}
diff --git a/src/main/resources/generater/service/method/save.template b/src/main/resources/generater/service/method/save.template
deleted file mode 100644
index 85f8420..0000000
--- a/src/main/resources/generater/service/method/save.template
+++ /dev/null
@@ -1,6 +0,0 @@
-  if(entity.getUpdateTime()==null){
-    entity.setUpdateTime(new Date());
-  }
-  dao.save(entity);
-
-
diff --git a/src/main/resources/generater/service/method/selectByPrimaryKey.template b/src/main/resources/generater/service/method/selectByPrimaryKey.template
deleted file mode 100644
index 870c88d..0000000
--- a/src/main/resources/generater/service/method/selectByPrimaryKey.template
+++ /dev/null
@@ -1,4 +0,0 @@
-return dao.selectByPrimaryKey(id);
-
-
-
diff --git a/src/main/resources/generater/service/method/updateSlective.template b/src/main/resources/generater/service/method/updateSlective.template
deleted file mode 100644
index 03b06a9..0000000
--- a/src/main/resources/generater/service/method/updateSlective.template
+++ /dev/null
@@ -1,2 +0,0 @@
-entity.setUpdateTime(new Date());
-dao.updateSelective(entity);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/service.template b/src/main/resources/generater/service/service.template
index c7e793d..a63688c 100644
--- a/src/main/resources/generater/service/service.template
+++ b/src/main/resources/generater/service/service.template
@@ -1,6 +1,8 @@
 package ${packageName};
 
 import ${service.clazz};
+import ${query.clazz};
+import ${entity.clazz};
 
 
 public interface ${service.name} {
diff --git a/src/main/resources/generater/service/serviceImpl.template b/src/main/resources/generater/service/serviceImpl.template
index 6d080bb..52e6a13 100644
--- a/src/main/resources/generater/service/serviceImpl.template
+++ b/src/main/resources/generater/service/serviceImpl.template
@@ -3,9 +3,12 @@
 import ${entity.clazz};
 import ${dao.clazz};
 import ${service.clazz};
+import ${query.clazz};
+import ${daoQuery.clazz};
 import javax.annotation.Resource;
 import org.springframework.stereotype.Service;
 import java.util.Date;
+import org.yeshi.utils.bean.BeanUtil;
 
 @Service
 public class ${service.name}Impl implements ${service.name}{
@@ -14,10 +17,10 @@
   private ${dao.name} ${dao.name?uncap_first};
 
   <#list metodInfoList as method>
-  ${method.note}
   ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params}){
-  ${method.content}
+${method.content}
   }
+
   </#list>
 
 }
\ No newline at end of file
diff --git a/src/test/java/com/generater/GeneratorTest.java b/src/test/java/com/generater/GeneratorTest.java
index a3af2b0..33d9472 100644
--- a/src/test/java/com/generater/GeneratorTest.java
+++ b/src/test/java/com/generater/GeneratorTest.java
@@ -1,32 +1,25 @@
 package com.generater;
 
-import freemarker.cache.StringTemplateLoader;
-import freemarker.template.Template;
 import org.springframework.data.annotation.Id;
-import org.springframework.data.annotation.Transient;
 import org.yeshi.utils.FileUtil;
 import org.yeshi.utils.FreemarkerUtils;
 import org.yeshi.utils.generater.SpringComponentGenerater;
-import org.yeshi.utils.generater.annotation.admin.form.CheckBox;
-import org.yeshi.utils.generater.annotation.admin.form.Select;
-import org.yeshi.utils.generater.annotation.admin.form.Text;
-import org.yeshi.utils.generater.entity.KeyValue;
-import org.yeshi.utils.generater.entity.MongoDBDaoData;
+import org.yeshi.utils.generater.entity.ClassInfo;
 import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
 import org.yeshi.utils.generater.mybatis.Column;
-import org.yeshi.utils.generater.mybatis.MyBatisMapperUtil;
 import org.yeshi.utils.generater.mybatis.Table;
-import org.yeshi.utils.generater.vo.admin.FormAddInfoVO;
-import org.yeshi.utils.generater.vo.admin.FormUpdateInfoVO;
+import org.yeshi.utils.generater.vo.ExceptionVO;
+import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
+import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
+import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
+import org.yeshi.utils.generater.vo.service.ServiceInfoVO;
+import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
+import org.yeshi.utils.generater.vo.admin.page.FormUpdateInfoVO;
 
-import java.io.File;
 import java.io.InputStream;
-import java.io.StringWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.*;
-import java.util.regex.Pattern;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 public class GeneratorTest {
 
@@ -51,8 +44,14 @@
 //        }
 
 
-        AdminGeneraterInfo info = new AdminGeneraterInfo.Builder().setEntityClass(TestEntity.class).build();
+        //
+//        boolean match = Pattern.matches("^(https://){1}.*(\\.m3u8)$", "https://n1.szjal.cn/20210805/qnDXhXBa/index.m3u8123");
+//        System.out.println(match);
+        generateMybatisDao();
+    }
 
+    private static void generateAdminPage() throws Exception {
+        AdminGeneraterInfo info = new AdminGeneraterInfo.Builder().setEntityClass(TestEntity.class).build();
         //灏嗘墍鏈夌殑鎺т欢妯℃澘鍔犺浇杩涘幓
         String[] template = new String[]{
                 "admin/form/checkBox.ftl",
@@ -74,12 +73,75 @@
         }
         String result = FreemarkerUtils.generateInputStream(new FormUpdateInfoVO.Builder().setAdminInfo(info).build(), "admin/update.ftl", map);
         FileUtil.saveAsFileByte(result.getBytes("UTF-8"), "C:\\Users\\Administrator\\Documents\\HBuilderProjects\\LayuiTest\\form.html");
-
-
         System.out.println(result);
-        //
-//        boolean match = Pattern.matches("^(https://){1}.*(\\.m3u8)$", "https://n1.szjal.cn/20210805/qnDXhXBa/index.m3u8123");
-//        System.out.println(match);
+    }
+
+
+    private static void generateService() throws Exception {
+        ClassInfo dao = new ClassInfo("TestDao", "com.test.dao.TestDao");
+        ClassInfo query = new ClassInfo("TestQuery", "com.test.query.TestQuery");
+        ClassInfo service = new ClassInfo("TestService", "com.test.service.TestService");
+        ServiceInfoVO serviceInfoVO = new ServiceInfoVO.Builder().setDao(dao).setEntity(Entity.class).setPackageName("com.test.service").setQuery(query).setService(service).build();
+        String result = FreemarkerUtils.generateInputStream(serviceInfoVO, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\service\\service.template"));
+        System.out.println(result);
+    }
+
+    private static void generateServiceImpl() throws Exception {
+        ClassInfo dao = new ClassInfo("TestMapper", "com.test.dao.TestMapper");
+        ClassInfo query = new ClassInfo("TestQuery", "com.test.query.TestQuery");
+        ClassInfo service = new ClassInfo("TestService", "com.test.service.TestService");
+        ClassInfo daoQuery = new ClassInfo("DaoQuery", "com.test.dao.query.DaoQuery");
+        ServiceImplInfoVO serviceInfoVO = new ServiceImplInfoVO.Builder()
+                .setDao(dao)
+                .setEntity(Entity.class)
+                .setPackageName("com.test.service.impl")
+                .setQuery(query)
+                .setService(service)
+                .setDaoQuery(daoQuery)
+                .build();
+        String result = FreemarkerUtils.generateInputStream(serviceInfoVO, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\service\\serviceImpl.template"));
+        System.out.println(result);
+    }
+
+
+    private static void generateAdminController() throws Exception {
+        AdminGeneraterInfo adminGeneraterInfo = new AdminGeneraterInfo.Builder().setEntityClass(TestEntity.class).build();
+        ClassInfo query = new ClassInfo("TestQuery", "com.test.query.TestQuery");
+        ClassInfo service = new ClassInfo("TestService", "com.test.service.TestService");
+        AdminControllerInfoVO vo = new AdminControllerInfoVO.Builder().setAdminInfo(adminGeneraterInfo).setPackageName("com.test.controller.admin").setQueryVO(query).setService(service).build();
+        String result = FreemarkerUtils.generateInputStream(vo, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\admin\\adminController.template"));
+        System.out.println(result);
+    }
+
+
+    private static void generateMongoDBDao() throws Exception {
+        MongoDBDaoVO vo = new MongoDBDaoVO.Builder().setBaseDao(new ClassInfo(BaseDao.class.getSimpleName(), BaseDao.class.getName())).setDao(new ClassInfo("TestDao", "com.test.dao.TestDao")).setEntity(TestEntity.class).build();
+        String result = FreemarkerUtils.generateInputStream(vo, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\dao\\mongoDBDao.template"));
+        System.out.println(result);
+    }
+
+
+    private static void generateMybatisDao() throws Exception {
+
+        MyBatisDBDaoVO vo = new MyBatisDBDaoVO
+                .Builder()
+                .setEntity(TestEntity2.class)
+                .setBaseMapper(new ClassInfo("BaseMapper", "com.test.mapper.BaseMapper"))
+                .setMapper(new ClassInfo("TestEntity2Mapper", "com.test.mapper.TestEntity2Mapper"))
+                .build();
+
+
+//        String result = FreemarkerUtils.generateInputStream(vo, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBDao.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBXML.ftl"));
+        System.out.println(result);
+    }
+
+    private static void generateException() throws Exception {
+        ExceptionVO vo = new ExceptionVO.Builder()
+                .setEntity(Entity.class)
+                .setPackageName("com.test.exception").build();
+        String result = FreemarkerUtils.generateInputStream(vo, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\exception.template"));
+        System.out.println(result);
     }
 
 
diff --git a/src/test/java/com/generater/Test.java b/src/test/java/com/generater/Test.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/test/java/com/generater/Test.java
diff --git a/src/test/java/com/generater/TestEntity.java b/src/test/java/com/generater/TestEntity.java
index deeefd4..efbe70f 100644
--- a/src/test/java/com/generater/TestEntity.java
+++ b/src/test/java/com/generater/TestEntity.java
@@ -16,7 +16,7 @@
  * @description: 娴嬭瘯entity
  * @date 2021/9/23 14:22
  */
-@AdminController(mapping = "admin/api/test", title = "娴嬭瘯", searchForm = TestEntity.SearchForm.class)
+@AdminController(mapping = "admin/api/test", title = "娴嬭瘯", searchForm = TestEntity.SearchForm.class,jsonp = true)
 public class TestEntity {
     @Id
     private String id;
diff --git a/src/test/java/com/generater/TestEntity2.java b/src/test/java/com/generater/TestEntity2.java
new file mode 100644
index 0000000..4b0b516
--- /dev/null
+++ b/src/test/java/com/generater/TestEntity2.java
@@ -0,0 +1,136 @@
+package com.generater;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.Transient;
+import org.yeshi.utils.generater.annotation.admin.AdminController;
+import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+import org.yeshi.utils.generater.annotation.admin.Show;
+import org.yeshi.utils.generater.annotation.admin.form.Img;
+import org.yeshi.utils.generater.annotation.admin.form.RadioGroup;
+import org.yeshi.utils.generater.annotation.admin.form.Select;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+import org.yeshi.utils.generater.mybatis.Column;
+import org.yeshi.utils.generater.mybatis.Table;
+
+/**
+ * @author Administrator
+ * @title: TestEntity
+ * @description: 娴嬭瘯entity
+ * @date 2021/9/23 14:22
+ */
+@AdminController(mapping = "admin/api/test", title = "娴嬭瘯", searchForm = TestEntity2.SearchForm.class,jsonp = true)
+@Table("table_test")
+public class TestEntity2 {
+    @Id
+    private String id;
+
+    @Column(name="nick_name")
+    @DaoQueryCondition(queryType = DaoQueryCondition.QueryType.contains)
+    @Show(order = 0, title = "鏄电О")
+    @Text(title = "鏄电О", maxLength = 50, require = true, placeHolder = "璇疯緭鍏ユ樀绉�", desc = "鏄电О涓嶈兘鍖呭惈鐗规畩瀛楃", verifyType = FormVerifyType.none, verifyValue = "^.{0-100}$", verifyNotifyMsg = "璇疯緭鍏ユ纭殑鏄电О")
+    private String nickName;
+
+    @DaoQueryCondition
+    @Show(order = 1, title = "绫诲瀷")
+    @Select(values = {"1:鐢�", "2:濂�"}, title = "绫诲瀷")
+    private Integer type;
+
+    @DaoQueryCondition
+    @Show(order = 2, title = "鎬у埆")
+    @RadioGroup(values = {"1:鐢�", "2:濂�"}, title = "鎬у埆")
+    private Integer sex;
+
+    @Show(order = 3, title = "澶村儚", showType = Show.ShowType.IMG, imgWidth = 50, imgHeight = 50)
+    @Img(height = 50, title = "澶村儚", uploadApi = "/admin/uploadimg", uploadApiParams = {"id:123123","type:2"})
+    private String portrait;
+
+    @Transient
+    @DaoQueryCondition
+    @Show(order = 4, title = "鐪�")
+    @Select(values = {"cq:閲嶅簡","js:姹熻嫃"}, title = "鐪�", apiParams = {"page:1", "pageSize:10", "id:\"test\""})
+    private String province;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getPortrait() {
+        return portrait;
+    }
+
+    public void setPortrait(String portrait) {
+        this.portrait = portrait;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public class SearchForm {
+
+        @Text(title = "寮�濮嬫棩鏈�", inputType = Text.Type.DATE)
+        private String startDate;
+        @Text(title = "缁撴潫鏃ユ湡", inputType = Text.Type.DATE)
+        private String endDate;
+        @Text(title = "璇疯緭鍏ュ叧閿瘝", inputType = Text.Type.TEXT)
+        private String key;
+
+
+        public String getStartDate() {
+            return startDate;
+        }
+
+        public void setStartDate(String startDate) {
+            this.startDate = startDate;
+        }
+
+        public String getEndDate() {
+            return endDate;
+        }
+
+        public void setEndDate(String endDate) {
+            this.endDate = endDate;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+    }
+}

--
Gitblit v1.8.0