Jelajahi Sumber

移除jdbc框架

zuy 1 tahun lalu
induk
melakukan
bd3d699333
56 mengubah file dengan 20 tambahan dan 10513 penghapusan
  1. 2 2
      admin-web/index.html
  2. 1 1
      admin-web/src/stores/themeConfig.ts
  3. 0 287
      car-wash-admin/src/main/java/com/kym/admin/utils/CommJdbcCodeGenerator.java
  4. 0 139
      car-wash-admin/src/main/java/com/kym/admin/utils/DBHelper.java
  5. 0 135
      car-wash-admin/src/main/resources/tmpl/.java.vm
  6. 0 108
      car-wash-admin/src/main/resources/tmpl/Controller.java.vm
  7. 0 13
      car-wash-admin/src/main/resources/tmpl/DAO.java.vm
  8. 0 48
      car-wash-admin/src/main/resources/tmpl/Service.java.vm
  9. 0 171
      car-wash-admin/src/main/resources/tmpl/ServiceImpl.java.vm
  10. 0 153
      car-wash-admin/src/main/resources/tmpl/dialog.vue.vm
  11. 0 171
      car-wash-admin/src/main/resources/tmpl/drawer.vm
  12. 0 262
      car-wash-admin/src/main/resources/tmpl/listvue.vm
  13. 1 10
      car-wash-admin/src/test/java/SpringTestCase.java
  14. 2 3
      car-wash-admin/src/test/java/TestCase.java
  15. 0 49
      car-wash-common/src/main/java/com/kym/common/utils/CommUtil.java
  16. 0 6
      car-wash-entity/pom.xml
  17. 2 46
      car-wash-entity/src/main/java/com/kym/entity/admin/Feedback.java
  18. 0 54
      car-wash-jdbc/pom.xml
  19. 0 473
      car-wash-jdbc/src/main/java/com/kym/DbUtil.java
  20. 0 175
      car-wash-jdbc/src/main/java/com/kym/JacksonUtil.java
  21. 0 32
      car-wash-jdbc/src/main/java/com/kym/jdbc/BasicQuery.java
  22. 0 37
      car-wash-jdbc/src/main/java/com/kym/jdbc/Bean.java
  23. 0 9
      car-wash-jdbc/src/main/java/com/kym/jdbc/DbException.java
  24. 0 7
      car-wash-jdbc/src/main/java/com/kym/jdbc/IBuilder.java
  25. 0 30
      car-wash-jdbc/src/main/java/com/kym/jdbc/IHandler.java
  26. 0 879
      car-wash-jdbc/src/main/java/com/kym/jdbc/OBuilder.java
  27. 0 15
      car-wash-jdbc/src/main/java/com/kym/jdbc/ResultHandler.java
  28. 0 25
      car-wash-jdbc/src/main/java/com/kym/jdbc/SQLEntity.java
  29. 0 11
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/CNT.java
  30. 0 52
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/DBF.java
  31. 0 33
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/Entity.java
  32. 0 28
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/FK.java
  33. 0 9
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/JoinType.java
  34. 0 39
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/Many.java
  35. 0 28
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/OP.java
  36. 0 53
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/One.java
  37. 0 22
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QE.java
  38. 0 62
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QF.java
  39. 0 8
      car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QueryType.java
  40. 0 16
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/DdlSQLExpress.java
  41. 0 84
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/DeleteSQLExpress.java
  42. 0 186
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/InsertSQLExpress.java
  43. 0 392
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/SQLExpress.java
  44. 0 991
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/SelectSQLExpress.java
  45. 0 246
      car-wash-jdbc/src/main/java/com/kym/jdbc/express/UpdateSQLExpress.java
  46. 0 10
      car-wash-jdbc/src/main/java/com/kym/jdbc/lambda/ColumnFunc.java
  47. 0 48
      car-wash-jdbc/src/main/java/com/kym/jdbc/lambda/DefaultLambdaParser.java
  48. 0 2378
      car-wash-jdbc/src/main/java/com/kym/jdbc/template/JdbcExecute.java
  49. 0 1733
      car-wash-jdbc/src/main/java/com/kym/jdbc/template/JdbcHelper.java
  50. 0 7
      car-wash-service/pom.xml
  51. 0 292
      car-wash-service/src/main/java/com/kym/dao/DbHandler.java
  52. 0 13
      car-wash-service/src/main/java/com/kym/dao/admin/FeedbackDAO.java
  53. 0 390
      car-wash-service/src/main/java/com/kym/service/IService.java
  54. 3 4
      car-wash-service/src/main/java/com/kym/service/admin/FeedbackService.java
  55. 9 37
      car-wash-service/src/main/java/com/kym/service/admin/impl/FeedbackServiceImpl.java
  56. 0 1
      pom.xml

+ 2 - 2
admin-web/index.html

@@ -5,9 +5,9 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
     <meta name="keywords" content="vue-next-admin"/>
-    <meta name="description" content="快与慢运营管理平台"/>
+    <meta name="description" content="iWash管理后台"/>
     <link rel="icon" href="public/logo.png"/>
-    <title>快与慢运营管理平台</title>
+    <title>iWash管理后台</title>
 
 </head>
 <body>

+ 1 - 1
admin-web/src/stores/themeConfig.ts

@@ -139,7 +139,7 @@ export const useThemeConfig = defineStore('themeConfig', {
              * 全局网站标题 / 副标题
              */
             // 网站主标题(菜单导航、浏览器当前网页标题)
-            globalTitle: 'K7运营服务平台',
+            globalTitle: 'iWash服务后台',
             // 网站副标题(登录页顶部文字)
             globalViceTitle: '',
             // 网站副标题(登录页顶部文字)

+ 0 - 287
car-wash-admin/src/main/java/com/kym/admin/utils/CommJdbcCodeGenerator.java

@@ -1,287 +0,0 @@
-package com.kym.admin.utils;
-
-import cn.hutool.core.io.IoUtil;
-import com.google.common.collect.ImmutableMap;
-import com.kym.JacksonUtil;
-import com.kym.common.utils.CommUtil;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.Velocity;
-import org.apache.velocity.app.VelocityEngine;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.StringWriter;
-import java.time.LocalDateTime;
-import java.util.*;
-
-
-/**
- * 代码生成器业务类
- *
- * @author yaop
- * @date 2024-05-03T18:00:29.140164200
- */
-@Slf4j
-public class CommJdbcCodeGenerator {
-
-
-    private static DBHelper db;
-
-    public static void main(String[] args) {
-        CodeGeneratorParam param = new CodeGeneratorParam();
-        var basePath = "D://快与慢充电桩/code/car-wash-java";
-//        var basePath = "/home/zuy/02.code/wash";
-        param.setModule("admin");
-        param.setTableName("t_wash_user");
-        param.setBasePackage("com.kym");
-
-
-        List<Map<String, String>> pathList = new ArrayList<>();
-        //修改代码输出路径
-        pathList.add(ImmutableMap.of("vm", "Controller.java.vm", "output", "%s/car-wash-%s/src/main/java/com/kym/%s/controller".formatted(basePath, param.getModule(), param.getModule())));
-        pathList.add(ImmutableMap.of("vm", "Service.java.vm", "output", "%s/car-wash-service/src/main/java/com/kym/service/%s".formatted(basePath, param.getModule())));
-        pathList.add(ImmutableMap.of("vm", "ServiceImpl.java.vm", "output", "%s/car-wash-service/src/main/java/com/kym/service/%s/impl".formatted(basePath, param.getModule())));
-        pathList.add(ImmutableMap.of("vm", "DAO.java.vm", "output", "%s/car-wash-service/src/main/java/com/kym/dao/%s".formatted(basePath, param.getModule())));
-        pathList.add(ImmutableMap.of("vm", ".java.vm", "output", "%s/car-wash-entity/src/main/java/com/kym/entity/%s".formatted(basePath, param.getModule())));
-//        pathList.add(ImmutableMap.of("vm", "listvue.vm", "output", "src/main/java/com/kym/admin/controller/"));
-//        pathList.add(ImmutableMap.of("vm", "dialog.vm", "output", "src/main/java/com/kym/admin/controller/"));
-//        pathList.add(ImmutableMap.of("vm", "drawer.vm", "output", "src/main/java/com/kym/admin/controller/"));
-        param.setPathList(pathList);
-        new CommJdbcCodeGenerator().generate(param);
-    }
-
-    public static String getFirstLowCase(String name) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = name.toCharArray();
-        for (int i = 0; i < chars.length; i++) {
-            if (i == 0) {
-                sbr.append(Character.toLowerCase(chars[i]));
-            } else {
-                sbr.append(chars[i]);
-            }
-        }
-        return sbr.toString();
-    }
-
-    private void closeDb() {
-        if (null != db) {
-            db.closeDb();
-        }
-    }
-
-    private void openDb() throws Exception {
-        db = new DBHelper();
-        db.open("jdbc:mysql://121.40.98.15:3307/car-wash?serverTimezone=Asia/Shanghai", "root", "KuaiyuMan/*-");
-    }
-
-    /**
-     * 数据表列表
-     *
-     * @param databaseId
-     * @return
-     */
-    public Object tableList(int databaseId) {
-        try {
-            openDb();
-            String sql = "SELECT table_name tableName, ENGINE, table_comment tableComment, create_time createTime FROM information_schema.tables " + "WHERE  table_schema=?";
-            List<Map<String, Object>> maps = db.executeQueryList(sql, "car-wash");
-            return ImmutableMap.of("list", maps);
-        } catch (Exception e) {
-            log.error("tableList error", e);
-        } finally {
-            closeDb();
-        }
-        return Collections.emptyList();
-    }
-
-    private String getPojoName(String name) {
-        StringBuilder result = new StringBuilder();
-        if (name.startsWith("t_")) {
-            name = name.substring(2);
-        }
-        char[] chars = name.toCharArray();
-        int comulaIdx = -1;
-        for (int i = 0; i < chars.length; i++) {
-            if (i == 0) {
-                result.append(Character.toUpperCase(chars[i]));
-            } else if (chars[i] == "_".toCharArray()[0]) {
-                comulaIdx = i;
-            } else if (i - 1 == comulaIdx) {
-                result.append(Character.toUpperCase(chars[i]));
-            } else {
-                result.append(chars[i]);
-            }
-
-        }
-        return result.toString();
-    }
-
-    private String getPojoFieldName(String name) {
-        StringBuilder result = new StringBuilder();
-        char[] chars = name.toCharArray();
-        int comulaIdx = -10;
-        for (int i = 0; i < chars.length; i++) {
-            if (chars[i] == "_".toCharArray()[0]) {
-                comulaIdx = i;
-            } else if (i - 1 == comulaIdx) {
-                result.append(Character.toUpperCase(chars[i]));
-            } else {
-                result.append(chars[i]);
-            }
-        }
-        return result.toString();
-    }
-
-
-    public void generate(CodeGeneratorParam param) {
-
-        try {
-            Map<String, Object> vars = vars(param);
-            VelocityEngine engine = new VelocityEngine();
-            Velocity.init();
-            VelocityContext context = new VelocityContext();
-            vars.forEach(context::put);
-            for (Map<String, String> entry : param.getPathList()) {
-                String vm = entry.get("vm");
-                String output = entry.get("output");
-                Object o = vars.get("pojoName");
-                StringWriter writer = new StringWriter();
-                String content = IoUtil.read(getClass().getClassLoader().getResourceAsStream("tmpl/" + vm), "utf-8");
-                engine.evaluate(context, writer, "code", content);
-                String string = writer.toString();
-                writer.flush();
-                IoUtil.close(writer);
-                FileWriter writer1 = new FileWriter(new File(output, o.toString() + vm.split(".vm")[0]));
-                writer1.write(string);
-                IoUtil.close(writer1);
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-
-    /**
-     * 模板变量清单
-     *
-     * @param param
-     * @return
-     */
-    public Map<String, Object> vars(CodeGeneratorParam param) {
-        Map<String, Object> context = new HashMap<>(64);
-        DevVariableVo varVo = new DevVariableVo();
-        String sql = "SELECT table_name  as tablename, ENGINE, table_comment as tablecomment, create_time createTime FROM information_schema.tables " + "WHERE  table_name= ?  ";
-        try {
-            openDb();
-            Map<String, Object> dataMap = db.executeQuery(sql, param.getTableName());
-            varVo.setTableName(CommUtil.null2String(dataMap.get("tablename")));
-            varVo.setTableComment(CommUtil.null2String(dataMap.get("tablecomment")));
-
-            System.out.println("generate list:\n" + JacksonUtil.toJSONString(varVo));
-
-            //table meta
-            StringBuilder sbr = new StringBuilder("insert into t_permission (name,pid,perm,level) values ");
-            String[] premissionLabel = {"list", "list", "modify", "remove", "add", "status"};
-            StringBuilder rb = new StringBuilder("insert into t_permission (name,pid,perm,level) values (\'").append(varVo.getTableComment()).append("\',0,\'").append(getFirstLowCase(getPojoName(varVo.getTableName()))).append(".list\',0)");
-            System.out.println("===============================\n");
-            System.out.println(rb.toString());
-//        System.out.println(rb + " RETURNING id;");
-            System.out.println("SELECT @parentId := LAST_INSERT_ID();");
-
-
-            // permission SQL
-            for (int i = 0; i < premissionLabel.length; i++) {
-                String pn = varVo.getTableComment();
-                if (i == 1) {
-                    pn = "查看";
-                } else if (i == 2) {
-                    pn = "编辑";
-                } else if (i == 3) {
-                    pn = "删除";
-                } else if (i == 4) {
-                    pn = "新增";
-                }
-                if (i == 0) {
-                } else {
-                    sbr.append("(\'").append(pn).append("\',@parentId,\'").append(getFirstLowCase(getPojoName(varVo.getTableName()))).append(".").append(premissionLabel[i]).append("\',1),");
-                }
-            }
-
-            System.out.println(sbr.substring(0, sbr.length() - 1));
-            System.out.println("\n===============================");
-
-            List<Map<String, Object>> tableVarList = new ArrayList<>();
-            String tableSql = "select column_name,data_type,character_maximum_length,column_comment from information_schema.columns" + " where  table_name = '" + varVo.getTableName() + "'";
-            log.warn(tableSql);
-            List<Map<String, Object>> tableVarDataList = db.executeQueryList(tableSql);
-            tableVarDataList.forEach(tableRet -> {
-                Map<String, Object> map = new HashMap<>();
-                map.put("columnName", getPojoFieldName(CommUtil.null2String(tableRet.get("column_name"))));
-                map.put("column", CommUtil.null2String(tableRet.get("column_name")));
-                map.put("columnComment", tableRet.get("column_comment"));
-                String dataType = CommUtil.null2String(tableRet.get("data_type"));
-                if ("int4".equals(dataType)) {
-                    dataType = "int";
-                }
-                if ("int8".equals(dataType)) {
-                    dataType = "bigint";
-                }
-                map.put("dataType", dataType);
-                map.put("viewType", CommUtil.null2String(tableRet.get("data_type")));
-                map.put("dataLength", CommUtil.null2String(tableRet.get("character_maximum_length")));
-                tableVarList.add(map);
-            });
-            varVo.setColumnSchemaList(tableVarList);
-
-            context.put("fields", varVo.getColumnSchemaList());
-            context.put("fieldSize", varVo.getColumnSchemaList().size());
-            context.put("pojoComment", varVo.getTableComment());
-            context.put("tableName", varVo.getTableName());
-            String pojoName = getPojoName(varVo.getTableName());
-            context.put("pojoName", pojoName);
-            context.put("lowPojoName", pojoName.toLowerCase());
-            context.put("firstLowPojoName", pojoName.substring(0, 1).toLowerCase() + pojoName.substring(1));
-            context.put("module", param.getModule());
-            context.put("basePackage", param.getBasePackage());
-            context.put("dollar", "$");
-            context.put("datetime", LocalDateTime.now().toString());
-
-            return context;
-        } catch (Exception e) {
-            log.error("vars error", e);
-        } finally {
-            closeDb();
-        }
-
-        return context;
-    }
-
-    @Data
-    public static class DevVariableVo {
-        private String tableName;
-        private String tableComment;
-        private List<Map<String, Object>> columnSchemaList;
-    }
-
-
-    @Data
-    public static class CodeGeneratorParam {
-        private long databaseId;
-        private String basePackage;
-        private String module;
-        private String tableName;
-        private List<Long> plainTemplateIdList;
-        private boolean permSQL;
-        private List<Map<String, String>> pathList;
-
-    }
-
-
-}
-
-
-
-

+ 0 - 139
car-wash-admin/src/main/java/com/kym/admin/utils/DBHelper.java

@@ -1,139 +0,0 @@
-package com.kym.admin.utils;
-
-import com.kym.DbUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * 数据库链接工具
- */
-public class DBHelper implements AutoCloseable {
-
-    private Logger logger = LoggerFactory.getLogger(DBHelper.class);
-
-    public final String DIALECT_MYSQL = "mysql";
-    public final String DIALECT_PGSQL = "postgresql";
-
-
-    private Connection conn = null;
-    private PreparedStatement pst = null;
-
-    public void open(String url, String username, String password) throws Exception {
-        Class.forName("com.mysql.cj.jdbc.Driver");
-        this.conn = DriverManager.getConnection(url, username, password);
-    }
-
-    public List<Map<String, Object>> executeQueryList(String sql, Object... params) {
-        List<Map<String, Object>> result = new ArrayList<>();
-        ResultSet resultSet = null;
-        try {
-            logger.info("executeQueryList sql:\n{},params:\n{}", sql, params);
-            pst = this.conn.prepareStatement(sql);
-            DbUtil.setParameter(pst, params);
-            resultSet = pst.executeQuery();
-            ResultSetMetaData metaData = resultSet.getMetaData();
-            int columnCount = metaData.getColumnCount();
-            while (resultSet.next()) {
-                Map<String, Object> data = new HashMap<>();
-                for (int i = 1; i <= columnCount; i++) {
-                    String columnName = metaData.getColumnLabel(i).toLowerCase();
-                    data.put(columnName, resultSet.getString(i));
-                }
-                result.add(data);
-            }
-        } catch (Exception e) {
-            logger.error("DBHelper executeQueryList error", e);
-        } finally {
-            if (null != resultSet) {
-                try {
-                    resultSet.close();
-                } catch (SQLException e) {
-                    logger.error("DBHelper executeQueryList close error", e);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    public Map<String, Object> executeQuery(String sql, Object... params) throws Exception {
-        Map<String, Object> result = new HashMap<>();
-        ResultSet resultSet = null;
-        logger.info("executeQuery sql:\n{}", sql);
-        try {
-            pst = this.conn.prepareStatement(sql);//准备执行语句
-            DbUtil.setParameter(pst, params);
-            resultSet = pst.executeQuery();
-            ResultSetMetaData metaData = resultSet.getMetaData();
-            int columnCount = metaData.getColumnCount();
-            while (resultSet.next()) {
-                for (int i = 1; i <= columnCount; i++) {
-                    String columnName = metaData.getColumnLabel(i).toLowerCase();
-                    result.put(columnName, resultSet.getString(i));
-                }
-            }
-        } catch (Exception e) {
-            logger.error("DBHelper executeQuery error", e);
-        } finally {
-            if (null != resultSet) {
-                try {
-                    resultSet.close();
-                } catch (SQLException e) {
-                    logger.error("DBHelper executeQuery close error", e);
-                }
-            }
-        }
-        return result;
-    }
-
-
-    public void executeUpdate(String sql, Object... params) throws Exception {
-        try {
-            logger.info("executeUpdate sql:\n{}", sql);
-            pst = this.conn.prepareStatement(sql);//准备执行语句
-            DbUtil.setParameter(pst, params);
-            int i = pst.executeUpdate();
-            logger.info("DBHelper executeUpdate rows:{}", i);
-        } catch (Exception e) {
-            logger.error("DBHelper executeUpdate error", e);
-        }
-    }
-
-    //关闭
-    public void closeDb() {
-        try {
-            if (null != pst) {
-                if (!pst.isClosed()) {
-                    pst.close();
-                    logger.info("close preparedStatement...");
-                }
-            }
-            if (null != conn) {
-                if (!conn.isClosed()) {
-                    conn.close();
-                    logger.info("close connection..");
-                }
-            }
-        } catch (SQLException e) {
-            logger.error(e.getMessage(), e);
-        }
-    }
-
-
-    @Override
-    public void close() throws Exception {
-        closeDb();
-    }
-}

+ 0 - 135
car-wash-admin/src/main/resources/tmpl/.java.vm

@@ -1,135 +0,0 @@
-package ${basePackage}.entity.${module};
-
-
-
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.annotations.*;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
-*${pojoComment}
-*@date ${datetime}
-*/
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Entity(clz = ${pojoName}.class,comment ="${pojoComment}")
-public class ${pojoName} implements Serializable{
-#foreach($ele in $fields)
-    #if($ele.dataType=="int")
-    @DBF(comment = "${ele.columnComment}")
-    private int $ele.columnName;
-    #end
-    #if($ele.dataType=="tinyint"||$ele.dataType=="bool"||$ele.dataType=='int2')
-    @DBF(comment = "${ele.columnComment}")
-    private boolean $ele.columnName ;
-    #end
-    #if($ele.dataType=="bigint")
-    @DBF(comment = "${ele.columnComment}")
-    private long $ele.columnName ;
-    #end
-    #if($ele.dataType=="text")
-    @DBF(comment = "${ele.columnComment}")
-        #if($ele.columnName.indexOf("IdList")!=-1)
-        private List<Long> $ele.columnName ;
-        #else
-            private List<SimpleVo> $ele.columnName ;
-        #end
-    #end
-    #if($ele.dataType=="varchar")
-        @DBF(comment = "${ele.columnComment}",max=$ele.dataLength)
-        private String $ele.columnName ;
-    #end
-    #if($ele.dataType=="text")
-        @DBF(comment = "${ele.columnComment}")
-        private String $ele.columnName ;
-    #end
-    #if($ele.dataType=="char")
-        @DBF(comment = "${ele.columnComment}",max=$ele.dataLength)
-        private String $ele.columnName ;
-    #end
-    #if($ele.dataType=="date")
-        @DBF(comment = "${ele.columnComment}")
-        private Date $ele.columnName;
-    #end
-    #if($ele.dataType=="datetime")
-        @DBF(comment = "${ele.columnComment}")
-        private Date $ele.columnName;
-    #end
-    #if($ele.dataType=="timestamp")
-        @DBF(comment = "${ele.columnComment}")
-        private Date $ele.columnName;
-    #end
-#end
-
-    @Data
-    @EqualsAndHashCode(callSuper = true)
-    public static class ${pojoName}Info extends ${pojoName}{
-    // @One(mkf = "createBy", tf = "name", comment = "创建人")
-    // private String createName;
-
-    // @One(mkf = "updateBy", tf = "name", comment = "更新人")
-    // private String updateName;
-    }
-
-    @Data
-    @EqualsAndHashCode(callSuper = true)
-    @QE(clz=${pojoName}Info.class)
-    public static class ${pojoName}BasicQuery extends BasicQuery{
-#foreach($ele in $fields)
-    #if($ele.dataType=="int")
-        private Integer ${ele.columnName} ;
-    #end
-    #if($ele.dataType=="tinyint")
-        private Boolean $ele.columnName ;
-    #end
-    #if($ele.dataType=="bigint")
-        private Long $ele.columnName ;
-    #end
-    #if($ele.dataType=="varchar")
-        private String $ele.columnName ;
-    #end
-    #if($ele.dataType=="text")
-        private String $ele.columnName ;
-    #end
-    #if($ele.dataType=="char")
-        private String $ele.columnName ;
-    #end
-#end
-
-    //region date query
-#foreach($ele in $fields)
-    #if($ele.dataType=="date")
-        @QF(op=OP.GTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}Start  ;
-        @QF(op=OP.LTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}End    ;
-    #end
-    #if($ele.dataType=="datetime")
-        @QF(op=OP.GTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}Start;
-        @QF(op=OP.LTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}End    ;
-    #end
-    #if($ele.dataType=="timestamp")
-        @QF(op=OP.GTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}Start  ;
-        @QF(op=OP.LTE,tf="${ele.columnName}")
-        private Date ${ele.columnName}End    ;
-    #end
-#end
-    //endregion
-
-
-    //region sort query
-#foreach($ele in $fields)
-    #if($ele.dataType=="int"||$ele.dataType=="bigint"||$ele.dataType=="tinyint"||$ele.dataType=="datetime"||$ele.dataType=="timestamp")
-        private Integer ${ele.columnName}Sort    ;
-    #end
-#end
-    //endregion
-    }
-    }

+ 0 - 108
car-wash-admin/src/main/resources/tmpl/Controller.java.vm

@@ -1,108 +0,0 @@
-package ${basePackage}.${module}.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.kym.common.R;
-import com.kym.common.annotation.SysLog;
-import com.kym.common.controller.IController;
-import jakarta.validation.Valid;
-import jakarta.annotation.Resource;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-
-/**
- * ${pojoComment}接口
- *
- * @date ${datetime}
- */
-@RestController
-@RequestMapping("${firstLowPojoName}")
-public class ${pojoName}Controller extends IController {
-
-    @Resource
-    private ${pojoName}Service ${firstLowPojoName}Service;
-
-
-    /**
-     * ${pojoComment}新增接口
-     *
-     * @param ${firstLowPojoName} 新增${pojoComment}
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.add")
-    @PostMapping("add")
-    @SysLog(value = "${pojoComment}新增接口")
-    public R<?> add(@Valid @RequestBody ${pojoName}Info ${firstLowPojoName}) {
-//other params checked
-        return resp(() -> ${firstLowPojoName}Service.add(${firstLowPojoName}));
-    }
-
-    /**
-     * ${pojoComment}编辑
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.modify")
-    @PostMapping("modify")
-    @SysLog(value = "${pojoComment}更新接口")
-    public R<?> modify(@Valid @RequestBody  ${pojoName}Info ${firstLowPojoName}) {
-        return resp((t) -> ${firstLowPojoName}Service.modify(${firstLowPojoName}));
-    }
-
-
-    /**
-     * ${pojoComment}查询接口
-     *
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.list")
-    @PostMapping("list")
-    @SysLog(value = "${pojoComment}列表查询接口")
-    public R<?> list(@RequestBody ${pojoName}.${pojoName}BasicQuery query) {
-        return resp(() -> ${firstLowPojoName}Service.list(query));
-    }
-
-
-    /**
-     * ${pojoComment}查询详情接口
-     *
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.list")
-    @GetMapping("detail/{id}")
-    @SysLog(value = "${pojoComment}详情查询接口")
-    public R<?> detail(@PathVariable long id) {
-        return resp(() -> ${firstLowPojoName}Service.detail(id));
-    }
-
-
-    /**
-     * ${pojoComment}变更状态接口
-     *
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.modify")
-    @GetMapping("status/{id}/{status}")
-    @SysLog(value = "${pojoComment}变更状态")
-    public R<?> status(@PathVariable long id, @PathVariable int status) {
-        return resp((t) -> ${firstLowPojoName}Service.status(id, status));
-    }
-
-
-    /**
-     * ${pojoComment}删除接口
-     *
-     * @return Res
-     */
-    @SaCheckPermission(value = "${firstLowPojoName}.remove")
-    @GetMapping("remove/{id}")
-    @SysLog(value = "${pojoComment}删除")
-    public R<?> remove(@PathVariable long id) {
-        return resp((t) -> ${firstLowPojoName}Service.remove(id));
-    }
-
-
-}

+ 0 - 13
car-wash-admin/src/main/resources/tmpl/DAO.java.vm

@@ -1,13 +0,0 @@
-package ${basePackage}.dao.${module};
-
-import com.kym.dao.DbHandler;
-import org.springframework.stereotype.Component;
-
-/**
-*${pojoComment}
-*@date ${datetime}
-*/
-@Component
-public class ${pojoName}DAO extends DbHandler {
-
-}

+ 0 - 48
car-wash-admin/src/main/resources/tmpl/Service.java.vm

@@ -1,48 +0,0 @@
-package ${basePackage}.service.${module};
-
-import com.kym.common.R;
-import com.kym.jdbc.Bean;
-
-import ${basePackage}.entity.${module}.${pojoName}.${pojoName}Info;
-import ${basePackage}.entity.${module}.${pojoName}.${pojoName}BasicQuery;
-
-
-/**
- * ${pojoComment}业务类
- * @date ${datetime}
- */
-public interface  ${pojoName}Service {
-
-    /**
-     * ${pojoComment}分页查询
-     */
-     Bean<${pojoName}Info> list(${pojoName}BasicQuery query);
-
-    /**
-     * 查询${pojoComment}详情
-     */
-     ${pojoName}Info detail(long id);
-
-
-    /**
-     * ${pojoComment}状态变更
-     */
-     void status(long id, int status);
-
-
-    /**
-     * 新增${pojoComment}
-     */
-     long add(${pojoName}Info ${firstLowPojoName});
-
-    /**
-     * 物理删除${pojoComment}
-     */
-      R<?> remove(long id);
-
-    /**
-     * 编辑${pojoComment}
-     */
-     void modify(${pojoName}Info ${firstLowPojoName});
-
-}

+ 0 - 171
car-wash-admin/src/main/resources/tmpl/ServiceImpl.java.vm

@@ -1,171 +0,0 @@
-package ${basePackage}.service.${module}.impl;
-
-import com.kym.common.R;
-import com.kym.entity.${module}.${pojoName};
-import com.kym.common.utils.CommUtil;
-import com.kym.dao.${module}.${pojoName}DAO;
-import com.kym.jdbc.Bean;
-import com.kym.common.constant.ResponseEnum;
-import com.kym.service.IService;
-import com.kym.service.${module}.${pojoName}Service;
-import jakarta.annotation.Resource;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import ${basePackage}.entity.${module}.${pojoName}.${pojoName}Info;
-import ${basePackage}.entity.${module}.${pojoName}.${pojoName}BasicQuery;
-
-
-/**
-* ${pojoComment}业务类
-* @date ${datetime}
-*/
-@Service("${firstLowPojoName}Service")
-public class ${pojoName}ServiceImpl extends IService implements ${pojoName}Service{
-
-@Resource
-private  ${pojoName}DAO ${firstLowPojoName}DAO;
-/**
-* ${pojoComment}分页查询
-*/
-public Bean<${pojoName}Info>list(${pojoName}BasicQuery query) {
-    setupQuery(query);
-    return ${firstLowPojoName}DAO.selectPageBean(query);
-    }
-
-    /**
-    * 查询${pojoComment}详情
-    */
-    public ${pojoName}Info detail(long id) {
-    return ${firstLowPojoName}DAO.selectOneExist(${pojoName}Info.class,id);
-    }
-
-
-    /**
-    * ${pojoComment}状态变更
-    */
-    @Transactional(rollbackFor = Exception.class)
-    public void status(long id,int status) {
-    ${pojoName} old = ${firstLowPojoName}DAO.selectOneExist(${pojoName}.class,id);
-    ${pojoName} bean = new  ${pojoName}();
-    bean.setId(id);
-    bean.setStatus(status);
-    ${firstLowPojoName}DAO.updateSelective(bean,"status");
-    super.afterModify(old,bean);
-    }
-
-
-    /**
-    * 新增${pojoComment}
-    */
-    @Transactional(rollbackFor = Exception.class)
-    public long add(${pojoName}Info ${firstLowPojoName}) {
-    ${firstLowPojoName}DAO.checkUniqueValue(${pojoName}.class,oBuilder().eq(${pojoName}::getName, ${firstLowPojoName}.getName()),${pojoName}::getName,${firstLowPojoName}.getId());
-    long ret = ${firstLowPojoName}DAO.insert(${firstLowPojoName});
-    CommUtil.asserts(ret>0, ResponseEnum.DB_ERROR);
-
-    super.afterAdd(ret);
-    return ret;
-    }
-
-    /**
-    * 物理删除${pojoComment}
-    */
-    @Transactional(rollbackFor = Exception.class)
-    public R<?> remove(long id) {
-    ${firstLowPojoName}DAO.delete(${pojoName}.class,id);
-    super.afterRemove(id);
-    return R.success();
-    }
-
-    /**
-    * 编辑${pojoComment}
-    */
-    @Transactional(rollbackFor = Exception.class)
-    public void modify(${pojoName}Info ${firstLowPojoName}) {
-    ${pojoName}Info oldBean = ${firstLowPojoName}DAO.selectOneExist(${pojoName}Info.class, ${firstLowPojoName}.getId());
-    int ret = ${firstLowPojoName}DAO.update(${firstLowPojoName});
-    CommUtil.asserts(ret>0, ResponseEnum.DB_ERROR);
-    super.afterModify(oldBean,${firstLowPojoName});
-    }
-
-
-    #if(${hasCategory})
-        /**
-        * 新增${pojoComment}分类
-        */
-        @Transactional(rollbackFor = Exception.class)
-        public int addCategory(${pojoName}Category category) {
-        ${firstLowPojoName}DAO.checkUniqueValue(${pojoName}Category.class,oBuilder().eq(${pojoName}Category::getName, category.getName()),${pojoName}Category::getName,category.getId());
-        int ret = ${firstLowPojoName}DAO.insert(category);
-        CommUtil.asserts(ret>0, ResponseEnum.DB_ERROR);
-        super.afterAdd(ret);
-        return ret;
-        }
-
-
-        /**
-        * ${pojoComment}分类分页查询
-        */
-        public R<?> listCategory(${pojoName}Category.${pojoName}CategoryBasicQuery query) {
-        return R.succ(${firstLowPojoName}DAO.selectPageList(query));
-        }
-
-
-        /**
-        * ${pojoComment}分类详情
-        */
-        public ${pojoName}Category detailCategory(long id) {
-        return ${firstLowPojoName}DAO.selectOneExist(${pojoName}Category.class,id)
-        }
-
-
-
-
-        /**
-        * ${pojoComment}分类编辑
-        */
-        @Transactional(rollbackFor = Exception.class)
-        public void modifyCategory(${pojoName}Category category) {
-        ${pojoName} old = ${firstLowPojoName}DAO.selectOneExist(${pojoName}.class,id);
-        int ret =${firstLowPojoName}DAO.update(category);
-        CommUtil.asserts(ret>0, ResponseEnum.DB_ERROR);
-        super.afterModify(old,category);
-        }
-
-        /**
-        * ${pojoComment}分类发布/撤回
-        */
-        @Transactional(rollbackFor = Exception.class)
-        public void releaseCategory(long id,int releaseStatus) {
-        ${pojoName} old = ${firstLowPojoName}DAO.selectOneExist(${pojoName}.class,id);
-        ${pojoName} bean = new  ${pojoName}();
-        bean.setId(id);
-        //bean.releaseStatus = releaseStatus;
-        ${firstLowPojoName}DAO.updateSelective(bean,"releaseStatus");
-        super.afterModify(old,bean);
-        }
-
-
-
-
-        /**
-        * ${pojoComment}分类物理删除
-        */
-        @Transactional(rollbackFor = Exception.class)
-        public void removeCategory(long categoryId) {
-        //子分类
-        int subCategoryCount = ${firstLowPojoName}DAO.selectCount(${pojoName}Category.class, oBuilder().eq(${pojoName}Category::getPid, categoryId));
-        if (subCategoryCount > 0) {
-        throw new BizException(ResponseEnum.SYSTEM_ERROR.code, "有子分类存在,请先删除子分类再操作");
-        }
-        int typeCount = ${firstLowPojoName}DAO.selectCount(${pojoName}.class,oBuilder().eq(${pojoName}.class::getCategoryId,categoryId));
-        if(typeCount>0){
-        throw new BizException(ResponseEnum.SYSTEM_ERROR.code,"此分类下有${pojoComment},请解除分类关系或删除后再删除");
-        }
-        ${firstLowPojoName}DAO.delete(${pojoName}Category.class,categoryId);
-
-        super.afterRemove(categoryId);
-        }
-    #end
-    }

+ 0 - 153
car-wash-admin/src/main/resources/tmpl/dialog.vue.vm

@@ -1,153 +0,0 @@
-<style scoped lang="scss">
-
-</style>
-<template>
-    <div class="system-dialog-container">
-        <el-dialog
-                :title="state.dialog.title"
-                v-model="state.dialog.visible"
-                width="820px"
-                draggable
-                destroy-on-close
-                :close-on-click-modal="false"
-                align-center>
-            <el-form
-                    inline
-                    :model="state.ruleForm"
-                    :rules="rules"
-                    label-position="top"
-                    ref="formRef"
-                    size="default"
-                    label-width="100px"
-                    class="mt5">
-                #foreach($ele in $fields)
-                    #if($ele.columnName!="id"&&$ele.columnName!="createTime"&&$ele.columnName!="updateTime" )
-                        <el-form-item label="$ele.columnComment" prop="$ele.columnName">
-                            <el-input
-                                    v-model="state.ruleForm.$ele.columnName"
-                                    placeholder="$ele.columnComment"
-                                    clearable
-                                    class="wd350">
-                            </el-input>
-                        </el-form-item>
-                    #end
-                #end
-            </el-form>
-
-            <template #footer>
-
-                <el-row>
-                    <el-col :span="12">
-                        <p class="text-align-left">
-                            <el-checkbox v-model="state.continueAdd" v-if="!state.ruleForm.id">继续创建</el-checkbox>
-                            <template v-else>
-                                <el-button @click="handleActive" type="success" v-if="state.ruleForm.status !=1" size="default">激 活</el-button>
-                                <el-button @click="handleActive" type="danger" v-else size="default">禁 用</el-button>
-                            </template>
-                        </p>
-                    </el-col>
-                    <el-col :span="12">
-                        <p class="dialog-footer">
-                            <el-button @click="onCancel" size="default">取 消</el-button>
-                            <el-button :loading="state.btnLoading" type="primary" @click="onSubmit" size="default">{{ state.dialog.submitTxt }}</el-button>
-                        </p>
-                    </el-col>
-                </el-row>
-
-            </template>
-        </el-dialog>
-    </div>
-</template>
-
-<script setup lang="ts" name="${pojoName}Dialog">
-    import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
-    import {Msg} from "/@/utils/message";
-    import {$body, $get} from "/@/utils/request";
-    import u from '/@/utils/u'
-
-    // 引入异步组件
-    // const ExtDetailForm = defineAsyncComponent(() => import('/@/components/form/ExtDetailForm.vue'));
-
-    // 定义子组件向父组件传值/事件
-    const emit = defineEmits(['refresh']);
-    const formRef = ref();
-    //定义初始变量,重置使用
-    const initState = () => ({
-        ruleForm: {
-            id: 0
-        },
-        btnLoading: false,
-        dialog: {
-            visible: false,
-            type: '',
-            title: '',
-            submitTxt: '',
-        },
-        rules: {},
-        continueAdd: false
-    })
-
-    // 定义变量内容
-    const state = reactive(initState());
-
-
-    // 打开弹窗
-    const open = (action: string = 'add', row: any) => {
-        state.dialog.title = u.dialog.actions[action].title + "『${pojoComment}』"
-        state.dialog.submitTxt = u.dialog.actions[action].btn + "『${pojoComment}』"
-        state.dialog.visible = true;
-        if (action !== 'add') {
-            loadData(row.id);
-        } else {
-            state.ruleForm = Object.assign(state.ruleForm, row);
-        }
-    };
-    // 关闭弹窗
-    const onClose = () => {
-        state.dialog.visible = false;
-        Object.assign(state, initState())
-    };
-    // 取消
-    const onCancel = () => {
-        onClose();
-    };
-    // 提交
-    const onSubmit = () => {
-        formRef.value.validate((v: boolean) => {
-            if (v) {
-                state.btnLoading = true;
-                const url = state.ruleForm.id > 0 ? "${firstLowPojoName}/modify" : "${firstLowPojoName}/add"
-                    $body(url, state.ruleForm).then(() => {
-                    state.btnLoading = false;
-                    Msg.message('操作成功');
-                    console.log('submit!')
-                    if (!state.continueAdd) {
-                        onClose();
-                        emit('refresh');
-                    }
-                })
-            } else {
-                state.btnLoading = false;
-                Msg.message('请先完整填写表单', 'error');
-            }
-        })
-    };
-
-    const handleFormChange = (formData: any) => {
-        console.log(formData)
-    }
-
-    // 初始化详情页
-    const loadData = (id: number) => {
-            $get(`${firstLowPojoName}/detail/${id}`).then((res: any) => {
-            state.ruleForm = res;
-        })
-    }
-
-    // 暴露变量
-    defineExpose({
-        open
-    });
-
-
-</script>

+ 0 - 171
car-wash-admin/src/main/resources/tmpl/drawer.vm

@@ -1,171 +0,0 @@
-<style scoped lang="scss">
-
-</style>
-<template>
-    <div class="system-dialog-container">
-        <el-drawer
-                :title="state.dialog.title"
-                v-model="state.dialog.visible"
-                width="820px"
-                append-to-body
-                destroy-on-close
-                :close-on-click-modal="false"
-        >
-            <el-form
-                    inline
-                    :model="state.ruleForm"
-                    :rules="rules"
-                    label-position="top"
-                    ref="formRef"
-                    size="default"
-                    label-width="100px"
-                    class="mt5">
-                #foreach($ele in $fields)
-                    #if($ele.columnName!="id"&&$ele.columnName!="createTime"&&$ele.columnName!="updateTime" )
-                        <el-form-item label="$ele.columnComment" prop="$ele.columnName">
-                            <el-input
-                                    v-model="state.ruleForm.$ele.columnName"
-                                    placeholder="$ele.columnComment"
-                                    clearable
-                                    class="wd350">
-                            </el-input>
-                        </el-form-item>
-                    #end
-                #end
-            </el-form>
-
-            <template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onCancel" size="default">取 消</el-button>
-					<el-button :loading="state.btnLoading" type="primary" @click="onSubmit" size="default">{{ state.dialog.submitTxt }}</el-button>
-				</span>
-            </template>
-        </el-drawer>
-    </div>
-</template>
-
-<script setup lang="ts" name="${pojoName}Dialog">
-    import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
-    import {Msg} from "/@/utils/message";
-    import {$body, $get} from "/@/utils/request";
-    import u from '/@/utils/u'
-
-    // 引入组件
-    // const ExtDetailForm = defineAsyncComponent(() => import('/@/components/form/ExtDetailForm.vue'));
-
-    // 定义子组件向父组件传值/事件
-    const emit = defineEmits(['refresh']);
-    const formRef = ref();
-    //定义初始变量,重置使用
-    const initState = ()=>({
-        ruleForm: {
-            id:0
-        },
-        btnLoading: false,
-        dialog: {
-            visible: false,
-            type: '',
-            title: '',
-            submitTxt: '',
-        },
-        columns: [
-            #foreach($ele in $fields)
-                #if($ele.dataType=="int" || $ele.dataType=="tinyint" )
-                    #if($ele.columnName =="status" ||$ele.columnName =="releaseStatus" )
-                        {
-                            label: '$ele.columnComment',
-                            prop: '$ele.columnName',
-                            sortable: 'custom',
-                            align: 'center',
-                            type: 'dict',
-                            conf: {dict: '${pojoName}.status'}
-                        },
-                    #end
-                    #if($ele.columnName!="createBy"&&$ele.columnName!="updateBy")
-                        {label: '$ele.columnComment', prop: '$ele.columnName', type: 'user',},
-                    #end
-                #end
-                #if($ele.dataType=="json")
-                    {label: '$ele.columnComment', prop: '$ele.columnName', type: 'user'},
-                #end
-                #if($ele.dataType=="char" || $ele.dataType=="varchar" )
-                    #if($ele.columnName =="title"||$ele.columnName=="name")
-                        {
-                            label: '$ele.columnComment', prop: '$ele.columnName', type: "text",
-                        },
-                    #end
-                    #if($ele.columnName !="title"&&$ele.columnName!="name")
-                        {label: '$ele.columnComment', prop: '$ele.columnName', type: 'text',},
-                    #end
-                #end
-                #if($ele.dataType=="date" || $ele.dataType=="datetime" || $ele.dataType=="timestamp" )
-                    {
-                        label: '$ele.columnComment', prop: '$ele.columnName', type: 'datetime',
-                    },
-                #end
-            #end
-        ],
-        rules: {},
-    })
-
-    // 定义变量内容
-    const state = reactive(initState());
-
-
-    // 打开弹窗
-    const open = (action: string='add', row: any) => {
-        state.dialog.title = u.dialog.actions[action].title +"『${pojoComment}』"
-        state.dialog.submitTxt = u.dialog.actions[action].btn +"『${pojoComment}』"
-        state.dialog.visible = true;
-        if (action !=='add') {
-            loadData(row.id);
-        }
-    };
-    // 关闭弹窗
-    const onClose = () => {
-        state.dialog.visible = false;
-        Object.assign(state,initState())
-    };
-    // 取消
-    const onCancel = () => {
-        onClose();
-    };
-    // 提交
-    const onSubmit = () => {
-        formRef.value.validate((valid:boolean) => {
-            if(valid){
-                state.btnLoading = true;
-                const url = state.ruleForm.id > 0 ? "${firstLowPojoName}/modify" : "${firstLowPojoName}/add"
-                    $body(url, state.ruleForm).then(() => {
-                    state.btnLoading = false;
-                    Msg.message('操作成功');
-                    console.log('submit!')
-                    onClose();
-                    emit('refresh');
-                })
-            }
-
-        }).catch(() => {
-            state.btnLoading = false;
-            Msg.message('表单校验失败', 'error');
-        })
-    };
-
-    const handleFormChange = (formData: any) => {
-        console.log(formData)
-    }
-
-    // 初始化表格数据
-    const loadData = (id: number) => {
-            $get(`${firstLowPojoName}/detail/${id}`).then((res: any) => {
-            state.ruleForm = res;
-        })
-    }
-
-    // 暴露变量
-    defineExpose({
-        open
-    });
-
-
-</script>

+ 0 - 262
car-wash-admin/src/main/resources/tmpl/listvue.vm

@@ -1,262 +0,0 @@
-<style scoped lang="scss">
-    .system-container {
-
-        :deep(.el-card__body) {
-            display: flex;
-            flex-direction: column;
-            justify-content: space-between;
-            flex: 1;
-            overflow: auto;
-
-            .el-table {
-                flex: 1;
-            }
-
-        }
-    }
-
-    .page-content {
-        margin-bottom: 20px;
-    }
-
-    .page-pager {
-        background-color: #fff;
-        height: 24px;
-    }
-</style>
-<template>
-    <div class="system-container layout-padding">
-        <el-card shadow="hover" class="layout-padding-auto">
-            <ext-query-form
-                    class="page-search"
-                    ref="queryRef"
-                    v-model="state.formQuery"
-                    :columns="state.columns"
-                    :import-config="state.importConfig"
-                    :export-config="state.exportConfig"
-                    @on-change="loadData(true)"
-                    @imported="loadData(true)">
-                <!--  <template #extraQuery></template>
-                  <template #extraLeft></template>
-                  <template #extraRight></template>-->
-
-                <template #extraLeft>
-                    <ext-button name="创建"
-                                auth="'${firstLowPojoName}.add'" icon="ele-FolderAdd"
-                                size="default" type="success"
-                                class="ml10" @click="onRowClick('add',null)"/>
-                </template>
-            </ext-query-form>
-
-            <ext-table
-                    class="page-content"
-                    :height="state.tableData.height"
-                    :data-list="state.tableData.data"
-                    :columns="state.columns"
-                    :border="true"
-                    :loading="state.tableData.loading">
-            </ext-table>
-
-            ##            <el-affix position="bottom" :offset="48">
-            <ext-page class="page-pager" v-model="state.pageQuery" @change="loadData(false)"/>
-            ##            </el-affix>
-        </el-card>
-    </div>
-    <${pojoName}Dialog ref="${firstLowPojoName}DialogRef" @refresh="loadData(true)"/>
-</template>
-
-<script setup lang="ts" name="${pojoName}List">
-    import {defineAsyncComponent, reactive, onMounted, onBeforeMount, ref, getCurrentInstance,nextTick,onBeforeUnmount} from 'vue';
-    import {$body,$get} from "/@/utils/request";
-    import u from '/@/utils/u'
-    import {Msg} from "/@/utils/message";
-    import {Session} from "/@/utils/storage";
-
-    const {proxy}: any = getCurrentInstance();
-
-    import ExtPage from '/@/components/form/ExtPage.vue'
-    import ExtQueryForm from "/@/components/form/ExtAdminQueryForm.vue";
-    import ExtTable from "/@/components/form/ExtAdminTable.vue";
-
-    import mittBus from '/@/utils/mitt';
-
-    import {ElButton} from 'element-plus'
-
-
-    const ${pojoName}Dialog = defineAsyncComponent(() => import("/@/views/page/${pojoName}Dialog.vue"));
-
-    //定义引用
-    const queryRef = ref();
-    const ${firstLowPojoName}DialogRef = ref();
-
-    //定义变量
-    const state = reactive({
-        formQuery: {},
-        pageQuery: {
-            pageNum: 1,
-            pageSize: 10,
-            total: 0
-        },
-        tableData: {
-            height:500,
-            data: [] as Array < any >,
-            loading: false
-        },
-        importConfig: {},
-        exportConfig: {},
-        columns: [
-            {type: 'selection', width: 60, align: 'center', fixed: 'left'},
-            #foreach($ele in $fields)
-                #if($ele.dataType=="int" || $ele.dataType=="tinyint" )
-                    #if($ele.columnName =="status" ||$ele.columnName =="releaseStatus" )
-                        {label: '$ele.columnComment', prop: '$ele.columnName', sortable: 'custom', align: 'center', query: true, type: 'dict', cfg: {dict: '${pojoName}.status'}},
-                    #else
-                        {label: '$ele.columnComment', prop: '$ele.columnName', query: true, type: '', resizable: true},
-                    #end
-                #end
-                #if($ele.dataType=="json")
-                    {label: '$ele.columnComment', prop: '$ele.columnName', query: true, type: '', resizable: true},
-                #end
-                #if($ele.dataType=="char" || $ele.dataType=="varchar" )
-                    #if($ele.columnName =="title"||$ele.columnName=="name")
-                        {
-                            label: '$ele.columnComment', prop: '$ele.columnName', query: true, type: "text", resizable: true,
-                            render: (h: any, row: any) => {
-                                return h('div', null, [
-                                    h('div', {
-                                        style:{
-                                            cursor:'pointer',
-                                            color:'var(--el-color-primary-light-1)'
-                                        },
-                                        onClick: () => {
-                                            onRowClick('view', row)
-                                        }
-                                    }, row.name||row.title)])
-                            }
-                        },
-                    #end
-                    #if($ele.columnName !="title"&&$ele.columnName!="name")
-                        {label: '$ele.columnComment', prop: '$ele.columnName', query: true, type: 'text', resizable: true},
-                    #end
-                #end
-                #if($ele.dataType=="date" || $ele.dataType=="datetime" || $ele.dataType=="timestamp" )
-                    {label: '$ele.columnComment', prop: '$ele.columnName', query: true, sortable: 'custom', type: 'datetime', resizable: true, cfg: {format: (val: any) => u.fmt.fmtDate(val)}},
-                #end
-            #end
-            {                label: '操作', prop: 'action', type: 'render', width: 180, align: 'center', fixed: 'right',
-                render: (h: any, row: any) => {
-                    return (
-                            h('div', null, [
-                                proxy.$auth('${firstLowPojoName}.modify') ?
-                                        h(ElButton, {
-                                            type: 'warning',
-                                            text: true,
-                                            size: 'small',
-                                            onClick: () => {
-                                                onRowClick('edit', row)
-                                            }
-                                        }, () => '编辑') : '',
-                                proxy.$auth('${firstLowPojoName}.remove') ?
-                                        h(ElButton, {
-                                            type: 'danger',
-                                            text: true,
-                                            size: 'small',
-                                            onClick: () => {
-
-                                                onRowDel(row)
-                                            }
-                                        }, () => '删除') : '',
-                            ])
-                    )
-                }
-            }
-        ],
-    })
-
-        ## // 定义子组件向父组件传值/事件
-        ## const emit = defineEmits(['${pojoName}.edit']);
-
-    // 监听双向绑定 modelValue 的变化
-    // watch(
-    //         () => state.pageNum,
-    //         () => {
-    //
-    //         }
-    // );
-
-    //生命周期钩子
-    onBeforeMount(() => {
-        let token = Session.get("token")
-        let encodeToken = encodeURIComponent(token)
-        let exportUrl = `poi/export?type=${firstLowPojoName}&X-Token=${encodeToken}`
-        //导入导出参数配置
-        state.importConfig = {
-            auths: ['${firstLowPojoName}.add'],
-            url: `poi/import?type=${firstLowPojoName}&X-Token=${encodeToken}`,
-            template: `${exportUrl}&isTemplate=true`
-        }
-
-        state.exportConfig = {url: exportUrl,}
-
-    })
-
-    onMounted(() => {
-        loadData();
-
-        nextTick(()=>{
-            let bodyHeight = document.body.clientHeight;
-            let queryHeight = queryRef.value.$el.clientHeight;
-            state.tableData.height = bodyHeight - queryHeight - 220
-        })
-
-        //  mittBus.on("${firstLowPojoName}.refresh",()=>{
-        //     loadData();
-        // })
-    });
-
-    onBeforeUnmount(()=>{
-        //   mittBus.off("${firstLowPojoName}.refresh")
-    })
-
-
-    //region 方法区
-    // 初始化表格数据
-    const loadData = (refresh: boolean = false) => {
-        if (refresh) {
-            state.pageQuery.pageNum = 1;
-        }
-        state.tableData.loading = true;
-            $body(`/${firstLowPojoName}/list`, {...state.formQuery, ...state.pageQuery}).then((res: any) => {
-            let {list, count} = res;
-            state.tableData.data = list;
-            state.pageQuery.total = count;
-            state.tableData.loading = false;
-        }).catch(e => {
-            console.error(e)
-            state.tableData.loading = false;
-        })
-    };
-
-    // 打开弹窗
-    const onRowClick = (type: string, row: any) => {
-            ${firstLowPojoName}DialogRef.value.open(type, row);
-    };
-    // 删除
-    const onRowDel = (row: any) => {
-        Msg.confirm(`此操作将永久删除:『${row.name}』,是否继续?`).then(() => {
-                $get(`/${firstLowPojoName}/delete/${row.id}`).then(() => {
-                Msg.message("删除成功", 'success')
-            }).catch(() => {
-                Msg.message("删除失败", 'error')
-            })
-        });
-    };
-
-    //endregion
-
-
-    // 暴露变量
-    // defineExpose({
-    //     loadData,
-    // });
-</script>

+ 1 - 10
car-wash-admin/src/test/java/SpringTestCase.java

@@ -1,20 +1,11 @@
-import com.kym.admin.AdminApplication;
 import com.kym.service.admin.ActivityService;
-import com.kym.service.admin.impl.ActivityServiceImpl;
 import jakarta.annotation.Resource;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
 
 
-@SpringBootTest(classes = AdminApplication.class)
+//@SpringBootTest(classes = AdminApplication.class)
 public class SpringTestCase {
 
     @Resource
     private ActivityService activityService;
 
-    @Test
-    public void testActivityAsync() throws InterruptedException {
-        activityService.handleRechargeActivity(100001,1);
-        Thread.sleep(210*1000);
-    }
 }

+ 2 - 3
car-wash-admin/src/test/java/TestCase.java

@@ -1,14 +1,13 @@
 import cn.hutool.crypto.digest.DigestAlgorithm;
 import cn.hutool.crypto.digest.Digester;
 import cn.hutool.http.HttpUtil;
-import org.junit.jupiter.api.Test;
 
 import java.io.File;
 
 
 public class TestCase {
 
-    @Test
+//    @Test
     public void test1() {
         Digester MD5 = new Digester(DigestAlgorithm.MD5);
         String mobile = "15071072750";
@@ -17,7 +16,7 @@ public class TestCase {
         System.out.println(s);
     }
 
-    @Test
+//    @Test
     public void testPDF() {
         File f = new File("/data/home/zuy/01.pdf");
         HttpUtil.downloadFile("https://pay.wechatpay.cn/invoicing/fapiao/fapiao-file?token=AASkCcgAAAABAAAAAAAzwnqoYS46n1SlLY9LZSAAAABf4m5a0FKM5L7DnWkBpnsWBa_izWKMwHtR4d-e-BZcbJiO9Zp2_EqQBHFU1Sx4XNahl8QS826lV2C2FkLWjX456dPwJToQIQq5Q3zVyNoLKkh_kVpVFOz2saVVPkBvhU4rshjhZntlCjTAVFNzsY6uYDi-1XGHw6QnZoWFg8zUggWS8yN-6Bxc22R6JOO_CPDE6ih6uRZMQuDeSA&mchid=1635831469&openid=ox6fm6KbWb8Y8q0-xFs3kPREaPm8&invoice_code=144032309110&invoice_no=44452848&fapiao_id=1170499328033161216",f);

+ 0 - 49
car-wash-common/src/main/java/com/kym/common/utils/CommUtil.java

@@ -1,9 +1,6 @@
 package com.kym.common.utils;
 
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ReflectUtil;
-import com.google.common.collect.Lists;
-import com.kym.JacksonUtil;
 import com.kym.common.constant.ResponseEnum;
 import com.kym.common.exception.BusinessException;
 import org.slf4j.Logger;
@@ -13,7 +10,6 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -313,52 +309,7 @@ public class CommUtil {
         return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
     }
 
-    public static String print(Object obj) {
-        return isEmptyOrNull(obj) ? "" : JacksonUtil.toJSONString(obj);
-    }
-
-
-    public static String logNull2String(Object s) {
-        if (isEmptyOrNull(s)) {
-            return "";
-        }
-        if (isBasicType(s)) {
-            return s.toString().trim();
-        }
-        if (s instanceof Date) {
-            Date d = DateUtil.date((Date) s);
-            long time = d.getTime();
-            if (time % (24 * 3600 * 1000) == 57600000) {
-                return DateUtil.format(d, "yyyy-MM-dd");
-            } else {
-                return DateUtil.format(d, "yyyy-MM-dd HH:mm:ss");
-            }
-        }
-        if (s.getClass().isArray()) {
-            return JacksonUtil.toJSONString(s);
-        }
-        if (s instanceof Collection) {
-            List<String> names = Lists.newArrayList("name", "title");
-            List<String> strs = new ArrayList<>();
-            List<Map> list = JacksonUtil.toJavaObjectList(JacksonUtil.toJSONString(s), Map.class);
-            for (Map map : list) {
-                Object v = null;
-                for (String name : names) {
-                    if (null == v) {
-                        v = map.get(name);
-                    } else {
-                        break;
-                    }
-                }
-                if (null != v) {
-                    strs.add(v.toString());
-                }
-            }
-            return JacksonUtil.toJSONString(strs);
-        }
 
-        return "";
-    }
 
     /**
      * 反射获取对象的属性值

+ 0 - 6
car-wash-entity/pom.xml

@@ -19,12 +19,6 @@
 
     <dependencies>
 
-        <dependency>
-            <groupId>com.kym</groupId>
-            <artifactId>car-wash-jdbc</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-        </dependency>
-
 
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 2 - 46
car-wash-entity/src/main/java/com/kym/entity/admin/Feedback.java

@@ -2,15 +2,6 @@ package com.kym.entity.admin;
 
 
 import com.kym.entity.miniapp.Attachment;
-import com.kym.entity.miniapp.User;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.FK;
-import com.kym.jdbc.annotations.OP;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import com.kym.jdbc.annotations.QF;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -26,7 +17,6 @@ import java.util.List;
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
-@Entity(clz = Feedback.class, comment = "纠错反馈")
 public class Feedback implements Serializable {
 
     public static final int TYPE_ERROR = 1; //纠错
@@ -36,52 +26,34 @@ public class Feedback implements Serializable {
     public static final int STATUS_UNREPLY = 1; //未回复
     public static final int STATUS_REPLIED = 2; //已回复
 
-    @DBF(comment = "ID")
     private long id;
-    @DBF(comment = "反馈标题", max = 128)
     private String title;
-    @DBF(comment = "纠错类型", dict = "Feedback.type")
     private int type;
-    @DBF(comment = "详情描述", max = 512)
     private String content;
-    @DBF(comment = "附件清单")
     private List<Attachment> attachList;
-    @DBF(comment = "状态", dict = "Feedback.status")
     private int status;
 
-    @DBF(comment = "提交时间")
     private Date submitTime;
-    @FK(clz = User.class)
-    @DBF(comment = "提交人")
     private long submitUserId;
 
-    @DBF(comment = "回复内容", max = 512)
     private String replyContent;
-    @DBF(comment = "回复时间")
     private Date replyTime;
-    @FK(clz = AdminUser.class)
-    @DBF(comment = "提交人")
     private long replyUserId;
 
-    @DBF(comment = "创建时间")
     private Date createTime;
-    @DBF(comment = "更新时间")
     private Date updateTime;
 
     @Data
     @EqualsAndHashCode(callSuper = true)
     public static class FeedbackInfo extends Feedback {
-        @One(mkf = "submitUserId", tf = "name", comment = "创建人")
-        private String submitUserName;
 
         // @One(mkf = "updateBy", tf = "name", comment = "更新人")
         // private String updateName;
     }
 
     @Data
-    @EqualsAndHashCode(callSuper = true)
-    @QE(clz = FeedbackInfo.class)
-    public static class FeedbackBasicQuery extends BasicQuery {
+    @EqualsAndHashCode(callSuper = false)
+    public static class FeedbackBasicQuery  {
         private String content;
         private Long id;
         private long submitUserId;
@@ -92,22 +64,6 @@ public class Feedback implements Serializable {
         private long replyUserId;
 
         //region date query
-        @QF(op = OP.GTE, tf = "createTime")
-        private Date createTimeStart;
-        @QF(op = OP.LTE, tf = "createTime")
-        private Date createTimeEnd;
-        @QF(op = OP.GTE, tf = "replyTime")
-        private Date replyTimeStart;
-        @QF(op = OP.LTE, tf = "replyTime")
-        private Date replyTimeEnd;
-        @QF(op = OP.GTE, tf = "submitTime")
-        private Date submitTimeStart;
-        @QF(op = OP.LTE, tf = "submitTime")
-        private Date submitTimeEnd;
-        @QF(op = OP.GTE, tf = "updateTime")
-        private Date updateTimeStart;
-        @QF(op = OP.LTE, tf = "updateTime")
-        private Date updateTimeEnd;
         //endregion
 
 

+ 0 - 54
car-wash-jdbc/pom.xml

@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>com.kym</groupId>
-        <artifactId>car-wash</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>car-wash-jdbc</artifactId>
-    <modelVersion>4.0.0</modelVersion>
-    <version>0.0.1-SNAPSHOT</version>
-    <packaging>jar</packaging>
-
-    <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.validation</groupId>
-            <artifactId>jakarta.validation-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.mysql</groupId>
-            <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jdbc</artifactId>
-        </dependency>
-
-
-        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
-
-    </dependencies>
-</project>

+ 0 - 473
car-wash-jdbc/src/main/java/com/kym/DbUtil.java

@@ -1,473 +0,0 @@
-package com.kym;
-
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.Many;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * 描述:基础工具类 refelct、empty check
- * create at 2020/5/7 23:01
- *
- * @author yaop
- */
-public class DbUtil {
-    private static final Logger logger = LoggerFactory.getLogger(DbUtil.class);
-
-    private DbUtil() {
-    }
-
-
-    public static void asserts(boolean express, String errorMsg) {
-        if (!express) {
-            throw new RuntimeException(errorMsg);
-        }
-    }
-
-    public static int null2Int(Object val) {
-        if (null == val) {
-            return 0;
-        }
-        try {
-            return Integer.parseInt(val.toString());
-        } catch (Exception e) {
-            // do nothings
-        }
-        return 0;
-    }
-
-    public static boolean isGenericType(Type type) {
-        Class<?> t =  (Class) type;
-        return  t.isAssignableFrom(String.class)
-                ||t.isAssignableFrom(byte.class)
-                ||t.isAssignableFrom(Byte.class)
-                ||t.isAssignableFrom(boolean.class)
-                ||t.isAssignableFrom(Boolean.class)
-                ||t.isAssignableFrom(int.class)
-                ||t.isAssignableFrom(Integer.class)
-                ||t.isAssignableFrom(short.class)
-                ||t.isAssignableFrom(Short.class)
-                ||t.isAssignableFrom(long.class)
-                ||t.isAssignableFrom(Long.class)
-                ||t.isAssignableFrom(float.class)
-                ||t.isAssignableFrom(Float.class)
-                ||t.isAssignableFrom(double.class)
-                ||t.isAssignableFrom(Double.class)
-                ||t.isAssignableFrom(char.class)
-                ||t.isAssignableFrom(Character.class);
-//        return type == String.class || type == Integer.TYPE || type == Long.TYPE || type == Short.TYPE || type == Byte.TYPE
-//                || type == Boolean.TYPE || type == Character.TYPE || type == Float.TYPE || type == Double.TYPE;
-    }
-
-    public static boolean isGenericType(Object obj) {
-        if (obj instanceof Integer) {
-            return true;
-        } else if (obj instanceof Short) {
-            return true;
-        } else if (obj instanceof Float) {
-            return true;
-        } else if (obj instanceof Double) {
-            return true;
-        } else if (obj instanceof Byte) {
-            return true;
-        } else if (obj instanceof Boolean) {
-            return true;
-        } else if (obj instanceof Long) {
-            return true;
-        } else if (obj instanceof String) {
-            return true;
-        } else {
-            return obj instanceof Character;
-        }
-    }
-
-    /**
-     * 数据库持久化的字段
-     */
-    public static boolean isUsageField(Field f) {
-        if (f.isAnnotationPresent(DBF.class)) {
-            return true;
-        }
-        if (f.isAnnotationPresent(One.class) && !f.getAnnotation(One.class).noQuery()) {
-            return true;
-        }
-        return f.isAnnotationPresent(Many.class) && !f.getAnnotation(Many.class).noQuery();
-    }
-
-    public static boolean isStaticFinalField(Field f) {
-        int modifiers = f.getModifiers();
-        return Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers);
-    }
-
-    public static String firstToLowerCase(String str) {
-        return str.substring(0, 1).toLowerCase() + str.substring(1);
-    }
-
-    public static String getColumnName(String field) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = field.toCharArray();
-        for (char ch : chars) {
-            if (Character.isUpperCase(ch)) {
-                sbr.append("_").append(Character.toLowerCase(ch));
-            } else {
-                sbr.append(ch);
-            }
-        }
-        return sbr.toString();
-    }
-
-    public static Object getFieldValue(Object o, Field field) {
-
-        field.setAccessible(true);
-        Object val = null;
-        try {
-            val = field.get(o);
-        } catch (IllegalAccessException e) {
-            logger.error("SQLHelper ERR# Object getFieldValue,fileName:{}", field.getName());
-        }
-        field.setAccessible(false);
-        return val;
-    }
-
-    public static Object getFieldValue(Object bean, String fieldName) {
-        Object defValu = "";
-        try {
-            fieldName = getCamelName(fieldName);
-            Field field = null;
-            try {
-                field = bean.getClass().getDeclaredField(fieldName);
-            } catch (Exception e) {
-                try {
-                    field = bean.getClass().getField(fieldName);
-                } catch (Exception e1) {
-                    try {
-                        field = bean.getClass().getSuperclass().getDeclaredField(fieldName);
-                    } catch (Exception e2) {
-                        field = bean.getClass().getSuperclass().getField(fieldName);
-                    }
-                }
-            }
-
-            field.setAccessible(true);
-            defValu = field.get(bean);
-            if (null == defValu) {
-                Class<?> type = field.getType();
-                if (type == String.class) {
-                    defValu = "";
-                } else if (type == int.class || type == Integer.class) {
-                    defValu = 0;
-                } else if (type == double.class || type == Double.class) {
-                    defValu = 0d;
-                } else if (type == long.class || type == Long.class) {
-                    defValu = 0L;
-                } else if (type == float.class || type == Float.class) {
-                    defValu = 0F;
-                } else if (type == short.class || type == Short.class) {
-                    defValu = 0;
-                } else if (type == byte.class || type == Byte.class) {
-                    defValu = 0;
-                } else if (type == boolean.class || type == Boolean.class) {
-                    defValu = 0;
-                } else if (type == char.class || type == Character.class) {
-                    defValu = '0';
-                } else if (field.getType().isArray()) {
-                    defValu = new Object[]{};
-                }
-            }
-            field.setAccessible(false);
-        } catch (Exception e) {
-            logger.warn("SQLHandler ERR# getFieldValue ,field:{}, bean:{} ,msg:{}", fieldName, bean.getClass().getSimpleName(), e.getMessage());
-        }
-        return defValu;
-    }
-
-    public static String getCamelName(String fieldName) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = fieldName.toCharArray();
-        boolean preUpper = false;
-        for (char ch : chars) {
-            if ('_' == ch) {
-                preUpper = true;
-            } else {
-                if (preUpper) {
-                    sbr.append(Character.toUpperCase(ch));
-                    preUpper = false;
-                } else {
-                    sbr.append(ch);
-                }
-            }
-        }
-        return sbr.toString();
-    }
-
-    public static void setFieldValue(Object o, Field field, Object val) {
-        try {
-            field.setAccessible(true);
-            field.set(o, val);
-            field.setAccessible(false);
-        } catch (IllegalAccessException e) {
-            logger.error("SQLHelper ERR# Object setFieldValue ,fileName:{}", field.getName());
-        }
-    }
-
-
-    /**
-     * 判断集合是否为空
-     */
-    public static boolean isEmptyOrNull(Collection<?> collection) {
-        return null == collection || collection.isEmpty();
-    }
-
-
-    /**
-     * 判断数组是否为空
-     */
-    public static boolean isEmptyOrNull(Object[] array) {
-        return null == array || array.length == 0 || null == array[0];
-    }
-
-    /**
-     * 判断字符串是否为空
-     */
-    public static boolean isEmptyOrNull(String value) {
-
-        return null == value || value.isEmpty();
-    }
-
-    public static boolean isEmptyOrNull(Object value) {
-        if (null == value) {
-            return true;
-        }
-        if (value.getClass().isArray()) {
-            return Array.getLength(value) == 0;
-        } else if (value instanceof Collection) {
-            return ((Collection<?>) value).isEmpty();
-        } else if (value instanceof Map) {
-            return ((Map<?, ?>) value).isEmpty();
-        } else {
-            return isEmptyOrNull(value.toString());
-        }
-    }
-
-    public final static String regex = "(create\\s+(database|table|index)|truncate|drop\\s+(table|index|database)|alter\\s+(table|database)|update[\\s\\S]*set|insert[\\s\\S]*into|delete\\s+from|net user|xp_cmdshell|#)+\\s+";
-/*
-    public final static String regex = "'|and|exec|execute|insert|select|delete|update|count|drop|\\*|%|chr|mid|master|truncate|" +
-            "char|declare|sitename|net user|xp_cmdshell|;|or|-|\\+|,|like'|and|exec|execute|insert|create|drop|" +
-            "table|from|grant|use|group_concat|column_name|" +
-            "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|\\*|" +
-            "chr|mid|master|truncate|char|declare|or|;|-|--|\\+|,|like|//|/|%|#";
-*/
-
-    /**
-     * 把SQL关键字追加$字符串
-     */
-    public static String injectDefend(String param) {
-        if (param == null) {
-            return null;
-        }
-        // (?i)不区分大小写替换
-        return param.replaceAll("(?i)" + regex, "$0.");
-    }
-
-    /**
-     * 返回经过防注入处理的字符串
-     */
-    public static String fitlerSql(String sql) {
-        return injectDefend(sql);
-    }
-
-    /**
-     * 设置参数
-     *
-     * @param ps
-     * @param parameters
-     */
-    public static void setParameter(PreparedStatement ps, Object... parameters) throws SQLException {
-        if (parameters == null || parameters.length == 0) {
-            return;
-        }
-        int i = 1;
-        for (Object o : parameters) {
-            if (o == null) {
-                ps.setString(i++, null);
-                continue;
-            }
-            if (o instanceof String) {
-                ps.setString(i++, ((String) o));
-                continue;
-            }
-            if (o instanceof Date date) {
-                ps.setTimestamp(i++, new Timestamp(date.getTime()));
-                continue;
-            }
-            // Integer
-            if (o instanceof Integer) {
-                ps.setInt(i++, ((Integer) o));
-                continue;
-            }
-            if (o instanceof Double) {
-                ps.setDouble(i++, ((Double) o));
-                continue;
-            }
-            if (o instanceof Float) {
-                ps.setFloat(i++, ((Float) o));
-                continue;
-            }
-            if (o instanceof BigDecimal) {
-                ps.setBigDecimal(i++, ((BigDecimal) o));
-                continue;
-            }
-            if (o instanceof Long) {
-                ps.setLong(i++, ((Long) o));
-                continue;
-            }
-            if (o instanceof Short) {
-                ps.setShort(i++, ((Short) o));
-                continue;
-            }
-            if (o instanceof Byte) {
-                ps.setByte(i++, ((Byte) o));
-                continue;
-            }
-            if (o instanceof byte[]) {
-                ps.setBytes(i++, ((byte[]) o));
-                continue;
-            }
-            if (o instanceof Boolean) {
-                ps.setBoolean(i++, ((Boolean) o));
-                continue;
-            }
-
-            if (o.getClass().isArray()) {
-                ps.setString(i++, JacksonUtil.toJSONString(o));
-                continue;
-            }
-
-            if (List.class.isAssignableFrom(o.getClass())) {
-                ps.setString(i++, JacksonUtil.toJSONString(o));
-                continue;
-            }
-
-            if (Set.class.isAssignableFrom(o.getClass())) {
-                ps.setString(i++, JacksonUtil.toJSONString(o));
-                continue;
-            }
-
-            if (Map.class.isAssignableFrom(o.getClass())) {
-                ps.setString(i++, JacksonUtil.toJSONString(o));
-                continue;
-            }
-
-            if (isGenericType(o.getClass())) {
-                ps.setString(i++, JacksonUtil.toJSONString(o));
-                continue;
-            }
-
-            logger.info("SetParameter PreparedStatement SQL  type:{},value:{}", o.getClass().getName(), JacksonUtil.toJSONString(o));
-//            throw new IllegalArgumentException("unsupported type:" + o.getClass());
-            ps.setString(i++,JacksonUtil.toJSONString(o));
-        }
-    }
-
-
-    private static void recursiveFields(Class<?> clz, Set<Field> fieldSet) {
-        if(null==clz){
-            return;
-        }
-        Field[] fields = clz.getDeclaredFields();
-        if (!isEmptyOrNull(fields)) {
-            for (Field f : fields) {
-                if (isUsageField(f)) {
-                    fieldSet.add(f);
-                }
-            }
-        }
-        Entity annotation = clz.getDeclaredAnnotation(Entity.class);
-        if (null == annotation) {
-            recursiveFields(clz.getSuperclass(), fieldSet);
-        }
-    }
-
-    public static Field getField(Object bean, String fieldName) throws NoSuchFieldException {
-        Field field = null;
-        int loop = 0;
-        Class<?> clz = bean.getClass();
-        while (loop < 10) {
-            try {
-                loop++;
-                return clz.getDeclaredField(fieldName);
-            } catch (Exception e) {
-                clz = clz.getSuperclass();
-            }
-            if(null==clz){
-                throw new NoSuchFieldException(fieldName);
-            }
-        }
-        throw new NoSuchFieldException(fieldName);
-    }
-
-    public static Set<Field> getEntityFields(Class<?> clz) {
-        Set<Field> fields = new HashSet<>();
-        recursiveFields(clz, fields);
-        return fields;
-    }
-
-
-    public static Set<Field> getQueryFields(Class<?> clz) {
-        Set<Field> fields = new HashSet<>();
-        if (clz.getName().equals("BasicQuery")) {
-            return new HashSet<>(Arrays.asList(clz.getFields()));
-        }
-        QE annotation = clz.getDeclaredAnnotation(QE.class);
-        if (null != annotation) {
-            Field[] fields1 = clz.getFields();
-            if (!isEmptyOrNull(fields1)) {
-                for (Field f : fields1) {
-                    if (!isStaticFinalField(f)) {
-                        fields.add(f);
-                    }
-                }
-            }
-            Field[] fields2 = clz.getDeclaredFields();
-            if (!isEmptyOrNull(fields2)) {
-                for (Field f : fields2) {
-                    if (!isStaticFinalField(f)) {
-                        fields.add(f);
-                    }
-                }
-            }
-        }
-        return fields;
-    }
-
-    public static void main(String[] args) {
-        System.out.println(fitlerSql("droptable t_state"));
-        System.out.println(fitlerSql("update t_state set "));
-        System.out.println(fitlerSql("drop table t_state"));
-        System.out.println(fitlerSql("DROP table t_state"));
-        System.out.println(fitlerSql("Drop Table t_state"));
-        System.out.println(fitlerSql("alter table t_state"));
-        System.out.println(fitlerSql("delete from  table t_state"));
-        System.out.println(fitlerSql(".lete from  -- table t_state"));
-        System.out.println(fitlerSql("truncate table t_state -- '' delete from t"));
-    }
-}

+ 0 - 175
car-wash-jdbc/src/main/java/com/kym/JacksonUtil.java

@@ -1,175 +0,0 @@
-package com.kym;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-
-/**
- * jackson工具类,替换fastjson漏洞太多频繁升级
- *
- * @author yaop
- */
-public class JacksonUtil {
-
-    private static final Logger log = LoggerFactory.getLogger(JacksonUtil.class);
-
-    private static final ObjectMapper mapper;
-
-    private JacksonUtil() {
-    }
-
-    static {
-        mapper = new ObjectMapper();
-        // 如果json中有新增的字段并且是实体类类中不存在的,不报错
-        // mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
-        // 如果存在未知属性,则忽略不报错
-        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        // 允许key没有双引号
-        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
-        // 允许key有单引号
-        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-        // 允许整数以0开头
-        mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
-        // 允许字符串中存在回车换行控制符
-        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
-    }
-
-    public static String toJSONString(Object obj) {
-        return obj != null ? toJSONString(obj, () -> "") : "";
-    }
-
-    public static String toJSONString(Object obj, Supplier<String> defaultSupplier) {
-        try {
-            return obj != null ? mapper.writeValueAsString(obj) : defaultSupplier.get();
-        } catch (Throwable e) {
-            log.error(String.format("toJSONString %s", obj != null ? obj.toString() : "null"), e);
-        }
-        return defaultSupplier.get();
-    }
-
-    public static <T> T toJavaObject(String value, Class<T> tClass) {
-        return !DbUtil.isEmptyOrNull(value) ? toJavaObject(value, tClass, () -> null) : null;
-    }
-
-    public static <T> T toJavaObject(Object obj, Class<T> tClass) {
-        return obj != null ? toJavaObject(toJSONString(obj), tClass, () -> null) : null;
-    }
-
-    public static <T> T toJavaObject(String value, Class<T> tClass, Supplier<T> defaultSupplier) {
-        try {
-            if (DbUtil.isEmptyOrNull(value)) {
-                return defaultSupplier.get();
-            }
-            return mapper.readValue(value, tClass);
-        } catch (Throwable e) {
-            log.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e);
-        }
-        return defaultSupplier.get();
-    }
-
-    public static <T> List<T> toJavaObjectList(String value, Class<T> tClass) {
-        return !DbUtil.isEmptyOrNull(value) ? toJavaObjectList(value, tClass, () -> null) : null;
-    }
-
-    public static <T> List<T> toJavaObjectList(Object obj, Class<T> tClass) {
-        return obj != null ? toJavaObjectList(toJSONString(obj), tClass, () -> null) : null;
-    }
-
-    public static <T> List<T> toJavaObjectList(String value, Class<T> tClass, Supplier<List<T>> defaultSupplier) {
-        try {
-            if (DbUtil.isEmptyOrNull(value)) {
-                return defaultSupplier.get();
-            }
-           /* if(value.contains("\"")){
-                value = value.replaceAll("\"","\\\\\"");
-            }*/
-            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, tClass);
-            return mapper.readValue(value, javaType);
-        } catch (Throwable e) {
-            log.error(String.format("toJavaObjectList exception value: \n%s\n class:%s", value, tClass), e);
-        }
-        return defaultSupplier.get();
-    }
-
-    /**
-     * 简单地直接用json复制或者转换(Cloneable)
-     *
-     */
-    public static <T> T jsonCopy(Object obj, Class<T> tClass) {
-        return obj != null ? toJavaObject(toJSONString(obj), tClass) : null;
-    }
-
-    public static Map<String, Object> toMap(String value) {
-        return !DbUtil.isEmptyOrNull(value) ? toMap(value, () -> null) : null;
-    }
-
-    public static Map<String, Object> toMap(Object value) {
-        return value != null ? toMap(value, () -> null) : null;
-    }
-
-    public static Map<String, Object> toMap(Object value, Supplier<Map<String, Object>> defaultSupplier) {
-        if (value == null) {
-            return defaultSupplier.get();
-        }
-        try {
-            if (value instanceof Map) {
-                return (Map<String, Object>) value;
-            }
-        } catch (Exception e) {
-            log.info("fail to convert" + toJSONString(value), e);
-        }
-        return toMap(toJSONString(value), defaultSupplier);
-    }
-
-    public static Map<String, Object> toMap(String value, Supplier<Map<String, Object>> defaultSupplier) {
-        if (DbUtil.isEmptyOrNull(value)) {
-            return defaultSupplier.get();
-        }
-        try {
-            return toJavaObject(value, LinkedHashMap.class);
-        } catch (Exception e) {
-            log.error(String.format("toMap exception\n%s", value), e);
-        }
-        return defaultSupplier.get();
-    }
-
-
-    public static List<Object> toList(String value) {
-        return !DbUtil.isEmptyOrNull(value) ? toList(value, () -> null) : null;
-    }
-
-    public static List<Object> toList(Object value) {
-        return value != null ? toList(value, () -> null) : null;
-    }
-
-    public static List<Object> toList(String value, Supplier<List<Object>> defaultSuppler) {
-        if (DbUtil.isEmptyOrNull(value)) {
-            return defaultSuppler.get();
-        }
-        try {
-            return toJavaObject(value, List.class);
-        } catch (Exception e) {
-            log.error("toList exception\n" + value, e);
-        }
-        return defaultSuppler.get();
-    }
-
-    public static List<Object> toList(Object value, Supplier<List<Object>> defaultSuppler) {
-        if (value == null) {
-            return defaultSuppler.get();
-        }
-        if (value instanceof List) {
-            return (List<Object>) value;
-        }
-        return toList(toJSONString(value), defaultSuppler);
-    }
-
-}

+ 0 - 32
car-wash-jdbc/src/main/java/com/kym/jdbc/BasicQuery.java

@@ -1,32 +0,0 @@
-package com.kym.jdbc;
-
-
-import com.kym.jdbc.annotations.QF;
-
-
-public class BasicQuery {
-    public static final int SORT_ASC = 1;
-    public static final int SORT_DESC = 2;
-
-    public Long orgId;
-
-    @QF(ignore = true)
-    public int pageIndex = 1;
-
-    @QF(ignore = true)
-    public int pageSize = 20;
-
-    @QF(ignore = true)
-    public String[] sortFields;
-
-    public String[] includeFields;
-
-    public String[] excludeFields;
-
-    public boolean skipHook; //跳过钩子
-
-
-    public BasicQuery() {
-
-    }
-}

+ 0 - 37
car-wash-jdbc/src/main/java/com/kym/jdbc/Bean.java

@@ -1,37 +0,0 @@
-package com.kym.jdbc;
-
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.List;
-
-
-/**
- * 自定义分页对象
- *
- * @author yaopeng
- * @date 2018/1/17 16:28
- */
-public class Bean<T> implements Serializable {
-    @Serial
-    private static final long serialVersionUID = 1L;
-    public long count;
-    public int pageIndex;
-    public int pageSize;
-    public List<T> list;
-
-    public Bean() {
-    }
-
-    public Bean(List<T> list) {
-        this.list = list;
-        this.count = list.size();
-    }
-
-    public Bean(List<T> list, long count, int pageIndex, int pageSize) {
-        this.pageIndex = pageIndex;
-        this.pageSize = pageSize;
-        this.list = list;
-        this.count = count;
-    }
-}

+ 0 - 9
car-wash-jdbc/src/main/java/com/kym/jdbc/DbException.java

@@ -1,9 +0,0 @@
-package com.kym.jdbc;
-
-import org.springframework.dao.DataAccessException;
-
-public class DbException extends DataAccessException {
-    public DbException(String msg) {
-        super(msg);
-    }
-}

+ 0 - 7
car-wash-jdbc/src/main/java/com/kym/jdbc/IBuilder.java

@@ -1,7 +0,0 @@
-package com.kym.jdbc;
-
-/**
- * 查询构造器基类
- */
-public class IBuilder {
-}

+ 0 - 30
car-wash-jdbc/src/main/java/com/kym/jdbc/IHandler.java

@@ -1,30 +0,0 @@
-package com.kym.jdbc;
-
-/**
- * sql handler类型
- */
-public interface IHandler {
-    String MYBATIS = "mybatis";
-    String JPA = "jpa";
-    String HIBERNATE = "hibernate";
-    String JDBC = "jdbcTemplate";
-    String MONGO = "mongoTemplate";
-
-
-     int DIALECT_MYSQL = 1;
-     int DIALECT_MSSQL = 2;
-     int DIALECT_ORACLE = 3;
-     int DIALECT_PGSQL = 4;
-     int DIALECT_DB2 = 5;
-     int DIALECT_H2 = 6;
-     int DIALECT_SQLITE = 7;
-     int DIALECT_RDJC = 8;
-     int DIALECT_DAME = 9;
-
-    /**
-     * 获取当前持久层框架类型
-     *
-     * @return
-     */
-    String getHandlerType();
-}

+ 0 - 879
car-wash-jdbc/src/main/java/com/kym/jdbc/OBuilder.java

@@ -1,879 +0,0 @@
-package com.kym.jdbc;
-
-import com.kym.DbUtil;
-import com.kym.jdbc.annotations.QF;
-import com.kym.jdbc.lambda.ColumnFunc;
-import com.kym.jdbc.lambda.DefaultLambdaParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
-/**
- * 查询条件builder,针对结构化查询关系数据库
- *
- * @author asynll
- */
-public class OBuilder extends IBuilder {
-    private static Logger logger = LoggerFactory.getLogger(OBuilder.class);
-
-    public static int dialect;
-
-    private static final String SORT = "Sort";
-    /**
-     * 查询条件
-     */
-    private List<Where> wheres = new LinkedList<>();
-    /**
-     * 分组字段
-     */
-    private List<String> groupBys = new ArrayList<>();
-    /**
-     * 排序map
-     */
-    private static Map<Integer, String> sortMap = new HashMap<>(16);
-    /**
-     * 排序集合,奇数 -升序   偶数-降序  值越大越靠后
-     */
-    private List<String> orderBys = new ArrayList<>();
-    /**
-     * left join xxx  t1 on t1.xx  = l.f1
-     */
-    private List<String> joins = new ArrayList<>();
-    /**
-     * 查询分组  () or/and ()
-     */
-    private List<Group> groups = new ArrayList<>();
-    /**
-     * 分页索引起点
-     */
-    private int limitStart = 0;
-    private int limitDelta = -1;
-    /**
-     * 互斥锁,使用时注意锁索引,否则会增大死锁几率
-     */
-    public boolean forUpdate;
-    /**
-     * 共享锁,不建议使用
-     */
-    public boolean forShare;
-
-
-    private OBuilder() {
-    }
-
-    public static OBuilder build() {
-        sortMap = new HashMap<>();
-        return new OBuilder();
-    }
-
-    public static OBuilder toBuilder(BasicQuery query) {
-        OBuilder builder = new OBuilder();
-        Set<Field> fields = DbUtil.getQueryFields(query.getClass());
-//        Field[] fields = query.getClass().getFields();
-        for (Field field : fields) {
-            if (Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers())) {
-                continue;
-            }
-            Object val = DbUtil.getFieldValue(query, field);
-            if (!DbUtil.isEmptyOrNull(val)) {
-                Class<?> type = field.getType();
-                String fieldName = field.getName();
-                if (fieldName.endsWith(SORT) && type.equals(Integer.class)) {
-                    fieldName = fieldName.split(SORT)[0];
-                    int sortValue = DbUtil.null2Int(val);
-                    if (sortValue % 2 == BasicQuery.SORT_ASC) {
-//                        builder.asc(fieldName);
-                        sortMap.put(DbUtil.null2Int(val), String.format(" %s asc ", columnName(fieldName)));
-                    } else {
-//                        builder.desc(fieldName);
-                        sortMap.put(DbUtil.null2Int(val), String.format(" %s desc ", columnName(fieldName)));
-                    }
-
-                } else if (type.equals(String.class)) {
-                    builder.like(fieldName, val);
-                } else if (type.equals(Integer.class) || type.equals(Short.class) || type.equals(Long.class)) {
-                    builder.eq(fieldName, val);
-                } else {
-                    boolean annoPersent = field.isAnnotationPresent(QF.class);
-                    if (annoPersent) {
-                        QF qf = field.getAnnotation(QF.class);
-                        String op = qf.op();
-                        String sql = qf.sql();
-                        if (!DbUtil.isEmptyOrNull(op)) {
-                            builder.and(qf.tf(), op, val);
-                        } else if (!DbUtil.isEmptyOrNull(sql)) {
-                            builder.sql(sql, val);
-                        } else if ("sortFields".equals(fieldName)) {
-                            String[] sorts = (String[]) val;
-                            for (String sort : sorts) {
-                                int sortVal = DbUtil.null2Int(DbUtil.getFieldValue(query, sort));
-                                if (sortVal > 0) {
-                                    if (sortVal % 2 == BasicQuery.SORT_ASC) {
-                                        sortMap.put(DbUtil.null2Int(val), String.format(" %s asc ", DbUtil.getColumnName(sort.substring(0, sort.length() - 4))));
-                                    } else {
-                                        sortMap.put(DbUtil.null2Int(sortVal), String.format(" %s desc ", DbUtil.getColumnName(sort.substring(0, sort.length() - 4))));
-                                    }
-                                }
-                               /* if (null!=sortVal) {
-                                    if(BasicQuery.SORT_ASC==Integer.parseInt(sortVal.toString())){
-                                        builder.orderBy(String.format("%s asc ",));
-                                    }else if(BasicQuery.SORT_DESC==Integer.parseInt(sortVal.toString())){
-                                        builder.orderBy(String.format("%s desc ", DbUtil.getColumnName(sort.substring(0, sort.length() - 4))));
-                                    }
-                                }*/
-                            }
-                        } else if ("pageSize".equals(fieldName)) {
-                            int pageSize = (int) val;
-                            if (pageSize > 0) {
-                                int pageIndex = (int) DbUtil.getFieldValue(query, "pageIndex");
-                                builder.limit(Math.max(0, (pageIndex - 1) * pageSize), pageSize);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        if (!DbUtil.isEmptyOrNull(sortMap)) {
-            Set<Integer> integers = sortMap.keySet();
-            List<Integer> sorts = new ArrayList<>(integers);
-            sorts.sort(Comparator.comparingInt(o -> o));
-            sorts.forEach(k -> builder.orderByNative(sortMap.get(k)));
-        }
-        return builder;
-    }
-
-
-    public String toSql() {
-        StringBuilder sbr = new StringBuilder(" and 1=1 ");
-        //where
-        if (!DbUtil.isEmptyOrNull(wheres)) {
-            for (Where wh : wheres) {
-                if (DbUtil.isEmptyOrNull(wh.sql)) {
-                    sbr.append(DbUtil.getColumnName(wh.key)).append(" ").append(wh.op);
-                    String op = wh.op;
-                    Object value = wh.value;
-                    if ("in".equals(op.trim()) || "not in".equals(op.trim())) {
-                        sbr.append("(");
-                        for (int i = 0; i < Array.getLength(value); i++) {
-                            Object v = Array.get(value, i);
-                            if (v.getClass() == String.class) {
-                                sbr.append("'").append(v).append("'");
-                            } else {
-                                sbr.append(v);
-                            }
-                            if (i != Array.getLength(value) - 1) {
-                                sbr.append(",");
-                            }
-                        }
-                        sbr.append(")");
-                    } else {
-                        if (value.getClass() == String.class) {
-                            sbr.append("'").append(value).append("'");
-                        } else if (wh.value.getClass() == Date.class) {
-                            sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'");
-                        } else {
-                            sbr.append(value);
-                        }
-                    }
-                } else {
-                    //sql
-                    String whereSql = wh.sql;
-                    sbr.append(" (");
-                    List<Object> values = wh.sqlValues;
-                    if (!DbUtil.isEmptyOrNull(values)) {
-                        if (whereSql.contains("?")) {
-                            String regex = "\\?";
-                            for (Object o : values) {
-                                if (o.getClass() == String.class) {
-                                    whereSql = whereSql.replaceFirst(regex, "'" + o + "'");
-                                } else if (o.getClass() == Date.class) {
-                                    whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
-                                } else {
-                                    whereSql = whereSql.replaceFirst(regex, o.toString());
-                                }
-                            }
-                        }
-                    }
-                    sbr.append(whereSql);
-                    sbr.append(") ");
-                }
-            }
-        }
-
-        //group by
-        if (!DbUtil.isEmptyOrNull(groupBys)) {
-            sbr.append(" group by ");
-            groupBys.forEach(group -> sbr.append(group).append(" ,"));
-            sbr.deleteCharAt(sbr.length() - 1);
-        }
-        //order by
-        if (!DbUtil.isEmptyOrNull(orderBys)) {
-            sbr.append(" order by ");
-            orderBys.forEach(order -> sbr.append(order).append(" ,"));
-            sbr.deleteCharAt(sbr.length() - 1);
-        }
-        //limit
-        if (limitDelta > 0) {
-            sbr.append(" limit ");
-            if (limitStart > 0) {
-                sbr.append(limitStart).append(",");
-            }
-            sbr.append(limitDelta);
-        }
-
-        //for update
-        if (forUpdate) {
-            sbr.append(" for update ");
-        }
-
-        if (forShare) {
-            sbr.append(" with share mode ");
-        }
-
-        return sbr.toString();
-    }
-
-    public String toSql(BasicQuery query) {
-        return toBuilder(query).toSql();
-    }
-
-
-    public <T> OBuilder ne(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "<>", value);
-    }
-
-    public <T> OBuilder ne(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        return expect ? this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "<>", value) : this;
-    }
-
-    public OBuilder ne(String key, Object value) {
-        return this.and(key, "<>", value);
-    }
-
-    //TODO 转换表达式
-    public OBuilder eq(String key, Object value) {
-        return this.and(key, "=", value);
-    }
-
-    public <T> OBuilder eq(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        String key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        return expect ? this.and(key, "=", value) : this;
-    }
-
-    public <T> OBuilder eq(ColumnFunc<T, ?> keyExtractor, Object value) {
-        String key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        return this.and(key, "=", value);
-    }
-
-    private OBuilder and(String key, String op, Object value) {
-        Where w = new Where();
-        w.key = columnName(key);
-        w.op = " " + op + " ";
-        w.value = value;
-        boolean isExist = false;
-        for (Where where : wheres) {
-            if (!DbUtil.isEmptyOrNull(where.key)&&where.key.equals(key)) {
-                where.op = op;
-                where.value = value;
-                isExist = true;
-                break;
-            }
-        }
-        if (!isExist) {
-            wheres.add(w);
-        }
-        return this;
-    }
-
-
-    public OBuilder in(String key, Object[] values) {
-        if (DbUtil.isEmptyOrNull(values)) {
-            throw new IllegalArgumentException("empty values for in operation");
-        }
-        Where w = new Where();
-        w.key = key;
-        w.op = " in ";
-        w.value = values;
-        wheres.add(w);
-        return this;
-    }
-
-
-    public <T> OBuilder in(ColumnFunc<T, ?> keyExtractor, Object[] values) {
-        if (DbUtil.isEmptyOrNull(values)) {
-            throw new IllegalArgumentException("empty values for in operation");
-        }
-        Where w = new Where();
-        w.key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        w.op = " in ";
-        w.value = values;
-        wheres.add(w);
-        return this;
-    }
-
-    public <T> OBuilder in(boolean expect, ColumnFunc<T, ?> keyExtractor, Object[] values) {
-        if (!expect) {
-            return this;
-        }
-        if (DbUtil.isEmptyOrNull(values)) {
-            throw new IllegalArgumentException("empty values for in operation");
-        }
-        Where w = new Where();
-        w.key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        w.op = " in ";
-        w.value = values;
-        wheres.add(w);
-        return this;
-    }
-
-
-    public <T> OBuilder jex(boolean expect, ColumnFunc<T, ?> keyExtractor, String path, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return jex(keyExtractor, path, value);
-    }
-
-    /**
-     * json 查询字段值等于 json_extract
-     * <p>
-     * select * from t  where cfg::jsonb->>'ww' ='6'
-     *
-     * @param keyExtractor
-     * @param <T>
-     * @return
-     */
-    public <T> OBuilder jex(ColumnFunc<T, ?> keyExtractor, String path, Object value) {
-        if (DbUtil.isEmptyOrNull(value)) {
-            throw new IllegalArgumentException("empty value for in operation");
-        }
-        Where w = new Where();
-        String key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        key = DbUtil.getColumnName(key);
-        w.sqlValues = new LinkedList<>();
-        String baseSQL = " json_unquote(json_extract(`" + key + "`,?))  = '?' ";
-        if (dialect == IHandler.DIALECT_MYSQL) {
-            //默认的方言类型
-        } else if (dialect == IHandler.DIALECT_PGSQL) {
-            baseSQL = "  " + key + "::jsonb ->> ? = '?' ";
-        } else {
-            throw new IllegalStateException("unsupported dialect");
-        }
-        w.sqlValues.add(path);
-        w.sqlValues.add(value);
-        w.sql = baseSQL;
-        wheres.add(w);
-        return this;
-    }
-
-
-    public <T> OBuilder jin(boolean expect, ColumnFunc<T, ?> keyExtractor, List<Object> values) {
-        if (!expect) {
-            return this;
-        }
-        return jin(keyExtractor, values, true);
-    }
-
-    public <T> OBuilder jin(ColumnFunc<T, ?> keyExtractor, List<Object> values) {
-        return jin(keyExtractor, values, true);
-    }
-
-    public <T> OBuilder jin(boolean expect, ColumnFunc<T, ?> keyExtractor, Collection<?> values, boolean and) {
-        if (!expect) {
-            return this;
-        }
-        return jin(keyExtractor, values, and);
-    }
-
-    /**
-     * json数组查询 json_contains 判断是否包含在数组中
-     *
-     * @param keyExtractor
-     * @param values
-     * @param and          多参数的连接方式 ,默认and连接
-     * @param <T>
-     * @return
-     */
-    public <T> OBuilder jin(ColumnFunc<T, ?> keyExtractor, Collection<?> values, boolean and) {
-        if (DbUtil.isEmptyOrNull(values)) {
-            throw new IllegalArgumentException("empty values for in operation");
-        }
-        Where w = new Where();
-        String key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        key = DbUtil.getColumnName(key);
-        int length = values.size();
-        StringBuilder sbr = new StringBuilder();
-        w.sqlValues = new LinkedList<>();
-        String baseSQL;
-        if (dialect == IHandler.DIALECT_MYSQL) {
-            baseSQL = " json_contains(`" + key + "`,JSON_ARRAY('?')) ";
-            //默认的方言类型
-        } else if (dialect == IHandler.DIALECT_PGSQL) {
-            baseSQL = "  " + key + "::jsonb @> '?' ";
-        } else {
-            baseSQL = " json_contains(`" + key + "`,JSON_ARRAY('?')) ";
-            throw new IllegalStateException("unsupported dialect");
-        }
-        w.sqlValues.addAll(values);
-        w.sql = values.stream().map(k -> baseSQL).collect(Collectors.joining(and ? "AND" : "OR"));
-       /* for (int i = 0; i < length; i++) {
-            for (Object value : values) {
-                w.sqlValues.add(value);
-                if (i != length - 1) {
-                    sbr.append(baseSQL).append(and ? "AND" : "OR");
-                } else {
-                    sbr.append(baseSQL);
-                }
-            }
-        }*/
-//        w.sql = sbr.toString();
-        wheres.add(w);
-        return this;
-    }
-
-
-    public <T> OBuilder jov(boolean expect, ColumnFunc<T, ?> keyExtractor, Collection<?> values) {
-        if (!expect) {
-            return this;
-        }
-        return jov(keyExtractor, values);
-    }
-
-    /**
-     * json数组查询 JSON_OVERLAPS 判断是否有数组 交集
-     *
-     * @param keyExtractor
-     * @param values
-     * @param <T>
-     * @return
-     */
-    public <T> OBuilder jov(ColumnFunc<T, ?> keyExtractor, Collection<?> values) {
-        if (DbUtil.isEmptyOrNull(values)) {
-            throw new IllegalArgumentException("empty values for in operation");
-        }
-        Where w = new Where();
-        String key = DefaultLambdaParser.getPropertyName(keyExtractor);
-        key = DbUtil.getColumnName(key);
-        StringBuilder sbr = new StringBuilder();
-        w.sqlValues = new LinkedList<>();
-
-        //MYSQL> 8.0.17
-        if (dialect == IHandler.DIALECT_MYSQL) {
-            String baseSQL = " JSON_OVERLAPS(`" + key + "`,JSON_ARRAY('?'))  = 1";
-            //默认的方言类型
-            sbr.append(baseSQL);
-        } else if (dialect == IHandler.DIALECT_PGSQL) {
-            String baseSQL = "  " + key + "::jsonb && jsonb_build_array('?') ";
-            sbr.append(baseSQL);
-        } else {
-            throw new IllegalStateException("unsupported dialect");
-        }
-        w.sqlValues = new LinkedList<>(values);
-        w.sql = sbr.toString();
-        wheres.add(w);
-        return this;
-    }
-
-
-    public OBuilder notIn(String key, Object[] values) {
-        Where w = new Where();
-        w.key = key;
-        w.op = " not in ";
-        w.value = values;
-        wheres.add(w);
-        return this;
-    }
-
-    public <T> OBuilder notIn(boolean expect, ColumnFunc<T, ?> keyExtractor, Object[] values) {
-        if (!expect) {
-            return this;
-        }
-        return notIn(keyExtractor, values);
-    }
-
-
-    public <T> OBuilder notIn(ColumnFunc<T, ?> keyExtractor, Object[] values) {
-        Where w = new Where();
-        w.key = DbUtil.getColumnName(DefaultLambdaParser.getPropertyName(keyExtractor));
-        w.op = " not in ";
-        w.value = values;
-        wheres.add(w);
-        return this;
-    }
-
-    public OBuilder llike(String key, Object value) {
-        return this.and(key, "like", value.toString() + "%");
-    }
-
-
-    public <T> OBuilder llike(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return llike(keyExtractor, value);
-    }
-
-    public <T> OBuilder llike(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "like", value.toString() + "%");
-    }
-
-    /**
-     * 模糊匹配,不走索引慎重使用
-     */
-    public OBuilder like(String key, Object value) {
-        return this.and(key, "like", "%" + value.toString() + "%");
-    }
-
-    public <T> OBuilder like(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return like(keyExtractor, value);
-    }
-
-    public <T> OBuilder like(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "like", "%" + value.toString() + "%");
-    }
-
-
-    /**
-     * 右匹配,不走索引慎重使用
-     */
-    public OBuilder rlike(String key, Object value) {
-        return this.and(key, "like", "%" + value.toString());
-    }
-
-    public <T> OBuilder rlike(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return rlike(keyExtractor, value);
-    }
-
-    public <T> OBuilder rlike(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "like", "%" + value.toString());
-    }
-
-
-    public OBuilder lt(String key, Object value) {
-        return this.and(key, "<", value);
-    }
-
-    public <T> OBuilder lt(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return lt(keyExtractor, value);
-    }
-
-    public <T> OBuilder lt(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "<", value);
-    }
-
-    public OBuilder lte(String key, Object value) {
-        return this.and(key, "<=", value);
-    }
-
-    public <T> OBuilder lte(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return lte(keyExtractor, value);
-    }
-
-    public <T> OBuilder lte(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), "<=", value);
-    }
-
-    public OBuilder gte(String key, Object value) {
-        return this.and(key, ">=", value);
-    }
-
-    public <T> OBuilder gte(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return gte(keyExtractor, value);
-    }
-
-    public <T> OBuilder gte(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(DefaultLambdaParser.getPropertyName(keyExtractor), ">=", value);
-    }
-
-    /**
-     * 大于
-     */
-    public OBuilder gt(String key, Object value) {
-        return this.and(key, ">", value);
-    }
-
-    public <T> OBuilder gt(boolean expect, ColumnFunc<T, ?> keyExtractor, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return gt(keyExtractor, value);
-    }
-
-    public <T> OBuilder gt(ColumnFunc<T, ?> keyExtractor, Object value) {
-        return this.and(columnName(DefaultLambdaParser.getPropertyName(keyExtractor)), ">", value);
-    }
-
-    public <T> OBuilder between(boolean expect, ColumnFunc<T, ?> keyExtractor, Object start, Object end) {
-        if (!expect) {
-            return this;
-        }
-        return between(keyExtractor, start, end);
-    }
-
-    public <T> OBuilder between(ColumnFunc<T, ?> keyExtractor, Object start, Object end) {
-        Where w = new Where();
-        w.sql = " " + columnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + " between ? and ? ";
-        w.sqlValues.add(start);
-        w.sqlValues.add(end);
-        wheres.add(w);
-        return this;
-    }
-
-    public OBuilder or(String key, String op, Object value) {
-        Where w = new Where();
-        w.sql = " or (" + columnName(key) + " " + op + " ?)";
-        w.sqlValues.addAll(Collections.singletonList(value));
-        wheres.add(w);
-        return this;
-    }
-
-    public <T> OBuilder or(boolean expect, ColumnFunc<T, ?> keyExtractor, String op, Object value) {
-        if (!expect) {
-            return this;
-        }
-        return or(keyExtractor, op, value);
-    }
-
-    public <T> OBuilder or(ColumnFunc<T, ?> keyExtractor, String op, Object value) {
-        Where w = new Where();
-        w.sql = " or (" + columnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + " " + op + " ?)";
-        w.sqlValues.addAll(Collections.singletonList(value));
-        wheres.add(w);
-        return this;
-    }
-
-    public OBuilder or(String sql, Object... values) {
-        Where w = new Where();
-        w.sql = " or (" + sql + " )";
-        w.sqlValues.addAll(Arrays.asList(values));
-        wheres.add(w);
-        return this;
-    }
-
-    /**
-     * 拼接sql片段查询条件
-     *
-     * @param sql    sql片段,必须符合数据库语法,缺省参数已?作为通配符
-     * @param values sql缺省参数的值,有序
-     */
-    public OBuilder sql(String sql, Object... values) {
-        Where w = new Where();
-        w.sql = sql;
-        w.sqlValues.addAll(Arrays.asList(values));
-        wheres.add(w);
-        return this;
-    }
-
-    private OBuilder orderByNative(String orderBy) {
-        orderBys.add(orderBy);
-        return this;
-    }
-
-    public OBuilder orderBy(String orderBy) {
-        String[] splits = orderBy.split(" ");
-        StringBuilder sbr = new StringBuilder(" ");
-        for (String split : splits) {
-            sbr.append(columnName(split).trim()).append(" ");
-        }
-        orderBys.add(sbr.toString());
-        return this;
-    }
-
-
-    public <T> OBuilder orderBy(ColumnFunc<T, ?> keyExtractor) {
-        orderBys.add(columnName(DefaultLambdaParser.getPropertyName(keyExtractor)));
-        return this;
-    }
-
-    public <T> OBuilder asc(ColumnFunc<T, ?> keyExtractor) {
-        orderBys.add(columnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + " asc ");
-        return this;
-    }
-
-    public OBuilder asc(String key) {
-        orderBys.add(columnName(key) + " asc ");
-        return this;
-    }
-
-
-    public <T> OBuilder desc(ColumnFunc<T, ?> keyExtractor) {
-        orderBys.add(columnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + " desc ");
-        return this;
-    }
-
-    public OBuilder desc(String key) {
-        orderBys.add(columnName(key) + " desc ");
-        return this;
-    }
-
-    /**
-     * 分组字段,仅在使用聚合函数{@link com.kym.jdbc.ibatis.BoxMapper#selectFunc(Class, String, OBuilder)}时有效
-     */
-    public OBuilder groupBy(String orderBy) {
-        groupBys.add(columnName(orderBy));
-        return this;
-    }
-
-    public <T> OBuilder groupBy(ColumnFunc<T, ?> keyExtractor) {
-        groupBys.add(columnName(DefaultLambdaParser.getPropertyName(keyExtractor)));
-        return this;
-    }
-
-    /**
-     * 分页
-     *
-     * @param pos   分页起点
-     * @param delta 分页条数
-     * @return
-     */
-    public OBuilder limit(int pos, int delta) {
-        limitStart = pos;
-        limitDelta = delta;
-        return this;
-    }
-
-    public OBuilder limit(int delta) {
-        limitStart = 0;
-        limitDelta = delta;
-        return this;
-    }
-
-    public OBuilder forUpdate() {
-        forUpdate = true;
-        return this;
-    }
-
-    public OBuilder forShare() {
-        forShare = true;
-        return this;
-    }
-
-    public OBuilder group(boolean orGroup, List<Where> wheres) {
-        groups.add(new Group(orGroup, wheres));
-        return this;
-    }
-
-
-    public List<String> getOrderBys() {
-        return orderBys;
-    }
-
-    public List<String> getGroupBys() {
-        return groupBys;
-    }
-
-    public int limitStart() {
-        return limitStart;
-    }
-
-    public int limitDelta() {
-        return limitDelta;
-    }
-
-    public List<Where> getWheres() {
-        return wheres;
-    }
-
-
-    private static String columnName(String field) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = field.toCharArray();
-        for (char ch : chars) {
-            if (Character.isUpperCase(ch)) {
-                sbr.append("_").append(Character.toLowerCase(ch));
-            } else {
-                sbr.append(ch);
-            }
-        }
-        return sbr.toString();
-    }
-
-    public static class Group {
-        public boolean orConnector;
-        public List<Where> wheres;
-
-        public Group(boolean orConnector, List<Where> wheres) {
-            this.orConnector = orConnector;
-            this.wheres = wheres;
-        }
-
-    }
-
-    public static class Where {
-        public String key;
-        public Object value;
-        public String op = "=";
-        public String sql;
-        /**
-         * sql结构化数据库的查询语句
-         */
-        public LinkedList<Object> sqlValues = new LinkedList<>();
-
-        Where() {
-        }
-
-
-        public Where(String key, Object value) {
-            this.key = key;
-            this.value = value;
-            this.op = "=";
-        }
-
-        public Where(String key, Object value, String op) {
-            this.key = key;
-            this.value = value;
-            this.op = op;
-        }
-
-        public Where(String key, Object value, String op, String sql, LinkedList<Object> sqlValues) {
-            this.key = key;
-            this.value = value;
-            this.op = op;
-            this.sql = sql;
-            this.sqlValues = sqlValues;
-        }
-
-        @Override
-        public String toString() {
-            return "Where{" + "key='" + key + '\'' + ", value=" + value + ", op='" + op + '\'' + ", sql='" + sql + '\'' + ", sqlValues=" + sqlValues + '}';
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "Builder{" + "wheres=" + wheres + ", groupBys=" + groupBys + ", orderBys=" + orderBys + ", limitStart=" + limitStart + ", limitDelta=" + limitDelta + ", forUpdate=" + forUpdate + ", forShare=" + forShare + '}';
-    }
-}

+ 0 - 15
car-wash-jdbc/src/main/java/com/kym/jdbc/ResultHandler.java

@@ -1,15 +0,0 @@
-package com.kym.jdbc;
-
-import java.util.Map;
-
-/**
- * @author yaop
- * @date 2019/9/7 14:47
- */
-@FunctionalInterface
-public interface ResultHandler<T> {
-    /**
-     * SQL结果集处理方法
-     */
-    T handle(Map<?, ?> t) throws Exception;
-}

+ 0 - 25
car-wash-jdbc/src/main/java/com/kym/jdbc/SQLEntity.java

@@ -1,25 +0,0 @@
-package com.kym.jdbc;
-
-
-/**
- * sql构造实体
- *
- * @since 2022.05.03
- */
-public class SQLEntity {
-    /**
-     * sql或nosql语句,if we use english input method,they will be normal.
-     */
-    public String sql;
-    public Object[] parameters;
-
-    public SQLEntity() {
-
-    }
-
-    public SQLEntity(String sql, Object[] parameters) {
-        this.sql = sql;
-        this.parameters = parameters;
-    }
-
-}

+ 0 - 11
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/CNT.java

@@ -1,11 +0,0 @@
-package com.kym.jdbc.annotations;
-
-/**
- * 条件连接符常量
- */
-public interface CNT {
-
-    String AND = "and";
-    String OR = "or";
-    String ALL = "all";
-}

+ 0 - 52
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/DBF.java

@@ -1,52 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 数据表字段与实体类字段映射注解
- * DataBaseField
- *
- * @author asynll
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface DBF {
-    /**
-     * 注释
-     */
-    String comment();
-
-    String dict() default "";
-
-    /**
-     * 必选
-     */
-    boolean required() default false;
-
-    /**
-     * 最小值(如果是字符串就是最小长度)
-     */
-    int min() default -1;
-
-    /**
-     * 最大值(如果是字符串就是最大长度)
-     */
-    int max() default -1;
-
-    /**
-     * 能否更新
-     */
-    boolean canUpdate() default true;
-
-    /**
-     * 排序
-     */
-    int order() default 0;
-}

+ 0 - 33
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/Entity.java

@@ -1,33 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 实体类映射数据表注解
- * @author asynll
- */
-@Target({ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface Entity{
-    /**
-     * 表名注释
-     */
-    String comment() default "";
-
-    /**
-     * 映射的表名,强制指定后忽略默认的构造表名方法
-     */
-    String tbName() default "";
-
-    /**
-     * 关联实体类对象
-     */
-    Class<?> clz() default void.class;
-}

+ 0 - 28
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/FK.java

@@ -1,28 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 外键关联
- * Foreign Key
- *
- * @author yaop
- */
-@Target({ElementType.FIELD})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface FK {
-    /**
-     * 关联表类对象
-     */
-    Class<?> clz();
-
-    /**
-     * 关联表的外键字段
-     */
-    String tkf() default "id";
-}

+ 0 - 9
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/JoinType.java

@@ -1,9 +0,0 @@
-package com.kym.jdbc.annotations;
-
-/**
- * join类型
- * build by yaop at 2019/5/2 14:46
- */
-public enum JoinType {
-    INNER, LEFT, RIGHT
-}

+ 0 - 39
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/Many.java

@@ -1,39 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 关联一对多
- *
- * @author yaop at 2019/1/31 16:44
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface Many {
-    /**
-     * 外键关联表实体类对象
-     */
-    Class<?> te() default void.class;
-
-    /**
-     * 关联表外键字段
-     */
-    String tkf() default "id";
-
-    /**
-     * 主表外键关联字段
-     */
-    String mkf() default "id";
-
-    /**
-     * 字段不查询(优先级高于include字段)
-     */
-    boolean noQuery() default false;
-}

+ 0 - 28
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/OP.java

@@ -1,28 +0,0 @@
-package com.kym.jdbc.annotations;
-
-/**
- * 操作符常量
- */
-public interface OP {
-
-    String EQ = "=";
-    String LK = "like '%?%'";
-    String LLK = "like '?%'";
-    String RLK = "like '%?'";
-    String IN = "in";
-    /**
-     * json in
-     */
-    String JIN = "JSON_CONTAINS";
-    /**
-     * json 交集
-     */
-    String JINT = "JSON_OVERLAPS";
-    String NIN = "not in";
-    String GT = ">";
-    String GTE = ">=";
-    String LT = "<";
-    String LTE = "<=";
-    String NE = "<>";
-    String OR = "or";
-}

+ 0 - 53
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/One.java

@@ -1,53 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 关联一对一
- *
- * @author: yoap
- */
-@Target({ElementType.FIELD})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface One {
-
-    /**
-     * 注释
-     * @return
-     */
-    String comment() default "";
-
-    /**
-     * 主表外键
-     */
-    String mkf() default "id";
-
-    /**
-     * 外键关联表实体类对象
-     */
-    Class<?> te() default void.class;
-
-    /**
-     * 被关联表的键
-     */
-    String tkf() default "id";
-    /**
-     * 关联实体类查询的字段
-     */
-    String tf() default "id";
-
-
-
-    boolean noQuery() default false;
-
-    boolean persist() default false;
-
-    JoinType join() default JoinType.LEFT;
-}

+ 0 - 22
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QE.java

@@ -1,22 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * 查询的实体类注解
- * Query Entity
- * @author: yaop
- */
-@Target({ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface QE {
-    Class<?> clz();
-}

+ 0 - 62
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QF.java

@@ -1,62 +0,0 @@
-package com.kym.jdbc.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 查询字段注解
- * Query Field
- *
- * @author asynll
- */
-@Target({ElementType.FIELD})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface QF {
-    /**
-     * sql操作符 {@link OP}
-     */
-    String op() default "";
-
-    /**
-     * 自定义sql语句,变量使用?通配占位符
-     */
-    String sql() default "";
-
-    /**
-     * sql循环连接方式,or ,and ,""
-     * @return
-     */
-    String each() default CNT.AND;
-
-    /**
-     * 是否忽略查询
-     */
-    boolean ignore() default false;
-
-    /**
-     * i.有关联查询时表示被关联表查询字段<br>
-     *  ii.无关联查询时表示主表的字段
-     */
-    String tf() default "";
-
-    /**
-     * 主表外键字段
-     */
-    String pkf() default "";
-
-    /**
-     * 被关联表外键字段
-     */
-    String tkf() default "id";
-
-    /**
-     * 查询条件的字段(主表字段、关联表字段)
-     */
-    QueryType qt() default QueryType.ALIGN;
-}

+ 0 - 8
car-wash-jdbc/src/main/java/com/kym/jdbc/annotations/QueryType.java

@@ -1,8 +0,0 @@
-package com.kym.jdbc.annotations;
-
-/**
- * 查询字段的关联类型
- */
-public enum QueryType {
-    MAIN,ALIGN,IGNORE
-}

+ 0 - 16
car-wash-jdbc/src/main/java/com/kym/jdbc/express/DdlSQLExpress.java

@@ -1,16 +0,0 @@
-package com.kym.jdbc.express;
-
-import com.kym.jdbc.SQLEntity;
-
-
-/**
- * sql表达式 -ddl语句 alter create drop
- */
-public class DdlSQLExpress implements SQLExpress<SQLEntity> {
-    @Override
-    public SQLEntity toSQL() {
-
-        //TODO
-        return null;
-    }
-}

+ 0 - 84
car-wash-jdbc/src/main/java/com/kym/jdbc/express/DeleteSQLExpress.java

@@ -1,84 +0,0 @@
-package com.kym.jdbc.express;
-
-import com.kym.DbUtil;
-import com.kym.jdbc.DbException;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.OBuilder.Where;
-import com.kym.jdbc.SQLEntity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * sql表达式 -delete
- */
-public class DeleteSQLExpress implements SQLExpress<SQLEntity> {
-
-    private final Logger logger = LoggerFactory.getLogger(DeleteSQLExpress.class);
-
-    /**
-     * delete  的表名
-     */
-    private String table;
-
-    /**
-     * delete 的条件
-     */
-    private List<Where> conditions = new ArrayList<>();
-
-    @Override
-    public SQLEntity toSQL() {
-        if (strict && DbUtil.isEmptyOrNull(this.conditions)) {
-            logger.error("delete error, because conditions  is null");
-            throw new DbException("delete error, because conditions  is null");
-        }
-        SQLEntity entity = new SQLEntity();
-        List<Object> params = new ArrayList<>();
-        StringBuilder sbr = new StringBuilder("DELETE FROM ").append(table);
-        if (!DbUtil.isEmptyOrNull(conditions)) {
-            sbr.append(" WHERE 1=1 ");
-            conditions.forEach(where -> {
-                if (!DbUtil.isEmptyOrNull(where.key)) {
-                    sbr.append(" AND ( ").append(getComma()).append(where.key).append(getComma()).append(" ").append(where.op);
-                    if (where.op.contains("in") || where.op.contains("not in")) {
-                        sbr.append(" (?)  ) ");
-                    } else {
-                        sbr.append(" ? ) ");
-                    }
-                    params.add(where.value);
-                } else {
-                    if (!DbUtil.isEmptyOrNull(where.sql)) {
-                        sbr.append(" (").append(where.sql).append(" ) ");
-                        if (!DbUtil.isEmptyOrNull(where.sqlValues)) {
-                            params.addAll(where.sqlValues);
-                        }
-                    }
-                }
-            });
-        }
-        entity.sql = sbr.toString();
-        entity.parameters = params.toArray();
-        return entity;
-    }
-
-
-    //region delete
-    public SQLEntity deleteById(Class<?> clz, Object id) {
-        table = getTableName(clz, clz.getSimpleName());
-        conditions.add(new Where("id", id));
-        return toSQL();
-    }
-
-
-    public SQLEntity delete(Class<?> clz, OBuilder OBuilder) {
-        table = getTableName(clz, clz.getSimpleName());
-        conditions = OBuilder.getWheres();
-        return toSQL();
-    }
-
-    //endregion delete
-
-}

+ 0 - 186
car-wash-jdbc/src/main/java/com/kym/jdbc/express/InsertSQLExpress.java

@@ -1,186 +0,0 @@
-package com.kym.jdbc.express;
-
-
-import com.kym.DbUtil;
-import com.kym.jdbc.DbException;
-import com.kym.jdbc.SQLEntity;
-import com.kym.jdbc.annotations.DBF;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
-/**
- * sql表达式 -insert
- */
-public class InsertSQLExpress implements SQLExpress<SQLEntity> {
-
-    private final Logger logger = LoggerFactory.getLogger(InsertSQLExpress.class);
-
-    /**
-     * insert 的表名
-     */
-    private String table;
-
-    /**
-     * insert的字段名
-     */
-    private final List<String> cols = new ArrayList<>();
-
-    /**
-     * insert的值
-     */
-    private final List<Object> values = new ArrayList<>();
-
-
-    @Override
-    public SQLEntity toSQL() {
-        if (DbUtil.isEmptyOrNull(this.cols)) {
-            logger.error("cols is null");
-            throw new DbException("insert parse error because cols is null");
-        }
-        SQLEntity entity = new SQLEntity();
-        StringBuilder sbr = new StringBuilder("INSERT INTO ").append(table).append(" (");
-        String collect = cols.stream().map(k -> getComma() + DbUtil.getColumnName(k) + getComma()).collect(Collectors.joining(","));
-        sbr.append(collect).append(") VALUES (");
-        String collect1 = cols.stream().map(k -> "?").collect(Collectors.joining(","));
-        sbr.append(collect1).append(")");
-        entity.sql = sbr.toString();
-        entity.parameters = values.toArray();
-        return entity;
-    }
-
-
-    /**
-     * --------------insert method begin ---------------
-     */
-    public SQLEntity insertSelective(Object o, List<String> exclude) {
-        return insertWithCheck(o, true, false, exclude);
-    }
-
-    public SQLEntity insert(Object o, List<String> exclude) {
-        return insertWithCheck(o, false, false, exclude);
-    }
-
-    public SQLEntity insertWithGenKey(Object o, List<String> exclude) {
-        return insertWithCheck(o, false, true, exclude);
-    }
-
-    /***
-     * 插入方法
-     * @param o 插入实体对象
-     * @param ignoreNull 忽略空字段
-     * @param withAutoIncreamentKey 对象是否已赋值自增主键
-     * @param exclude 忽略字段
-     * @return SQLEntity sql构造实体
-     */
-    private SQLEntity insertWithCheck(Object o, boolean ignoreNull, boolean withAutoIncreamentKey, List<String> exclude) {
-        table = getTableName(o.getClass(), o.getClass().getSimpleName());
-
-        //自带主键
-        if (withAutoIncreamentKey) {
-            cols.add("id");
-            try {
-                values.add(DbUtil.getFieldValue(o, DbUtil.getField(o, "id")));
-            } catch (NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# insert with primary key,but without a value!!");
-                throw new IllegalStateException("no primary key value exist.");
-            }
-        }
-        if(DbUtil.isEmptyOrNull(exclude)){
-            exclude = new ArrayList<>();
-        }
-        exclude.add("id");
-        Set<Field> fields = DbUtil.getEntityFields(o.getClass());
-        for (Field field : fields) {
-            if (DbUtil.isUsageField(field)) {
-                String fieldName = field.getName();
-                if (!DbUtil.isEmptyOrNull(exclude)) {
-                    //忽略属性
-                    if (exclude.contains(fieldName)) {
-                        continue;
-                    }
-                }
-                Type type = field.getGenericType();
-                DBF DBF = field.getAnnotation(DBF.class);
-                if (null != DBF) {
-                    Object value = DbUtil.getFieldValue(o, field);
-                    if (ignoreNull) {
-                        if (null != value) {
-                            //TODO 校验值
-                            checkFieldValue(field, value, true);
-                            cols.add(fieldName);
-                            values.add(value);
-                        }
-                    } else {
-                        if (type == Date.class && null == value) {
-                            continue;
-                        }
-                        cols.add(fieldName);
-                        values.add(value);
-                    }
-                }
-            }
-        }
-        return toSQL();
-    }
-
-
-    public final SQLEntity insertBatch(List<?> dtoList) {
-        if (DbUtil.isEmptyOrNull(dtoList)) {
-            throw new IllegalArgumentException("insertBatch no dtoList exists!!!");
-        }
-        List<String> ignores = Arrays.asList("id".split(","));
-        Set<Field> fields = DbUtil.getEntityFields(dtoList.get(0).getClass());
-        List<String> fieldList = new ArrayList<>();
-        for (Field field : fields) {
-            int modifier = field.getModifiers();
-            if (!Modifier.isFinal(modifier) && !Modifier.isStatic(modifier) && field.isAnnotationPresent(DBF.class)) {
-                String fieldName = field.getName();
-                if (!ignores.contains(fieldName)) {
-                    fieldList.add(field.getName());
-                }
-            }
-        }
-
-        return insertBatch(fieldList, dtoList);
-    }
-
-    /**
-     * 无需自己组装SQL
-     */
-    public final SQLEntity insertBatch(List<String> fields, List<?> dtoList) {
-        if (DbUtil.isEmptyOrNull(fields)) {
-            throw new IllegalArgumentException("ERROR# insert fields is empty!");
-        }
-        if (DbUtil.isEmptyOrNull(dtoList)) {
-            throw new IllegalArgumentException("ERROR# insert values is empty!");
-        }
-
-        this.table = getTableName(dtoList.get(0).getClass().getSimpleName());
-        fields.forEach(field -> this.cols.add(DbUtil.getColumnName(field)));
-
-        int fieldSize = fields.size();
-        for (Object o : dtoList) {
-            Object[] ll = new Object[fieldSize];
-            for (int j = 0; j < fieldSize; j++) {
-                ll[j] = DbUtil.getFieldValue(o, fields.get(j));
-            }
-            values.add(ll);
-        }
-
-        return toSQL();
-    }
-
-
-    //endregion
-}

+ 0 - 392
car-wash-jdbc/src/main/java/com/kym/jdbc/express/SQLExpress.java

@@ -1,392 +0,0 @@
-package com.kym.jdbc.express;
-
-import com.kym.DbUtil;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.FK;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import com.kym.jdbc.annotations.QF;
-import com.kym.jdbc.template.JdbcHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.sql.Timestamp;
-import java.util.Date;
-import java.util.List;
-
-
-/**
- * sql表达式构造
- * <p>
- * mysql\oracle\postgresql\sqlserver\db2\h2\sqlite\人大金仓\达梦\
- * </p>
- */
-public interface SQLExpress<T> {
-
-    Logger logger = LoggerFactory.getLogger(SQLExpress.class);
-    /**
-     * 数据库方言
-     */
-    int DIALECT_MYSQL = 1;
-    int DIALECT_MSSQL = 2;
-    int DIALECT_ORACLE = 3;
-    int DIALECT_PGSQL = 4;
-
-    String[] BASE_IGNORE = {"createAt", "updateAt", "createBy", "updateBy"};
-
-    String DEFAULT_MKF = "id";
-
-    T toSQL();
-
-    int dialect = DIALECT_PGSQL;
-
-
-    default String getComma() {
-        switch (dialect) {
-            case DIALECT_MYSQL -> {
-                return "`";
-            }
-            case DIALECT_MSSQL -> {
-                return "'";
-            }
-            case DIALECT_ORACLE -> {
-                return "\"";
-            }
-            case DIALECT_PGSQL -> {
-                return "\"";
-            }
-            default -> {
-            }
-        }
-
-        return "\"";
-    }
-
-    boolean strict = false;
-
-
-    /**
-     * 获取主键字段名
-     *
-     * @param query
-     * @param where
-     * @return
-     */
-    default String getMkf(BasicQuery query, OBuilder.Where where) {
-        String fieldName = where.key;
-        if (DbUtil.isEmptyOrNull(fieldName)) {
-            if (!DbUtil.isEmptyOrNull(where.sql)) {
-                logger.warn("SQL#builder with sql foreign key is not support yet! {}", where.sql);
-            }
-            return null;
-        }
-        try {
-            //info
-            Class<?> infoClz = query.getClass().getAnnotation(QE.class).clz();
-            Field field = infoClz.getField(DbUtil.getCamelName(fieldName));
-            if (field.isAnnotationPresent(One.class)) {
-                One one = field.getAnnotation(One.class);
-                where.key = one.tf();
-                return one.mkf();
-            }
-        } catch (NoSuchFieldException e) {
-            try {
-                //query
-                Field field = query.getClass().getField(DbUtil.getCamelName(fieldName));
-                if (field.isAnnotationPresent(QF.class)) {
-                    QF qf = field.getAnnotation(QF.class);
-                    where.key = qf.tf();
-                    return qf.pkf();
-                }
-            } catch (NoSuchFieldException e1) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-
-    /**
-     * 获取外键关联实体类
-     */
-    default Class<?> getFkDomainClass(Field f, Class<?> domainClass) {
-        try {
-            if (f.isAnnotationPresent(FK.class)) {
-                return f.getAnnotation(FK.class).clz();
-            }
-            if (f.isAnnotationPresent(One.class)) {
-                One oneAnnotation = f.getAnnotation(One.class);
-                if (null != oneAnnotation) {
-                    if (oneAnnotation.te() != void.class) {
-                        return oneAnnotation.te();
-                    }
-                    if (!DbUtil.isEmptyOrNull(oneAnnotation.mkf())) {
-                        if (DbUtil.isGenericType(f.getType())) {
-                            Field field = domainClass.getDeclaringClass().getDeclaredField(oneAnnotation.mkf());
-                            if (field.isAnnotationPresent(FK.class)) {
-                                return field.getAnnotation(FK.class).clz();
-                            }
-                        } else {
-                            return f.getDeclaringClass();
-                        }
-                    }
-                }
-            }
-            if (f.isAnnotationPresent(QF.class)) {
-                QF qf = f.getAnnotation(QF.class);
-                if (!DbUtil.isEmptyOrNull(qf.pkf())) {
-                    Field field = domainClass.getDeclaringClass().getDeclaredField(qf.pkf());
-                    return field.getAnnotation(FK.class).clz();
-                }
-            }
-        } catch (NoSuchFieldException e) {
-            logger.error("SQL2Helper ERR# getFkDomainClass ,fileName:{},class:{}", f.getName(), domainClass.getSimpleName());
-        }
-        return Void.class;
-    }
-
-
-    default void appendValue(StringBuilder sbr, Type type, Object value, List<Object> parameters) {
-        sbr.append("?").append(",");
-        parameters.add(value);
-    }
-
-    default void appendValue(StringBuilder sbr, Object value, List<Object> parameters) {
-        sbr.append(" ? ");
-        parameters.add(value);
-    }
-
-
-    default String getTableName(Class<?> clz, String tbName) {
-        if (clz.isAnnotationPresent(Entity.class)) {
-            Entity entity = clz.getAnnotation(Entity.class);
-            if (!DbUtil.isEmptyOrNull(entity.tbName())) {
-                return DbUtil.getColumnName(entity.tbName());
-            }
-        } else if (clz.getSuperclass().isAnnotationPresent(Entity.class)) {
-            Class<?> superClz = clz.getSuperclass();
-            Entity entity = superClz.getAnnotation(Entity.class);
-            if (!DbUtil.isEmptyOrNull(entity.tbName())) {
-                return DbUtil.getColumnName(entity.tbName());
-            }
-        }
-        if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }
-        return JdbcHelper.tbPrefix + DbUtil.getColumnName(tbName);
-    }
-
-    default String getTableName(String tbName) {
-        if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }
-        return JdbcHelper.getTbPrefix() + DbUtil.getColumnName(tbName);
-    }
-
-    default String getTableName(Entity anno) {
-        String tbName = anno.tbName();
-        if (!DbUtil.isEmptyOrNull(tbName)) {
-            return DbUtil.getColumnName(tbName);
-        }
-        Class<?> clz = anno.clz();
-       /* if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }*/
-        return JdbcHelper.tbPrefix + DbUtil.getColumnName(clz.getSimpleName());
-    }
-
-
-    /**
-     * whereSql拼接,需要注意json类型处理
-     *
-     * @param whereSql
-     * @param val
-     * @param tbAlias
-     * @param parameters
-     * @return
-     */
-    default String appendWhereSql(String whereSql, List<Object> val, String tbAlias, List<Object> parameters) {
-//        parameters.addAll(val);
-        if (!DbUtil.isEmptyOrNull(whereSql)) {
-            if (!DbUtil.isEmptyOrNull(val)) {
-                if (whereSql.contains("?")) {
-                    String regex = "\\?";
-                    for (Object o : val) {
-                        if (o.getClass() == String.class) {
-                            whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
-                        } else if (o.getClass() == Date.class) {
-                            whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
-                        } else {
-                            whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
-                        }
-                    }
-                    while (whereSql.contains("?")) {
-                        for (Object o : val) {
-                            if (o.getClass() == String.class) {
-                                whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
-                            } else if (o.getClass() == Date.class) {
-                                whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
-                            } else {
-                                whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
-                            }
-                        }
-                    }
-                } else {
-                    if (val.size() == 1 && val.get(0) instanceof Boolean) {
-                        if (!(Boolean) val.get(0)) {
-                            return null;
-                        }
-                    }
-                }
-            }
-            String[] splits = whereSql.split(" AND ");
-            boolean containsComma = false;
-            if (splits.length > 1) {
-                StringBuilder sbd = new StringBuilder();
-                for (int i = 0; i < splits.length; i++) {
-                    if (splits[i].startsWith("(")) {
-                        containsComma = true;
-                        sbd.append("(");
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits[i].trim().substring(1));
-                    } else {
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits[i].trim());
-                    }
-                    if (i != splits.length - 1) {
-                        sbd.append(" AND ");
-                    }
-                }
-                whereSql = sbd.toString();
-            }
-            String[] splits1 = whereSql.split(" OR ");
-            if (splits1.length > 1) {
-                StringBuilder sbd = new StringBuilder();
-                for (int i = 0; i < splits1.length; i++) {
-                    if (splits1[i].startsWith("(")) {
-                        if (!containsComma) {
-                            sbd.append("(");
-                            if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                                sbd.append(tbAlias).append(".");
-                            }
-                            sbd.append(splits1[i].trim().substring(1));
-                        }
-                    } else {
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits1[i].trim());
-                    }
-                    if (i != splits1.length - 1) {
-                        sbd.append(" OR ");
-                    }
-                }
-                whereSql = sbd.toString();
-            }
-        }
-        return whereSql;
-    }
-
-
-    /**
-     * 拼接Builder 条件
-     */
-    default void appendBuilderWhere(StringBuilder sbr, OBuilder.Where wh, String tbAlias, List<Object> parameters) {
-        if (DbUtil.isEmptyOrNull(wh.sql)) {
-            if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                sbr.append(tbAlias).append(".");
-            }
-            sbr.append(getComma()).append(DbUtil.getColumnName(wh.key)).append(getComma()).append(" ").append(wh.op);
-            String op = wh.op;
-            Object value = wh.value;
-            if ("in".equals(op.trim()) || "not in".equals(op.trim())) {
-                sbr.append("(");
-                for (int i = 0; i < Array.getLength(value); i++) {
-                    Object v = Array.get(value, i);
-                    sbr.append("?");
-                    parameters.add(v);
-                   /* if (v.getClass() == String.class) {
-                        sbr.append("'").append(DbUtil.injectDefend(v.toString())).append("'");
-                    } else {
-                        sbr.append(v);
-                    }*/
-                    if (i != Array.getLength(value) - 1) {
-                        sbr.append(",");
-                    }
-                }
-                sbr.append(")");
-            } else {
-                //转换取值方式
-                sbr.append("?");
-                parameters.add(value);
-           /*     if (value.getClass() == String.class) {
-                    sbr.append("'").append(value).append("'");
-                } else if (wh.value.getClass() == Date.class) {
-                    sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'");
-                } else {
-
-//                    sbr.append(value);
-                }*/
-            }
-        } else {
-            //别名判断
-            sbr.append(" (");
-            sbr.append(appendWhereSql(wh.sql, wh.sqlValues, tbAlias, parameters));
-            sbr.append(") ");
-        }
-    }
-
-
-    /**
-     * 校验字段的值
-     */
-    default void checkFieldValue(Field field, Object value, boolean insertCheck) {
-        if (!field.isAnnotationPresent(DBF.class)) {
-            return;
-        }
-        DBF dbf = field.getAnnotation(DBF.class);
-
-        //插入SQL校验必填
-        if (insertCheck) {
-            if (dbf.required() && DbUtil.isEmptyOrNull(value)) {
-                throw new IllegalArgumentException("【" + dbf.comment() + "】取值不能为空");
-            }
-        }
-        int min = dbf.min();
-        int max = dbf.max();
-        if (dbf.min() > 0) {
-            if (value instanceof Integer || value instanceof Short || value instanceof Double || value instanceof Long) {
-                if (BigDecimal.valueOf(min).compareTo(new BigDecimal(String.valueOf(value))) > 0) {
-                    throw new IllegalArgumentException("【" + dbf.comment() + "】最小值为" + min);
-                }
-                if (max > 0 && BigDecimal.valueOf(max).compareTo(new BigDecimal(value.toString())) < 0) {
-                    throw new IllegalArgumentException("【" + dbf.comment() + "】最大值为" + max);
-                }
-            } else if (value instanceof String || value instanceof Character) {
-                if (!DbUtil.isEmptyOrNull(value)) {
-                    int length = value.toString().length();
-                    if (min > length) {
-                        throw new IllegalArgumentException("【" + dbf.comment() + "】最小长度为" + min);
-                    }
-                    if (max > 0 && max < length) {
-                        throw new IllegalArgumentException("【" + dbf.comment() + "】最大长度为" + max);
-                    }
-                }
-            }
-        }
-
-
-    }
-
-}

+ 0 - 991
car-wash-jdbc/src/main/java/com/kym/jdbc/express/SelectSQLExpress.java

@@ -1,991 +0,0 @@
-package com.kym.jdbc.express;
-
-import com.kym.DbUtil;
-import com.kym.JacksonUtil;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.IHandler;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.OBuilder.Where;
-import com.kym.jdbc.SQLEntity;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.FK;
-import com.kym.jdbc.annotations.JoinType;
-import com.kym.jdbc.annotations.Many;
-import com.kym.jdbc.annotations.OP;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import com.kym.jdbc.annotations.QF;
-import com.kym.jdbc.annotations.QueryType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
-/**
- * sql表达式 -select
- */
-public class SelectSQLExpress implements SQLExpress<SQLEntity> {
-    private final Logger logger = LoggerFactory.getLogger(SelectSQLExpress.class);
-
-
-    private String table;
-    /**
-     * 表名
-     */
-    private Map<String, String> tableAliasMap;
-
-    /**
-     * 字段名
-     */
-    private final List<String> columns = new ArrayList<>();
-
-
-    private final List<Map<String, JoinType>> joins = new ArrayList<>();
-
-    /**
-     * 条件
-     */
-    private final List<Where> wheres = new ArrayList<>();
-
-    private final List<Where> havings = new ArrayList<>();
-
-    /**
-     * 排序
-     */
-    private final List<String> orders = new ArrayList<>();
-
-    /**
-     * 分组
-     */
-    private final List<String> groups = new ArrayList<>();
-
-
-    private int dialect = SQLExpress.DIALECT_MYSQL;
-
-    public SelectSQLExpress(int dialect) {
-        this.dialect = dialect;
-    }
-
-    @Override
-    public SQLEntity toSQL() {
-        //TODO
-        return null;
-    }
-
-
-
-    /**
-     * 聚合函数查询<p>
-     * 注意:聚合函数的查询需要使用子查询</p>
-     *
-     * @param clz
-     * @param func    聚合查询字段 count(1) sum(amt)
-     * @param builder
-     * @return
-     */
-    public SQLEntity selectFunc(Class<?> clz, String func, OBuilder builder) {
-        SQLEntity entity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>(16);
-        boolean distinct = distinctAggerate(func);
-        StringBuilder sbr = new StringBuilder();
-        boolean originEntity = !clz.getSimpleName().endsWith("Info");
-        if (originEntity) {
-            String funcField = func;
-            if (!distinct) {
-                funcField = func.contains("COUNT(") ? "1" : func.trim().split("\\(")[1].split("\\)")[0].trim();
-            }
-            sbr.append("SELECT ").append(funcField).append(" FROM ").append(getTableName(clz, clz.getSimpleName()));
-            if (null != builder) {
-                if (!DbUtil.isEmptyOrNull(builder.getWheres())) {
-                    List<Where> wheres = builder.getWheres();
-                    if (!DbUtil.isEmptyOrNull(wheres)) {
-                        sbr.append(" \r\n WHERE 1=1");
-                        wheres.forEach(wh -> {
-                            sbr.append(" AND ");
-                            appendBuilderWhere(sbr, wh, "", parameters);
-                        });
-                    }
-                }
-                //GROUP BY
-                if (!DbUtil.isEmptyOrNull(builder.getGroupBys())) {
-                    sbr.append("  \r\n GROUP BY ");
-                    builder.getGroupBys().forEach(group -> {
-                        sbr.append(group).append(" ,");
-                    });
-                    sbr.deleteCharAt(sbr.length() - 1);
-                }
-                //ORDER BY
-                if (!DbUtil.isEmptyOrNull(builder.getOrderBys())) {
-                    sbr.append(" ORDER BY ");
-                    builder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
-                    sbr.deleteCharAt(sbr.length() - 1);
-                }
-
-                //count不分页
-                if (!func.contains("COUNT(")) {
-                    //分页
-                    String result = appendWhereLimit(builder, sbr);
-                    if (null != result) {
-                        if (!distinct) {
-                            entity.sql = "SELECT " + func + " FROM (" + result + ") temp";
-                        } else {
-                            entity.sql = result;
-                        }
-                    }
-                }
-            }
-            if (!distinct) {
-                entity.sql = "SELECT " + func + " FROM (" + sbr.toString() + ") temp";
-            } else {
-                entity.sql = sbr.toString();
-            }
-        } else {
-            //支持聚合查询的关联
-            String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
-            try {
-                Object obj = Class.forName(queryDomain).newInstance();
-                if (!DbUtil.isEmptyOrNull(func)) {
-                    DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
-                }
-                return select((BasicQuery) obj, builder, null, null, func, true);
-            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
-                throw new IllegalStateException(e);
-            }
-
-        }
-        entity.parameters = parameters.toArray();
-        return entity;
-    }
-
-
-
-    public SQLEntity selectListByWhereV2(Class<?> clz, OBuilder builder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-        Set<Field> fields = DbUtil.getEntityFields(clz);
-        boolean isSimple = !clz.getSimpleName().endsWith("Info");
-        if (isSimple) {
-            Entity entity = clz.getAnnotation(Entity.class);
-            StringBuilder sbr = new StringBuilder();
-            if (!DbUtil.isEmptyOrNull(aggregate)) {
-                sbr.append("SELECT ").append(aggregate).append(" FROM ").append(getTableName(entity));
-            } else {
-                if (DbUtil.isEmptyOrNull(include)) {
-                    if (DbUtil.isEmptyOrNull(exclude)) {
-                        sbr.append("SELECT * FROM ").append(getTableName(entity));
-                    } else {
-                        sbr.append("SELECT ");
-                        for (Field field : fields) {
-                            if (DbUtil.isUsageField(field)) {
-                                //richId  rich2Id 不关联查
-                                String fileName = field.getName();
-                                if (!exclude.contains(fileName)) {
-                                    sbr.append(getComma()).append(DbUtil.getColumnName(fileName)).append(getComma()).append(" ,");
-                                }
-                            }
-                        }
-                        sbr.deleteCharAt(sbr.length() - 1);
-                        sbr.append("  \n FROM ").append(getTableName(entity));
-                    }
-                } else {
-                    sbr.append("SELECT ");
-                    for (Field field : fields) {
-                        if (DbUtil.isUsageField(field)) {
-                            String fileName = field.getName();
-                            if (include.contains(fileName)) {
-                                sbr.append(getComma()).append(DbUtil.getColumnName(fileName)).append(getComma()).append(" ,");
-                            }
-                        }
-                    }
-                    sbr.deleteCharAt(sbr.length() - 1);
-                    sbr.append("  \n FROM ").append(getTableName(entity));
-                }
-            }
-            if (null != builder && !DbUtil.isEmptyOrNull(builder.getWheres())) {
-                List<Where> wheres = builder.getWheres();
-                if (!DbUtil.isEmptyOrNull(wheres)) {
-                    sbr.append(" \r\n WHERE 1=1");
-                    wheres.forEach(wh -> {
-                        sbr.append(" AND ");
-                        appendBuilderWhere(sbr, wh, "", parameters);
-                    });
-                }
-            }
-
-
-            if (isList) {
-                //ORDER BY
-                if (null != builder && !DbUtil.isEmptyOrNull(builder.getOrderBys())) {
-                    sbr.append(" ORDER BY ");
-                    builder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
-                    sbr.deleteCharAt(sbr.length() - 1);
-                } else {
-                    sbr.append(" ORDER BY update_at DESC ");
-                }
-
-                //limit
-                String result = appendWhereLimit(builder, sbr);
-                if (null != result) {
-                    sqlEntity.sql = result;
-                }
-            }
-
-            sbr.append(";");
-            sqlEntity.sql = sbr.toString();
-        } else {
-            String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
-            Object obj;
-            try {
-                obj = Class.forName(queryDomain).getDeclaredConstructor().newInstance();
-                if (!DbUtil.isEmptyOrNull(aggregate)) {
-                    DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
-                }
-            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
-                throw new IllegalStateException(e);
-            } catch (InvocationTargetException | NoSuchMethodException e) {
-                throw new RuntimeException(e);
-            }
-            return select((BasicQuery) obj, builder, include, exclude, aggregate, isList);
-        }
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-
-
-    /**
-     * 查询SQL解析生成
-     *
-     * @param query     query条件对象
-     * @param builder   where条件对象
-     * @param include   指定查询字段集合
-     * @param exclude   指定过滤不查询字段集合
-     * @param aggregate 聚合查询条件
-     */
-    public SQLEntity select(BasicQuery query, OBuilder builder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>(32);
-        if (!DbUtil.isEmptyOrNull(query.includeFields)) {
-            if (DbUtil.isEmptyOrNull(include)) {
-                include = new ArrayList<>();
-            }
-            for (String includeField : query.includeFields) {
-                if (!include.contains(includeField)) {
-                    include.add(includeField);
-                }
-            }
-        }
-        if (!DbUtil.isEmptyOrNull(query.excludeFields)) {
-            if (DbUtil.isEmptyOrNull(exclude)) {
-                exclude = new ArrayList<>();
-            }
-            for (String excludeField : query.excludeFields) {
-                if (!exclude.contains(excludeField)) {
-                    exclude.add(excludeField);
-                }
-            }
-        }
-        StringBuilder sbr = new StringBuilder();
-        int aliasIdx = 0;
-        //表别名 @QF->inner @FK、@One->left
-        Map<String, String> alias = new HashMap<>(4);
-        //关联表名
-        Map<String, String> tbs = new HashMap<>(4);
-        QE qEAnnotation = query.getClass().getAnnotation(QE.class);
-        String queryClassName = query.getClass().getSimpleName();
-        if (null == qEAnnotation) {
-            throw new IllegalStateException("query entity of " + queryClassName + " @Query Entity is not defined!");
-        }
-        Class<?> infoClass = qEAnnotation.clz();
-        Entity entity = infoClass.getSuperclass().getAnnotation(Entity.class);
-//        Field[] fields = infoClass.getFields();
-        Set<Field> fields = DbUtil.getEntityFields(infoClass);
-        Set<Field> qfields = DbUtil.getQueryFields(query.getClass());
-//        Field[] qfields = query.getClass().getFields();
-        //关联表别名
-        //------1.查询字段
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            //常量字段过滤
-            if (!DbUtil.isUsageField(field)) {
-                continue;
-            }
-            One oneAnnotation = field.getAnnotation(One.class);
-            Many manyAnnotation = field.getAnnotation(Many.class);
-            boolean isExtenstionField = null != oneAnnotation || null != manyAnnotation;
-            //忽略字段过滤
-            if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
-                continue;
-            }
-            //指定查询
-            if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
-                continue;
-            }
-            DBF DBFAnnotation = field.getAnnotation(DBF.class);
-            if (null != DBFAnnotation) {
-                FK foreignKey = field.getAnnotation(FK.class);
-                if (null != foreignKey) {
-                    Class<?> entityClass = foreignKey.clz();
-                    Entity ey = entityClass.getAnnotation(Entity.class);
-                    for (Field qfield : qfields) {
-                        if (qfield.isAnnotationPresent(QF.class)) {
-                            QF qf = qfield.getAnnotation(QF.class);
-                            String mkf = qf.pkf();
-                            if (!DbUtil.isEmptyOrNull(mkf) && mkf.equals(fieldName)) {
-                                if (null != DbUtil.getFieldValue(query, qfield)) {
-                                    alias.putIfAbsent(fieldName, "i" + aliasIdx++);
-                                    tbs.putIfAbsent(fieldName, getTableName(ey));
-                                }
-                            }
-                        }
-                    }
-                    alias.putIfAbsent(fieldName, "l" + aliasIdx++);
-                    tbs.putIfAbsent(fieldName, getTableName(ey));
-                }
-            } else {
-                if (null != oneAnnotation) {
-                    String mkf = oneAnnotation.mkf();
-                    if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
-                        mkf = fieldName;
-                    }
-                    JoinType joinType = oneAnnotation.join();
-                    if (JoinType.LEFT == joinType) {
-                        alias.put(mkf, "l" + aliasIdx++);
-                    } else if (JoinType.INNER == joinType) {
-                        alias.put(mkf, "i" + aliasIdx++);
-                    } else if (JoinType.RIGHT == joinType) {
-                        alias.put(mkf, "r" + aliasIdx++);
-                    }
-                }
-            }
-        }
-        //非聚合查询
-        if (DbUtil.isEmptyOrNull(aggregate)) {
-            sbr.append("SELECT");
-            //------1.查询主表字段
-            boolean appendFields = false;
-            for (Field field : fields) {
-                String fieldName = field.getName();
-                //常量字段过滤
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
-                //忽略字段过滤
-                if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
-                    continue;
-                }
-                //指定查询
-                if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
-                    continue;
-                }
-                DBF DBFAnnotation = field.getAnnotation(DBF.class);
-                if (null != DBFAnnotation) {
-                    if (appendFields) {
-                        sbr.append(",");
-                    }
-                    sbr.append(" l.").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
-                    appendFields = true;
-                }
-            }
-            //-------2.查询关联字段
-            for (Field field : fields) {
-                Class<?> type = field.getType();
-                String fieldName = field.getName();
-                //常量字段过滤
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
-                //忽略字段过滤
-                if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
-                    continue;
-                }
-                //指定查询
-                if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName)) {
-                    continue;
-                }
-                Class<?> fieldClass = field.getType();
-                One oneAnnotation = field.getAnnotation(One.class);
-                if (null != oneAnnotation) {
-                    //忽略查询
-                    if (oneAnnotation.noQuery()) {
-                        continue;
-                    }
-                    String fkField = oneAnnotation.mkf();
-                    if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(fkField)) {
-                        fkField = fieldName;
-                    }
-                    // join字段
-                    if (!DbUtil.isEmptyOrNull(fkField)) {
-                        //1.join查询对象
-                        if (!DbUtil.isGenericType(type) && type != String.class && !type.isArray() && !type.isAssignableFrom(List.class)) {
-//                            alias.putIfAbsent(fkField, "l" + aliasIdx++);
-                            Field[] joinFields = fieldClass.getFields();
-                            for (Field joinField : joinFields) {
-                                if (DbUtil.isUsageField(joinField)) {
-                                    if (!"SELECT".contentEquals(sbr)) {
-                                        sbr.append(",");
-                                    }
-                                    sbr.append(alias.get(fkField)).append(".").append(getComma()).append(DbUtil.getColumnName(joinField.getName())).append(getComma()).append(" AS ").append(getComma()).append(fieldName).append("_").append(DbUtil.getColumnName(joinField.getName())).append(getComma());
-                                }
-                            }
-
-                            //2.join查询变量
-                        } else {
-                            if (!"SELECT".equals(sbr.toString().trim())) {
-                                sbr.append(",");
-                            }
-                            sbr.append(alias.get(fkField)).append(".").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.tf())).append(getComma()).append(" AS ").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
-                        }
-                    }
-                }
-            }
-        } else {
-           /* //聚合查询需要获取关联表别名
-            for (Field field : fields) {
-                if (field.isAnnotationPresent(Fk.class)) {
-                    alias.putIfAbsent(field.getName(), "l" + aliasIdx++);
-                }
-            }*/
-
-            String aggregateField = aggregate;
-            boolean distinct = distinctAggerate(aggregate);
-            if (!distinct) {
-                aggregateField = aggregate.contains("COUNT(") ? "1" : aggregate.trim().split("\\(")[1].split("\\)")[0].trim();
-            }
-            sbr.append("SELECT ").append(aggregateField);
-        }
-
-        sbr.append("   \n FROM ").append(getComma()).append(getTableName(entity)).append(getComma()).append(" AS l");
-        List<String> joined = new ArrayList<>();
-        //-------3.关联对象  JOINS
-        //BUG:涉及到关联查询的对象字段需要inner join @QF
-//        Field[] qfs =dbu query.getClass().getDeclaredFields();
-        for (Field qf : qfields) {
-            //qf 内联查询
-            if (qf.isAnnotationPresent(QF.class)) {
-                Object val = DbUtil.getFieldValue(query, qf);
-                if (null != val) {
-                    String amkf = qf.getAnnotation(QF.class).pkf();
-                    if (!DbUtil.isEmptyOrNull(amkf)) {
-//                        if (!joinFields.contains(amkf)) {
-//                            joinFields.add(amkf);
-//                            alias.putIfAbsent(amkf, "i" + aliasIdx++);
-                        if (!joined.contains(alias.get(amkf))) {
-                            joined.add(alias.get(amkf));
-                        } else {
-                            continue;
-                        }
-                        Class<?> aliasClass = getFkDomainClass(qf, infoClass);
-                        sbr.append(" INNER JOIN ").append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(amkf)).append(" ON ").append("l.").append(getComma()).append(DbUtil.getColumnName(amkf)).append(getComma()).append("=").append(alias.get(amkf)).append(".").append(getComma()).append(DbUtil.getColumnName(qf.getAnnotation(QF.class).tkf())).append(getComma());
-                    }
-                }
-//                }
-            }
-        }
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            //忽略查询
-            if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
-                continue;
-            }
-            One oneAnnotation = field.getAnnotation(One.class);
-            if (null != oneAnnotation) {
-                //忽略查询
-                if (oneAnnotation.noQuery()) {
-                    continue;
-                }
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                String mkf = oneAnnotation.mkf();
-                if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
-                    mkf = fieldName;
-                }
-                //joins
-                if (!DbUtil.isEmptyOrNull(mkf)) {
-                    if (!joined.contains(alias.get(mkf))) {
-                        joined.add(alias.get(mkf));
-                    } else {
-                        continue;
-                    }
-//                    joinFields.add(fkField);
-                    Class<?> aliasClass = getFkDomainClass(field, infoClass);
-//                    alias.putIfAbsent(fkField, "l" + aliasIdx++);
-                    if (oneAnnotation.join() == JoinType.LEFT) {
-                        sbr.append(" \n LEFT JOIN ");
-                    } else if (oneAnnotation.join() == JoinType.INNER) {
-                        sbr.append("  \n  INNER JOIN  ");
-                    } else {
-                        sbr.append("  \n RIGHT JOIN ");
-                    }
-                    sbr.append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(mkf)).append(" ON ").append("l.").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.mkf())).append(getComma()).append("=").append(alias.get(mkf)).append(".").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.tkf())).append(getComma());
-                }
-            }
-        }
-        //-------4.查询条件
-        sbr.append(" \n WHERE 1=1 ");
-        Field[] queryFields = query.getClass().getDeclaredFields();
-        //query条件和Builder条件仅支持一个(查询时只提供一个条件构造实体)
-        if (null != builder && !DbUtil.isEmptyOrNull(builder.getWheres())) {
-            List<Where> wheres = builder.getWheres();
-            wheres.forEach(wh -> {
-                //联表查询字段
-                String aliasName = alias.getOrDefault(getMkf(query, wh), "l");
-                sbr.append(" AND ");
-                appendBuilderWhere(sbr, wh, aliasName, parameters);
-            });
-        } else {
-            for (Field qf : queryFields) {
-                Object val = DbUtil.getFieldValue(query, qf);
-                String fieldName = qf.getName();
-                if (DbUtil.isEmptyOrNull(val)) {
-                    continue;
-                }
-                QF qfAnnotation = qf.getAnnotation(QF.class);
-                if (null == qfAnnotation) {
-                    if (!fieldName.endsWith("Sort")) {
-                        sbr.append(" AND l.").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
-                        if (String.class.equals(qf.getType())) {
-                            if (DIALECT_MYSQL == dialect) {
-                                sbr.append(" LIKE concat('%',?,'%')");
-                            } else if (DIALECT_PGSQL == dialect) {
-                                sbr.append(" like concat('%',?::text,'%')");
-                            } else if (DIALECT_MSSQL == dialect) {
-                                sbr.append(" LIKE '%'+?+'%')");
-                            } else if (DIALECT_ORACLE == dialect) {
-                                sbr.append(" LIKE '%'||?||'%')");
-                            }
-                            parameters.add(val);
-                        } else {
-                            sbr.append(" = ?");
-                            parameters.add(val);
-//                            .append(val);
-                        }
-                    }
-                } else {
-                    //foreignKeys
-                    String mkf = qfAnnotation.pkf();
-                    if (qfAnnotation.qt() == QueryType.IGNORE) {
-                        continue;
-                    }
-                    if (!DbUtil.isEmptyOrNull(mkf)) {
-                        String tf = qfAnnotation.tf();
-                        if (DbUtil.isEmptyOrNull(tf)) {
-                            logger.error("SQL2Helper ERR# [" + fieldName + "] @QF with mkf define,but without tkf exist!!!");
-                        } else {
-                            if (qfAnnotation.qt() == QueryType.MAIN) {
-                                sbr.append(" AND ").append(" l").append(".").append(getComma()).append(DbUtil.getColumnName(mkf)).append(getComma());
-                            } else {
-                                sbr.append(" AND ").append(alias.get(mkf)).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma());
-                            }
-                            //字符串使用模糊查询
-                            if (String.class.equals(qf.getType())) {
-                                if (DIALECT_MYSQL == dialect) {
-                                    sbr.append(" like concat('%',?,'%')");
-                                } else if (DIALECT_PGSQL == dialect) {
-                                    sbr.append(" like concat('%',?::text,'%')");
-                                } else if (DIALECT_MSSQL == dialect) {
-                                    sbr.append(" like '%'+'?'+'%')");
-                                } else if (DIALECT_ORACLE == dialect) {
-                                    sbr.append(" like '%'||'?'||'%')");
-                                }
-                                parameters.add(val);
-                            } else {
-                                sbr.append(" =");
-//                                parameters.add(val);
-                                getValue(sbr, val, parameters);
-                            }
-                        }
-
-                    }
-                    //sql
-                    String whereSql = qfAnnotation.sql();
-                    String tbAlias = alias.getOrDefault(qfAnnotation.pkf(), "l");
-                    whereSql = appendWhereSql(whereSql, Collections.singletonList(val), tbAlias, parameters);
-                    if (!DbUtil.isEmptyOrNull(whereSql)) {
-                        sbr.append(" AND ").append(whereSql);
-                    }
-                    //op
-                    String operator = qfAnnotation.op();
-                    if (!DbUtil.isEmptyOrNull(operator)) {
-                        String tf = qfAnnotation.tf();
-                        if (DbUtil.isEmptyOrNull(tf)) {
-                            logger.error("SQL2Helper ERR# " + fieldName + "@QF with operator defined,but without tkf exist!!!");
-                        } else {
-                            //JIN  JINT
-                            if (operator.equals(OP.JIN)) {
-                                int loop = 1;
-                                String each = qfAnnotation.each();
-                                if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    loop = list.size();
-
-                                    parameters.addAll((Collection<?>) val);
-                                } else if (val.getClass().isArray()) {
-                                    loop = Array.getLength(val);
-                                    for (int i = 0; i < loop; i++) {
-                                        parameters.add(Array.get(val, i));
-                                    }
-                                } else {
-                                    loop = 1;
-                                    parameters.add(val);
-                                }
-                                // and ( json_contains(l.id_list,'1'))
-                                if (dialect == IHandler.DIALECT_MYSQL) {
-                                    sbr.append(" AND ").append("( ");
-                                    for (int i = 0; i < loop; i++) {
-                                        sbr.append(" (JSON_CONTAINS(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(",").append("JSON_ARRAY(?)) ");
-                                        if (i != loop - 1) {
-                                            sbr.append(each);
-                                        }
-                                    }
-                                    sbr.append(") ");
-                                    //  owner_id_list::jsonb @> jsonb_build_array(2)
-                                    //  owner_id_list::jsonb @> '[2]'
-                                } else if (dialect == IHandler.DIALECT_PGSQL) {
-                                    sbr.append(" AND ").append("( ");
-                                    for (int i = 0; i < loop; i++) {
-                                        sbr.append(" (").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append("::jsonb @>  ").append("jsonb_build_array(?)) ");
-                                        if (i != loop - 1) {
-                                            sbr.append(each);
-                                        }
-                                    }
-                                    sbr.append(") ");
-                                }
-
-                            } else if (operator.equals(OP.JINT)) {
-
-                                //and (JSON_OVERLAPS(role,'["a","d"]')=1)
-                                if (dialect == IHandler.DIALECT_MYSQL) {
-                                    sbr.append(" AND ").append("(").append(operator).append("JSON_OVERLAPS(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(",").append("'?')=1").append(")");
-                                    parameters.add(JacksonUtil.toJSONString(val));
-                                } else if (dialect == IHandler.DIALECT_PGSQL) {
-                                    //    //ARRAY[1,4,3] && ARRAY[2,1]
-                                    sbr.append(" AND ").append("(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append("::jsonb && ").append("jsonb_build_array(?))");
-                                    parameters.add(JacksonUtil.toJSONString(val));
-                                }
-                            } else if (operator.equals(OP.IN) || operator.equals(OP.NIN)) {
-                                sbr.append(" AND ").append("(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator).append("  (");
-                                if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
-                                    sbr.append(collect).append(") ) ");
-                                    parameters.addAll((Collection<?>) val);
-                                } else if (val.getClass().isArray()) {
-                                    int length = Array.getLength(val);
-                                    for (int i = 0; i < length; i++) {
-                                        sbr.append("?");
-                                        if (i != length - 1) {
-                                            sbr.append(",");
-                                        }
-                                        parameters.add(Array.get(val, i));
-                                    }
-                                    sbr.append("))");
-                                } else {
-                                    throw new IllegalArgumentException("不支持的参数格式");
-                                }
-
-                            } else if (operator.equals(OP.RLK) || operator.equals(OP.LK) || operator.equals(OP.LLK)) {
-                                sbr.append(" AND ").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator);
-                                parameters.add(val);
-                            } else {
-                                sbr.append(" AND ").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator);
-                                if (qf.getType().isArray()) {
-                                    sbr.append(" (");
-                                    int length = Array.getLength(val);
-                                    for (int i = 0; i < length; i++) {
-                                        Object value = Array.get(val, i);
-                                        getValue(sbr, value, parameters);
-                                        if (i != length - 1) {
-                                            sbr.append(",");
-                                        }
-                                    }
-                                    sbr.append(")");
-                                } else if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
-                                    sbr.append(collect).append(")  ");
-                                    parameters.addAll((Collection<?>) val);
-                                } else {
-                                    getValue(sbr, val, parameters);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-
-        //-------6.GROUP BY
-        if (null != builder && !DbUtil.isEmptyOrNull(builder.getGroupBys())) {
-            sbr.append(" GROUP BY ");
-            builder.getGroupBys().forEach(group -> {
-                sbr.append(group).append(" ,");
-            });
-            sbr.deleteCharAt(sbr.length() - 1);
-        }
-
-        //-------5.having
-        //todo
-
-        //-------7.ORDER BY(query)
-        boolean ordered = false;
-        //聚合查询不需要排序
-        if (DbUtil.isEmptyOrNull(aggregate) && isList) {
-            //多个排序字段需要确定先后顺序
-            Map<Integer, String> sortMap = new HashMap<>(16);
-            if (DbUtil.isEmptyOrNull(query.sortFields)) {
-                for (Field qf : queryFields) {
-                    Object val = DbUtil.getFieldValue(query, qf);
-                    if (null == val) {
-                        continue;
-                    }
-                    int sortValue = 0;
-                    if (val instanceof Integer) {
-                        sortValue = (int) val;
-                    }
-                    if (sortValue == 0) {
-                        continue;
-                    }
-                    String fieldName = qf.getName();
-
-                    List<Field> sorted = new ArrayList<>();
-                    QF qfAnnotation = qf.getAnnotation(QF.class);
-                    if (null == qfAnnotation) {
-                        if (fieldName.endsWith("Sort")) {
-                            if (!ordered) {
-                                ordered = true;
-                                sbr.append(" ORDER BY ");
-                            }
-
-//                            sbr.append(" l.")
-//                                    .append(getComma())
-//                                    .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
-//                                    .append(getComma());
-                            if (sortValue % 2 == BasicQuery.SORT_ASC) {
-                                sortMap.put(sortValue, String.format("%s ASC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
-//                                sbr.append(" ASC ,");
-                            } else {
-//                                sbr.append(" DESC ,");
-                                sortMap.put(sortValue, String.format("%s DESC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
-                            }
-                        }
-                    }
-
-                    if (!DbUtil.isEmptyOrNull(sortMap)) {
-                        Set<Integer> integers = sortMap.keySet();
-                        List<Integer> sorts = new ArrayList<>(integers);
-                        sorts.sort(Comparator.comparingInt(o -> o));
-                        sbr.append(sorts.stream().map(k -> "l." + sortMap.get(k)).collect(Collectors.joining(",")));
-                    }
-               /*     if (null == qfAnnotation) {
-                        if (fieldName.endsWith("Sort")) {
-                            if (!ordered) {
-                                ordered = true;
-                                sbr.append(" ORDER BY ");
-                            }
-                            sbr.append(" l.")
-                                    .append(getComma())
-                                    .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
-                                    .append(getComma());
-                            if (sortType == BasicQuery.SORT_ASC) {
-                                sbr.append(" ASC ,");
-                            } else if (sortType == BasicQuery.SORT_DESC) {
-                                sbr.append(" desc ,");
-                            }
-                        }
-                    }*/
-                }
-            } else {
-                String[] sorts = query.sortFields;
-                for (String sortField : sorts) {
-                    try {
-                        Field sf = query.getClass().getDeclaredField(sortField + "Sort");
-                        Object val = DbUtil.getFieldValue(query, sf);
-                        if (null == val) {
-                            continue;
-                        }
-                        int sortType = (int) val;
-                        if (!ordered) {
-                            ordered = true;
-                            sbr.append(" ORDER BY ");
-                        }
-
-                        sbr.append(" l.").append(getComma()).append(DbUtil.getColumnName(sortField)).append(getComma());
-                        if (sortType == BasicQuery.SORT_ASC) {
-                            sbr.append(" ASC ,");
-                        } else if (sortType == BasicQuery.SORT_DESC) {
-                            sbr.append(" DESC ,");
-                        }
-                    } catch (NoSuchFieldException e) {
-                        logger.warn("SQL2Helper warn# sort field is not exist,{}", sortField);
-                    }
-                }
-            }
-        }
-        //-------7.ORDER BY(builder)  聚合查询不需要排序
-        if (DbUtil.isEmptyOrNull(aggregate) && isList) {
-            if (null != builder && !DbUtil.isEmptyOrNull(builder.getOrderBys())) {
-                if (!ordered) {
-                    ordered = true;
-                    sbr.append(" ORDER BY ");
-                }
-                builder.getOrderBys().forEach(order -> sbr.append(" l.").append(order).append(" ,"));
-            }
-            if (ordered && sbr.toString().endsWith(",")) {
-                sbr.deleteCharAt(sbr.length() - 1);
-            }
-            //------7.ORDER BY default update_at DESC
-            if (!ordered) {
-                sbr.append(" ORDER BY l.update_at DESC");
-            }
-        }
-
-        //-------8.limit(query)
-        if (isList) {
-            if (query.pageSize > 0) {
-                if (DIALECT_MYSQL == dialect) {
-                    sbr.append(" LIMIT ");
-                    if (query.pageIndex > 0) {
-                        sbr.append((query.pageIndex - 1) * query.pageSize).append(",");
-                    }
-                    if (query.pageSize > 0) {
-                        sbr.append(query.pageSize);
-                    }
-                } else if (DIALECT_MSSQL == dialect) {
-                    sbr.append(" OFFSET ");
-                    if (query.pageIndex > 0) {
-                        sbr.append((query.pageIndex - 1) * query.pageSize).append(" ROWS ");
-                    }
-                    if (query.pageSize > 0) {
-                        sbr.append(" FETCH NEXT ").append(query.pageSize).append(" ROWS ONLY  ");
-                    }
-                } else if (DIALECT_PGSQL == dialect) {
-                    sbr.append(" LIMIT ").append(query.pageSize);
-                    if (query.pageIndex > 0) {
-                        sbr.append(" OFFSET ").append((query.pageIndex - 1) * query.pageSize);
-                    }
-                } else if (DIALECT_ORACLE == dialect) {
-                    StringBuilder sr = new StringBuilder();
-                    sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr).append(") o ");
-                    if (query.pageSize > 0) {
-                        sr.append(" WHERE ROWNUM<=").append(query.pageSize).append(")  o1");
-                    }
-                    if (query.pageIndex > 0) {
-                        sr.append(" WHERE o1.rowno>").append((query.pageIndex - 1) * query.pageSize).append(";");
-                    }
-                    //聚合类使用子查询
-                    if (!DbUtil.isEmptyOrNull(aggregate)) {
-                        sqlEntity.sql = "SELECT " + aggregate + " FROM (" + sr.toString() + ") temp";
-                    }
-                    sqlEntity.sql = sr.toString();
-                }
-                //-------8.limit(builder)
-            } else {
-                String result = appendWhereLimit(builder, sbr);
-                if (null != result) {
-                    //聚合类使用子查询
-                    if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
-                        sbr.setLength(0);
-                        sbr.append("SELECT ").append(aggregate).append(" FROM (").append(result).append(") temp");
-                    }
-                }
-            }
-
-        }
-
-        sqlEntity.sql = sbr.toString();
-        //聚合类使用子查询
-        if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
-            String tmpSql = sbr.toString();
-            sbr.setLength(0);
-            sbr.append("SELECT ").append(aggregate).append(" FROM (").append(tmpSql).append(") temp");
-        }
-        sbr.append(";");
-
-        sqlEntity.sql = sbr.toString();
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-    private boolean distinctAggerate(String aggregate) {
-        return aggregate.toLowerCase().contains("distinct(");
-    }
-
-    private void getValue(StringBuilder sbr, Object value, List<Object> parameters) {
-        if (null != value) {
-            sbr.append("?");
-            parameters.add(value);
-        } else {
-            throw new IllegalArgumentException("append value with NULL");
-        }
-    }
-
-
-    private String appendWhereLimit(OBuilder OBuilder, StringBuilder sbr) {
-        if (null != OBuilder) {
-            if (OBuilder.limitDelta() > 0) {
-                if (DIALECT_MYSQL == dialect) {
-                    sbr.append(" LIMIT ");
-                    if (OBuilder.limitStart() > 0) {
-                        sbr.append(OBuilder.limitStart()).append(",");
-                    }
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(OBuilder.limitDelta());
-                    }
-                    return null;
-                } else if (DIALECT_MSSQL == dialect) {
-                    sbr.append(" OFFSET ");
-                    if (OBuilder.limitStart() >= 0) {
-                        sbr.append(OBuilder.limitStart()).append(" ROWS ");
-                    }
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(" FETCH NEXT  ").append(OBuilder.limitDelta()).append(" ROWS ONLY  ");
-                    }
-                    return null;
-                } else if (DIALECT_PGSQL == dialect) {
-                    sbr.append(" LIMIT ");
-
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(OBuilder.limitDelta());
-                    }
-                    if (OBuilder.limitStart() >= 0) {
-                        sbr.append(" OFFSET ").append(OBuilder.limitStart());
-                    }
-                    return null;
-                } else if (DIALECT_ORACLE == dialect) {
-                    StringBuilder sr = new StringBuilder();
-                    sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr.toString()).append(") o ");
-                    if (OBuilder.limitDelta() > 0) {
-                        sr.append(" WHERE ROWNUM<=").append(OBuilder.limitDelta()).append(")  o1");
-                    }
-                    if (OBuilder.limitStart() >= 0) {
-                        sr.append(" WHERE o1.rowno>").append(OBuilder.limitStart());
-                    }
-                    return sr.toString();
-                }
-            }
-        }
-        return null;
-    }
-
-
-}

+ 0 - 246
car-wash-jdbc/src/main/java/com/kym/jdbc/express/UpdateSQLExpress.java

@@ -1,246 +0,0 @@
-package com.kym.jdbc.express;
-
-import com.kym.DbUtil;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.OBuilder.Where;
-import com.kym.jdbc.SQLEntity;
-import com.kym.jdbc.annotations.DBF;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
-/**
- * sql表达式 -update
- */
-public class UpdateSQLExpress implements SQLExpress<SQLEntity> {
-
-    private final Logger logger = LoggerFactory.getLogger(DeleteSQLExpress.class);
-
-    /**
-     * update  的表名
-     */
-    private String table;
-
-    /**
-     * 更新的列名
-     */
-    private List<String> cols = new ArrayList<>();
-
-    /**
-     * 更新的值
-     */
-    private List<Object> values = new ArrayList<>();
-
-    /**
-     * update 的条件
-     */
-    private List<Where> conditions = new ArrayList<>();
-
-    private int dialect = SQLExpress.DIALECT_MYSQL;
-
-    public UpdateSQLExpress(int dialect) {
-        this.dialect = dialect;
-    }
-
-
-    public UpdateSQLExpress() {
-    }
-
-    @Override
-    public SQLEntity toSQL() {
-        if (DbUtil.isEmptyOrNull(cols)) {
-            throw new IllegalArgumentException("illegal update column, empty column");
-        }
-
-        if (DbUtil.isEmptyOrNull(conditions)) {
-            throw new IllegalArgumentException("illegal update column, empty condition");
-        }
-
-        SQLEntity entity = new SQLEntity();
-        StringBuilder sbr = new StringBuilder("UPDATE ");
-        sbr.append(table);
-
-        sbr.append(" SET ");
-        sbr.append(cols.stream().map(k -> getComma() + DbUtil.getColumnName(k) + getComma() + " = ?").collect(Collectors.joining(",")));
-        List<Object> parameters = new ArrayList<>(values);
-        sbr.append(" WHERE 1=1 ");
-        for (Where where : conditions) {
-            if (!DbUtil.isEmptyOrNull(where.key)) {
-                sbr.append(" AND ( ").append(getComma()).append(DbUtil.getColumnName(where.key)).append(getComma()).append(where.op);
-                if (where.op.contains("in") || where.op.contains("not in")) {
-                    sbr.append(" (?) ) ");
-                } else {
-                    sbr.append(" ? ) ");
-                }
-                parameters.add(where.value);
-            } else {
-                if (!DbUtil.isEmptyOrNull(where.sql)) {
-                    sbr.append(" AND (").append(where.sql).append(" ) ");
-                    if (!DbUtil.isEmptyOrNull(where.sqlValues)) {
-                        parameters.addAll(where.sqlValues);
-                    }
-                }
-            }
-        }
-
-        entity.sql = sbr.toString();
-        entity.parameters = parameters.toArray();
-        return entity;
-    }
-
-
-    public SQLEntity updateNative(Object o, OBuilder OBuilder, boolean ignoreNull, List<String> includes, List<String> excludes) {
-        this.table = getTableName(o.getClass(), o.getClass().getSimpleName());
-
-//        SQLEntity sqlEntity = new SQLEntity();
-//        List<Object> parameters = new ArrayList<>();
-
-//        StringBuilder sbr = new StringBuilder("UPDATE ");
-//        sbr.append(getTableName(o.getClass(), o.getClass().getSimpleName())).append(" SET ");
-        Set<Field> fields = DbUtil.getEntityFields(o.getClass());
-//        boolean hasUpdateField = false;
-        for (Field field : fields) {
-            if (DbUtil.isUsageField(field)) {
-                DBF dbf = field.getAnnotation(DBF.class);
-                if (null == dbf) {
-                    continue;
-                }
-                String fieldName = field.getName();
-                if (!DbUtil.isEmptyOrNull(excludes)) {
-                    if (excludes.contains(DbUtil.getColumnName(fieldName)) || excludes.contains(fieldName)) {
-                        continue;
-                    }
-                }
-                if (!DbUtil.isEmptyOrNull(includes)) {
-                    if (!includes.contains(fieldName) && !includes.contains(DbUtil.getColumnName(fieldName))) {
-                        continue;
-                    }
-                }
-                if (dbf.canUpdate() && !isImmutableField(fieldName)) {
-                    Type type = field.getGenericType();
-                    Object value = DbUtil.getFieldValue(o, field);
-                    if (ignoreNull) {
-                        if (!DbUtil.isEmptyOrNull(value) && !"0".equals(value.toString())) {
-                            checkFieldValue(field, value, false);
-                            cols.add(fieldName);
-                            values.add(value);
-//                            conditions.add(new Where(fieldName,value));
-//                            sbr.append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma()).append("=");
-//                            appendValue(sbr, type, value, parameters);
-//                            hasUpdateField = true;
-                        }
-                    } else {
-                        if (null == value && type == Date.class) {
-                            continue;
-                        }
-                        cols.add(fieldName);
-                        values.add(value);
-//                        sbr.append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma()).append("=");
-//                        appendValue(sbr, type, value, parameters);
-//                        hasUpdateField = true;
-                    }
-
-                }
-            }
-        }
-        if (DbUtil.isEmptyOrNull(cols)) {
-            throw new RuntimeException("no field to UPDATE");
-        }
-//        if (sbr.toString().endsWith(",")) {
-//            sbr.deleteCharAt(sbr.length() - 1);
-//        }
-        //where
-        if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-            List<Where> wheres = OBuilder.getWheres();
-            if (!DbUtil.isEmptyOrNull(wheres)) {
-//                sbr.append(" WHERE ");
-                wheres.forEach(wh -> {
-                    if (ignoreNull) {
-                        if (null != wh.value) {
-                            conditions.add(wh);
-//                            sbr.append(getComma()).append(DbUtil.getColumnName(wh.key)).append(getComma()).append(" ").append(wh.op).append(" ");
-//                            appendValue(sbr, wh.value, parameters);
-//                            sbr.append(" AND ");
-                        }
-                    } else {
-                        conditions.add(wh);
-//                        sbr.append(getComma()).append(DbUtil.getColumnName(wh.key)).append(getComma()).append(" ").append(wh.op).append(" ");
-//                        appendValue(sbr, wh.value, parameters);
-//                        sbr.append(" AND ");
-                    }
-                });
-//                sbr.delete(sbr.length() - 5, sbr.length());
-            }
-            //TODO
-        /*    if (SQLExpress.DIALECT_MYSQL == dialect) {
-                //mysql innodb 锁
-                if (OBuilder.forUpdate) {
-                    sbr.append(" FOR UPDATE ");
-                }
-                if (OBuilder.forShare) {
-                    sbr.append(" LOCK IN SHARE MODE");
-                }
-            }*/
-        } else {
-            try {
-                conditions.add(new Where("id", DbUtil.getFieldValue(o, "id")));
-            } catch (Exception e) {
-                throw new IllegalArgumentException("tkf id is not exist!!!");
-            }
-        }
-//        sbr.append(";");
-//        sqlEntity.sql = sbr.toString();
-//        sqlEntity.parameters = parameters.toArray();
-        return toSQL();
-    }
-
-
-    private boolean isImmutableField(String fieldName) {
-        List<String> immutableFields = new ArrayList<>();
-        immutableFields.add("id");
-        immutableFields.add("createat");
-        immutableFields.add("updateat");
-        return immutableFields.contains(fieldName.toLowerCase());
-    }
-
-    public final SQLEntity updateBatch(List<String> fields, List<?> dtoList) {
-        if (DbUtil.isEmptyOrNull(fields)) {
-            throw new IllegalArgumentException("illegal update column, empty column");
-        }
-
-        if (DbUtil.isEmptyOrNull(dtoList)) {
-            throw new IllegalArgumentException("illegal update column, empty data set");
-        }
-
-        SQLEntity entity = new SQLEntity();
-        StringBuilder sbr = new StringBuilder("UPDATE ");
-        String table = getTableName(dtoList.get(0).getClass(), dtoList.get(0).getClass().getSimpleName());
-        sbr.append(table);
-        sbr.append(" SET ");
-        sbr.append(fields.stream().map(k -> getComma() + DbUtil.getColumnName(k) + getComma() + " = ?").collect(Collectors.joining(",")));
-        sbr.append(" WHERE id =  ? ");
-
-        List<Object> pameters = new ArrayList<>();
-        for (Object bean : dtoList) {
-            Object[] objs = new Object[fields.size() + 1];
-            for (int i = 0; i < fields.size(); i++) {
-                objs[i] = DbUtil.getFieldValue(bean, DbUtil.getCamelName(fields.get(i)));
-            }
-            objs[fields.size()] = DbUtil.getFieldValue(bean, "id");
-            pameters.add(objs);
-        }
-
-        entity.sql = sbr.toString();
-        entity.parameters = pameters.toArray();
-        return entity;
-    }
-
-}

+ 0 - 10
car-wash-jdbc/src/main/java/com/kym/jdbc/lambda/ColumnFunc.java

@@ -1,10 +0,0 @@
-package com.kym.jdbc.lambda;
-
-import java.io.Serializable;
-
-
-@FunctionalInterface
-public interface ColumnFunc<T, R> extends Serializable {
-    R apply(T t);
-}
-

+ 0 - 48
car-wash-jdbc/src/main/java/com/kym/jdbc/lambda/DefaultLambdaParser.java

@@ -1,48 +0,0 @@
-package com.kym.jdbc.lambda;
-
-
-import com.kym.DbUtil;
-
-import java.lang.invoke.SerializedLambda;
-import java.lang.reflect.Method;
-
-
-/**
- * 解析字段列名
- */
-public class DefaultLambdaParser {
-
-    public static <T> String getPropertyName(ColumnFunc<T, ?> property) {
-        if (property == null) {
-            return null;
-        }
-        try {
-            Method declaredMethod = property.getClass().getDeclaredMethod("writeReplace");
-            declaredMethod.setAccessible(Boolean.TRUE);
-            SerializedLambda serializedLambda = (SerializedLambda) declaredMethod.invoke(property);
-
-
-//            //Class.method.method....
-//            if (serializedLambda.getImplMethodKind() == MethodHandleInfo.REF_invokeStatic) {
-//                return getPropertyNameByInvokeStatic(property.getClass().getClassLoader(), serializedLambda);
-//            }
-            //Class::method
-            return getPropertyNameByInvokeVirtual(serializedLambda);
-
-        } catch (ReflectiveOperationException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static String getPropertyNameByInvokeVirtual(SerializedLambda serializedLambda) {
-        String method = serializedLambda.getImplMethodName();
-
-        String attr = null;
-        if (method.startsWith("get")) {
-            attr = method.substring(3);
-        } else {
-            attr = method.substring(2);
-        }
-        return DbUtil.firstToLowerCase(attr);
-    }
-}

+ 0 - 2378
car-wash-jdbc/src/main/java/com/kym/jdbc/template/JdbcExecute.java

@@ -1,2378 +0,0 @@
-package com.kym.jdbc.template;
-
-import com.kym.DbUtil;
-import com.kym.JacksonUtil;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.Bean;
-import com.kym.jdbc.IHandler;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.ResultHandler;
-import com.kym.jdbc.SQLEntity;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.Many;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import com.kym.jdbc.express.DeleteSQLExpress;
-import com.kym.jdbc.express.InsertSQLExpress;
-import com.kym.jdbc.express.SelectSQLExpress;
-import com.kym.jdbc.express.UpdateSQLExpress;
-import com.kym.jdbc.lambda.ColumnFunc;
-import com.kym.jdbc.lambda.DefaultLambdaParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.dao.DataAccessException;
-import org.springframework.jdbc.core.BatchPreparedStatementSetter;
-import org.springframework.jdbc.core.CallableStatementCallback;
-import org.springframework.jdbc.core.CallableStatementCreator;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.PreparedStatementCreator;
-import org.springframework.jdbc.core.ResultSetExtractor;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.support.GeneratedKeyHolder;
-import org.springframework.jdbc.support.KeyHolder;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-
-/**
- * sql处理封装(jdbcTemplate版本)
- *
- * @author yaop
- */
-public class JdbcExecute implements IHandler {
-
-    private final Logger logger = LoggerFactory.getLogger(JdbcExecute.class);
-
-    private List<String> ignores;
-
-//    private BoxMapper mapper;
-
-    private JdbcTemplate jdbcTemplate;
-
-    private JdbcHelper helper;
-
-    private int dialect;
-
-    public static final int FUNC_SUM = 1;
-    public static final int FUNC_AVG = 2;
-    public static final int FUNC_MIN = 3;
-    public static final int FUNC_MAX = 4;
-    public static final int FUNC_COUNT = 5;
-
-    public void setJdbcTemplate(JdbcTemplate jdbcTemplate, int dialect) {
-        this.jdbcTemplate = jdbcTemplate;
-        this.dialect = dialect;
-        helper = new JdbcHelper();
-        helper.setDialect(dialect);
-        ignores = new ArrayList<>();
-        ignores.add("richId");
-        ignores.add("rich1Id");
-        ignores.add("rich2Id");
-    }
-
-    public int getJdbcDialect() {
-        return helper.getDialect();
-    }
-
-    protected void beforeInsert(Object bean) {
-        if (null == bean) {
-            throw new IllegalStateException("no bean to insert into db");
-        }
-    }
-
-    protected void beforeUpdate(Object bean) {
-        if (null == bean) {
-            throw new IllegalStateException("no bean update to db");
-        }
-    }
-
-    protected void beforeUpdate(Object bean, OBuilder OBuilder) {
-        if (null == bean) {
-            throw new IllegalStateException("no bean update to db");
-        }
-    }
-
-    protected void beforeDelete(Class<?> clz, OBuilder OBuilder) {
-        if (null == clz) {
-            throw new IllegalStateException("no bean to delete from db");
-        }
-    }
-
-    protected void beforeDelete(Class<?> clz, Object id) {
-        if (null == clz) {
-            throw new IllegalStateException("no bean to delete from db");
-        }
-    }
-
-    protected void beforeSelect(BasicQuery query) {
-        if (null == query) {
-            throw new IllegalStateException("no bean to query from db");
-        }
-    }
-
-    protected void beforeSelect(Class<?> clz, OBuilder OBuilder) {
-        if (null == clz) {
-            throw new IllegalStateException("no bean to query from db");
-        }
-    }
-
-
-    private List<String> addExcludeInSelectList(Class<?> clz, String... excludes) {
-        List<String> exclude = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(excludes)) {
-            exclude.addAll(Arrays.asList(excludes));
-        }
-        Field[] fields = clz.getFields();
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            Type type = field.getGenericType();
-            if (type == List.class || type == Set.class) {
-                exclude.add(fieldName);
-            }
-            if (ignores.contains(fieldName)) {
-                exclude.add(fieldName);
-                exclude.add(fieldName.replace("Id", "Content"));
-            }
-        }
-        return exclude;
-    }
-
-    private List<String> addExcludeInSelectList(BasicQuery query, String... excludes) {
-        List<String> exclude = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(excludes)) {
-            exclude.addAll(Arrays.asList(excludes));
-        }
-
-        Field[] fields = query.getClass().getAnnotation(QE.class).clz().getFields();
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            Type type = field.getGenericType();
-            if (type == List.class || type == Set.class) {
-                exclude.add(fieldName);
-            }
-            if (ignores.contains(fieldName)) {
-                exclude.add(fieldName);
-                exclude.add(fieldName.replace("Id", "Content"));
-            }
-        }
-        return exclude;
-    }
-
-
-    //region select
-
-    /**
-     * 分页查询
-     */
-    public final Map<String, Object> selectPageList(BasicQuery query) {
-        beforeSelect(query);
-        Map<String, Object> map = new HashMap<>(2);
-        int pageSize = query.pageSize;
-        long count = selectCount(query);
-        if (0 == count) {
-            map.put("list", Collections.emptyList());
-        } else {
-            query.pageSize = pageSize;
-            map.put("list", selectList(query));
-        }
-        map.put("count", count);
-        return map;
-    }
-
-
-    /**
-     * 分页查询
-     */
-    public final Map<String, Object> selectPageList(Class<?> clz, OBuilder builder) {
-        beforeSelect(clz, builder);
-        Map<String, Object> map = new HashMap<>(2);
-        long count = selectCount(clz, builder);
-        if (0 == count) {
-            map.put("list", Collections.emptyList());
-        } else {
-            map.put("list", selectList(clz, builder));
-        }
-        map.put("count", count);
-        return map;
-    }
-
-    /**
-     * 分页查询
-     */
-    public final <T> Bean<T> selectPageBean(BasicQuery query) {
-        Bean<T> pageBean = new Bean<>();
-        pageBean.pageIndex = query.pageIndex;
-        pageBean.pageSize = query.pageSize;
-        beforeSelect(query);
-        long count = selectCount(query);
-        pageBean.count = count;
-        if (0 == count) {
-            pageBean.list = Collections.emptyList();
-        } else {
-            query.pageSize = pageBean.pageSize;
-            pageBean.list = selectList(query);
-        }
-        return pageBean;
-    }
-
-    /**
-     * 分页查询
-     */
-    public final <T> Bean<T> selectPageBean(Class<T> clz, OBuilder OBuilder) {
-        Bean<T> pageBean = new Bean<>();
-        beforeSelect(clz, OBuilder);
-        long count = selectCount(clz, OBuilder);
-        pageBean.count = count;
-        pageBean.pageIndex = OBuilder.limitStart();
-        pageBean.pageSize = OBuilder.limitDelta();
-        if (0 == count) {
-            pageBean.list = Collections.emptyList();
-        } else {
-            pageBean.list = selectList(clz, OBuilder);
-        }
-        return pageBean;
-    }
-
-    public final <T> List<T> selectListExclude(Class<T> clz, String... exclude) {
-        return selectListExclude(clz, OBuilder.build(), exclude);
-    }
-
-    public final <T> List<T> selectList(Class<T> clz, String... include) {
-        return selectList(clz, OBuilder.build(), include);
-    }
-
-    @SuppressWarnings("unchecked")
-    public final <T> List<T> selectListExclude(BasicQuery query, String... exclude) {
-        beforeSelect(query);
-//        SQLEntity entity = helper.selectListByQuery(query, null, addExcludeInSelectList(query, exclude));
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.select(query, null, null, addExcludeInSelectList(query, exclude), null, true);
-        Class<T> clz = (Class<T>) query.getClass().getAnnotation(QE.class).clz();
-        return queryForList(entity, clz);
-    }
-
-
-    /**
-     * 查询列表数据<p>
-     * <b>注意:query查询默认分页20</b></p>
-     */
-    @SuppressWarnings("unchecked")
-    public final <T> List<T> selectList(BasicQuery query, String... include) {
-        beforeSelect(query);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.select(query, null, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(query), null, true);
-
-//        SQLEntity entity = helper.selectListByQuery(query, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(query));
-        Class<T> clz = (Class<T>) query.getClass().getAnnotation(QE.class).clz();
-        return queryForList(entity, clz);
-    }
-
-    /**
-     * TODO 简单查询不做关联
-     */
-    @SuppressWarnings("unchecked")
-    public final <T> List<T> selectList(BasicQuery query, boolean simple, String... include) {
-        beforeSelect(query);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.select(query, null, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(query), null, true);
-//        SQLEntity entity = helper.selectListByQuery(query, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(query));
-        Class<T> clz = (Class<T>) query.getClass().getAnnotation(QE.class).clz();
-        return queryForList(entity, clz);
-    }
-
-    private <T> List<T> queryForList(SQLEntity entity, Class<T> clz) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(entity.parameters));
-        }
-        Set<Field> fields = DbUtil.getEntityFields(clz);
-        Map<String, Field> beanFieldMap = new HashMap<>(32);
-        Map<String, Type> beanFieldClassMap = new HashMap<>(32);
-        for (Field field : fields) {
-            String colName = getColumnName(field.getName());
-            beanFieldMap.put(getColumnName(field.getName()), field);
-            Class<?> type = field.getType();
-            if (type.isAssignableFrom(List.class) || type.isAssignableFrom(Set.class)) {
-                Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-                beanFieldClassMap.put(colName, collClz);
-            } else {
-                beanFieldClassMap.put(colName, type);
-            }
-        }
-        List<T> result = jdbcTemplate.query(connection -> {
-//            logger.debug("prepareStatement start...");
-            PreparedStatement ps = connection.prepareStatement(entity.sql);
-            DbUtil.setParameter(ps, entity.parameters);
-//            logger.debug("prepareStatement end...");
-            return ps;
-        }, (rs, i) -> {
-//            logger.debug("resultSet >>>>...");
-            return map2ObjectV3(clz, beanFieldMap, beanFieldClassMap, rs);
-        });
-
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-
-    public final <T> List<T> selectListExclude(Class<T> clz, OBuilder oBuilder, String... exclude) {
-        beforeSelect(clz, oBuilder);
-//        SQLEntity entity = helper.selectListByWhere(clz, oBuilder, null, addExcludeInSelectList(clz, exclude), true);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.selectListByWhereV2(clz, oBuilder, null, addExcludeInSelectList(clz, exclude), null, true);
-        return queryForList(entity, clz);
-    }
-
-    public final <T> List<T> selectList(Class<T> clz, OBuilder oBuilder, String... include) {
-        beforeSelect(clz, oBuilder);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.selectListByWhereV2(clz, oBuilder, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(clz), null, true);
-//        SQLEntity entity = helper.selectListByWhere(clz, oBuilder, new ArrayList<>(Arrays.asList(include)), addExcludeInSelectList(clz), true);
-        return queryForList(entity, clz);
-    }
-
-
-    public final <T> List<T> selectSimpleList(Class<T> clz, OBuilder oBuilder) {
-        beforeSelect(clz, oBuilder);
-        List<String> includes = new ArrayList<>();
-        includes.add("id");
-        includes.add("name");
-//        SQLEntity entity = helper.selectListByWhere(clz, oBuilder, includes, addExcludeInSelectList(clz), true);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.selectListByWhereV2(clz, oBuilder, includes, addExcludeInSelectList(clz), null, true);
-        return queryForList(entity, clz);
-    }
-
-
-    public final List<Map<String, Object>> selectListForMap(String sql, Object... parameters) {
-//        List<Map<String, Object>> result = new ArrayList<>();
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", sql, JacksonUtil.toJSONString(parameters));
-        }
-        List<Map<String, Object>> result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement preparedStatement = connection.prepareStatement(sql);
-                DbUtil.setParameter(preparedStatement, parameters);
-                return preparedStatement;
-            }
-        }, new RowMapper<Map<String, Object>>() {
-            @Override
-            public Map<String, Object> mapRow(ResultSet rs, int i) throws SQLException {
-                return resultToOneMap(rs);
-            }
-        });
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-
-    public final <T> List<T> selectList(String sql, ResultHandler<T> handler, Object... parameters) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("selectList 11 SQL>>>:\n{} \nP:{}", sql, JacksonUtil.toJSONString(parameters));
-        }
-        List<T> result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement preparedStatement = connection.prepareStatement(sql);
-                DbUtil.setParameter(preparedStatement, parameters);
-                return preparedStatement;
-            }
-        }, new RowMapper<T>() {
-            @Override
-            public T mapRow(ResultSet rs, int i) throws SQLException {
-                try {
-                    return handler.handle(resultToOneMap(rs));
-                } catch (Exception e) {
-                    logger.error("data convert error," + e.getMessage(), e);
-                }
-                return null;
-            }
-        });
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-    public final <T> List<T> selectList(String sql, Class<T> clz, Object... parameters) {
-        SQLEntity entity = new SQLEntity();
-        entity.sql = sql;
-        entity.parameters = parameters;
-        return queryForList(entity, clz);
-    }
-
-
-    public final Map<Integer, String> call(String sql, Object... parameters) {
-        int parameterLength = parameters.length;
-        int count = 0;
-        char[] chars = sql.toCharArray();
-        for (char aChar : chars) {
-            if (aChar == '?') {
-                count++;
-            }
-        }
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", sql, JacksonUtil.toJSONString(parameters));
-        }
-        int finalCount = count;
-        Map<Integer, String> data = (Map<Integer, String>) jdbcTemplate.execute(new CallableStatementCreator() {
-            @Override
-            public CallableStatement createCallableStatement(Connection conn) throws SQLException {
-                CallableStatement cs = conn.prepareCall(sql);
-                DbUtil.setParameter(cs, parameters);
-                //注册输出参数的类型
-                if (finalCount > 0 && finalCount > parameterLength) {
-                    for (int j = parameterLength + 1; j <= finalCount; j++) {
-                        cs.registerOutParameter(j, Types.VARCHAR);//
-                    }
-                }
-                return cs;
-            }
-        }, new CallableStatementCallback<Map<Integer, String>>() {
-            @Override
-            public Map<Integer, String> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
-                cs.execute();
-                Map<Integer, String> result = new HashMap<>();
-                if (finalCount > 0 && finalCount > parameterLength) {
-                    for (int j = parameterLength + 1; j <= finalCount; j++) {
-                        cs.registerOutParameter(j, Types.VARCHAR);//
-                        result.put(j, cs.getString(j));
-                    }
-                }
-                return result;// 获取输出参数的值
-            }
-        });
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return data;
-    }
-
-
-    public final Object selectObject(String sql, Object... parameters) {
-        SQLEntity entity = helper.selectOne(sql, parameters);
-        Map<String, Object> m = queryForMap(entity);
-        if (!DbUtil.isEmptyOrNull(m)) {
-            if (m.size() != 1) {
-                throw new IllegalStateException("SQL ERROR#" + sql);
-            }
-            Optional<Object> optional = m.values().stream().findFirst();
-            return optional.get();
-        }
-        return null;
-    }
-
-    /**
-     * 仅适用于查询单一字段的集合
-     */
-    public final List<Object> selectObjects(String sql, Object... parameters) {
-        SQLEntity entity = helper.selectList(sql, parameters);
-        List<Map> rs = queryForList(entity, Map.class);
-        List<Object> result = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(rs)) {
-            rs.forEach(item -> {
-                Set<Map.Entry<String, Object>> entrys = item.entrySet();
-                for (Map.Entry<String, Object> entry : entrys) {
-                    result.add(entry.getValue());
-                }
-            });
-
-        }
-     /*   jdbcTemplate.query(connection -> {
-            PreparedStatement ps = connection.prepareStatement(entity.sql);
-            DbUtil.setParameter(ps, entity.parameters);
-            return ps;
-        }, resultSet -> {
-            Map<String, Object> m = resultToMap(resultSet);
-
-        });*/
-        return result;
-    }
-
-
-    public final Integer selectInteger(String sql, Object... parameters) {
-        Object object = selectObject(sql, parameters);
-        if (null != object) {
-            return (int) object;
-        } else {
-            return 0;
-        }
-    }
-
-    public final Long selectLong(String sql, Object... parameters) {
-        Object object = selectObject(sql, parameters);
-        if (null != object) {
-            return (long) object;
-        } else {
-            return 0L;
-        }
-    }
-
-
-    private <T> T queryForMap(SQLEntity entity, Class<T> clz) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(entity.parameters));
-        }
-
-        //处理json函数
-        T result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement ps = connection.prepareStatement(entity.sql);
-                DbUtil.setParameter(ps, entity.parameters);
-                return ps;
-            }
-        }, new ResultSetExtractor<T>() {
-            public T extractData(ResultSet resultSet) throws SQLException, DataAccessException {
-                return extractResultToOneMapV3(clz, resultSet);
-            }
-        });
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-    private Map<String, Object> queryForMap(SQLEntity entity) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(entity.parameters));
-        }
-        //处理json函数
-        Map<String, Object> result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement ps = connection.prepareStatement(entity.sql);
-                DbUtil.setParameter(ps, entity.parameters);
-                return ps;
-            }
-        }, new ResultSetExtractor<Map<String, Object>>() {
-            @Override
-            public Map<String, Object> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
-                return extractResultToOneMap(resultSet);
-            }
-        });
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-    public final <T> double selectFunc(int funcType, Class<?> entityClz, ColumnFunc<T, ?> keyExtractor, OBuilder OBuilder) {
-        String func = switch (funcType) {
-            case FUNC_AVG -> "avg";
-            case FUNC_COUNT -> "count";
-            case FUNC_MIN -> "min";
-            case FUNC_MAX -> "max";
-            case FUNC_SUM -> "sum";
-            default -> throw new IllegalArgumentException("illegal argument for func type#:" + funcType);
-        };
-        func += "(" + getColumnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + ")";
-        SQLEntity entity = helper.selectFunc(entityClz, func, OBuilder);
-        Map<String, Object> m = queryForMap(entity);
-        if (!DbUtil.isEmptyOrNull(m)) {
-            if (m.size() != 1) {
-                throw new IllegalStateException("SQL ERROR# result count is not equal one!!!");
-            }
-            Collection<Object> values = m.values();
-            if (DbUtil.isEmptyOrNull(values)) {
-                return 0d;
-            }
-            Optional<Object> optional = values.stream().filter(k -> !DbUtil.isEmptyOrNull(k)).findFirst();
-            if (optional.isPresent()) {
-                Object obj = optional.get();
-                if (obj instanceof BigDecimal) {
-                    return ((BigDecimal) obj).doubleValue();
-                } else {
-                    return Double.parseDouble(obj.toString());
-                }
-            }
-        }
-        return 0d;
-    }
-
-    public final List<Object> selectDistinct(Class<?> clz, String key, OBuilder oBuilder) {
-        SQLEntity entity = helper.selectDistinct(clz, "DISTINCT(" + getColumnName(key) + ")", oBuilder);
-        List<Map> resultList = queryForList(entity, Map.class);
-        List<Object> objects = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(resultList)) {
-            for (Map<String, Object> map : resultList) {
-                if (!DbUtil.isEmptyOrNull(map)) {
-                    Set<Map.Entry<String, Object>> entrys = map.entrySet();
-                    for (Map.Entry<String, Object> entry : entrys) {
-                        objects.add(entry.getValue());
-                        break;
-                    }
-                }
-            }
-        }
-        return objects;
-    }
-
-    private <T> T queryForSingleObject(SQLEntity entity, Class<T> clz) {
-        Map<String, Object> map = queryForMap(entity);
-        if (!DbUtil.isEmptyOrNull(map)) {
-            Object value = null;
-            Set<Map.Entry<String, Object>> entrys = map.entrySet();
-            for (Map.Entry<String, Object> entry : entrys) {
-                value = entry.getValue();
-                break;
-            }
-            if (null != value) {
-                return JacksonUtil.toJavaObject(value.toString(), clz);
-            }
-        }
-        return null;
-    }
-
-
-    public final long selectCount(Class<?> clz, OBuilder oBuilder) {
-        beforeSelect(clz, oBuilder);
-//        SQLEntity entity = helper.selectCount(clz, oBuilder);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.selectFunc(clz, "COUNT(1)", oBuilder);
-        Long result = queryForSingleObject(entity, Long.class);
-        if (null == result) {
-            return 0;
-        }
-        return result;
-    }
-
-
-    public final long selectCount(BasicQuery query) {
-        beforeSelect(query);
-        query.pageSize = -1;
-//        SQLEntity entity = helper.selectCountByQuery(query);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.select(query, null, null, null, "COUNT(1)", false);
-        Long result = queryForSingleObject(entity, Long.class);
-        if (null == result) {
-            return 0;
-        }
-        return result;
-    }
-
-    public final Map<String, Object> selectOneForMap(String sql, Object... parameters) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", sql, JacksonUtil.toJSONString(parameters));
-        }
-        Map<String, Object> result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement preparedStatement = connection.prepareStatement(sql);
-                DbUtil.setParameter(preparedStatement, parameters);
-                return preparedStatement;
-            }
-        }, new ResultSetExtractor<Map<String, Object>>() {
-            @Override
-            public Map<String, Object> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
-                return resultToOneMap(resultSet);
-            }
-        });
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-
-    public final <T> T selectOne(String sql, ResultHandler<T> handler, Object... parameters) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", sql, JacksonUtil.toJSONString(parameters));
-        }
-        T result = jdbcTemplate.query(new PreparedStatementCreator() {
-            @Override
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement preparedStatement = connection.prepareStatement(sql);
-                DbUtil.setParameter(preparedStatement, parameters);
-                return preparedStatement;
-            }
-        }, new ResultSetExtractor<T>() {
-            @Override
-            public T extractData(ResultSet resultSet) throws SQLException, DataAccessException {
-                Map<String, Object> map = resultToOneMap(resultSet);
-                try {
-                    return handler.handle(map);
-                } catch (Exception e) {
-                    logger.error("data convert error," + e.getMessage(), e);
-                }
-                return null;
-            }
-        });
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-    private List<Map<String, Object>> resultToListMap(ResultSet rs) throws SQLException {
-        List<Map<String, Object>> result = new ArrayList<>();
-        if (null != rs) {
-            ResultSetMetaData rsmd = rs.getMetaData();
-            while (rs.next()) {
-                Map<String, Object> map = new HashMap<>(16);
-                int columnCount = rsmd.getColumnCount();
-                for (int i = 0; i < columnCount; i++) {
-                    String columnLabel = rsmd.getColumnLabel(i + 1);
-                    map.put(columnLabel, rs.getObject(i + 1));
-                }
-                result.add(map);
-            }
-        }
-        return result;
-    }
-
-    private Map<String, Object> resultToOneMap(ResultSet rs) throws SQLException {
-        Map<String, Object> map = new HashMap<>();
-        if (null != rs) {
-            ResultSetMetaData rsmd = rs.getMetaData();
-            int columnCount = rsmd.getColumnCount();
-            for (int i = 0; i < columnCount; i++) {
-                String columnLabel = rsmd.getColumnLabel(i + 1);
-                map.put(columnLabel, rs.getObject(i + 1));
-            }
-        }
-        return map;
-    }
-
-
-    private Map<String, Object> extractResultToOneMap(ResultSet rs) throws SQLException {
-        Map<String, Object> map = new HashMap<>();
-        if (null != rs) {
-            ResultSetMetaData rsmd = rs.getMetaData();
-            int columnCount = rsmd.getColumnCount();
-            while (rs.next()) {
-                for (int i = 0; i < columnCount; i++) {
-                    String columnLabel = rsmd.getColumnLabel(i + 1);
-                    map.put(columnLabel, rs.getObject(i + 1));
-                }
-            }
-        }
-        return map;
-    }
-
-    private <T> T extractResultToOneMapV3(Class<T> clz, ResultSet rs) throws SQLException {
-        Set<Field> fields = DbUtil.getEntityFields(clz);
-        Map<String, Field> beanFieldMap = new HashMap<>(32);
-        Map<String, Type> beanFieldClassMap = new HashMap<>(32);
-        for (Field field : fields) {
-            String colName = getColumnName(field.getName());
-            beanFieldMap.put(getColumnName(field.getName()), field);
-            Class<?> type = field.getType();
-            if (type.isAssignableFrom(List.class) || type.isAssignableFrom(Set.class)) {
-                Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-                beanFieldClassMap.put(colName, collClz);
-            } else {
-                beanFieldClassMap.put(colName, type);
-            }
-        }
-
-        T t = null;
-        while (rs.next()) {
-            t = map2ObjectV3(clz, beanFieldMap, beanFieldClassMap, rs);
-        }
-//        Map<String, Object> map = new HashMap<>();
-  /*      if (null != rs) {
-            ResultSetMetaData rsmd = rs.getMetaData();
-            int columnCount = rsmd.getColumnCount();
-            int fetchSize = rs.getFetchSize();
-            int idx = 0;
-            while (rs.next()) {
-
-                if (idx == fetchSize - 1) {
-                    for (int i = 0; i < columnCount; i++) {
-                        String columnLabel = rsmd.getColumnLabel(i + 1);
-                        t = map2ObjectV3(clz, beanFieldMap, beanFieldClassMap, rs);
-//                    map.put(columnLabel, rs.getObject(i + 1));
-                    }
-                }
-                idx++;
-            }
-        }*/
-        return t;
-    }
-
-    public final <T> T selectOne(Class<T> clz, ColumnFunc<T, ?> keyExtractor, Object value) {
-        SQLEntity entity = helper.selectOneByWhere(clz, OBuilder.build().eq(DefaultLambdaParser.getPropertyName(keyExtractor), value), null, null);
-        T t = queryForMap(entity, clz);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-
-    public final <T> T selectOne(Class<T> clz, String fieldName, Object value) {
-        SQLEntity entity = helper.selectOneByWhere(clz, OBuilder.build().eq(fieldName, value), null, null);
-        T t = queryForMap(entity, clz);
-//        Map<String, Object> map = queryForMap(entity);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-    public final <T> T selectOne(Class<T> clz, long id, String... include) {
-        SQLEntity entity = helper.selectById(clz, id, Arrays.asList(include), null);
-        T t = queryForMap(entity, clz);
-//        Map<String, Object> map = queryForMap(entity);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-
-    public final <T> T selectOneExclude(Class<T> clz, long id, String... exclude) {
-        SQLEntity entity = helper.selectById(clz, id, null, Arrays.asList(exclude));
-        T t = queryForMap(entity, clz);
-//        Map<String, Object> map = queryForMap(entity);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, Arrays.asList(exclude));
-        }
-        return t;
-    }
-
-    public final <T> T selectOneExist(Class<T> clz, long id) {
-        T bean = selectOne(clz, id);
-        if (null == bean) {
-            throw new IllegalArgumentException(clz.getAnnotation(Entity.class).comment() + "不存在");
-        }
-        return bean;
-    }
-
-    public final <T> T selectOneExist(Class<T> clz, OBuilder builder) {
-        beforeSelect(clz, builder);
-        T bean = selectOne(clz, builder);
-        if (null == bean) {
-            throw new IllegalArgumentException(clz.getAnnotation(Entity.class).comment() + "不存在");
-        }
-        return bean;
-    }
-
-    public final <T> T selectOne(Class<T> clz, OBuilder builder) {
-        beforeSelect(clz, builder);
-//        SQLEntity entity = helper.selectOneByWhere(clz, builder, null, null);
-        SelectSQLExpress express = new SelectSQLExpress(dialect);
-        SQLEntity entity = express.selectListByWhereV2(clz, builder, null, null, null, false);
-        T t = queryForMap(entity, clz);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-    public final <T> T selectOne(Class<T> clz, OBuilder builder, List<String> includes) {
-        beforeSelect(clz, builder);
-        SQLEntity entity = helper.selectOneByWhere(clz, builder, includes, null);
-        T t = queryForMap(entity, clz);
-//        Map<String, Object> map = queryForMap(entity);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-    @SuppressWarnings("unchecked")
-    public final <T> T selectOne(BasicQuery query, String... include) {
-        beforeSelect(query);
-        SQLEntity entity = helper.selectOneByQuery(query, Arrays.asList(include), null);
-        Class<T> clz = (Class<T>) query.getClass().getAnnotation(QE.class).clz();
-//        Map<String, Object> map = queryForMap(entity);
-        T t = queryForMap(entity, clz);
-//        T t = map2Object(clz, map);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, null);
-        }
-        return t;
-    }
-
-
-    @SuppressWarnings("unchecked")
-    public final <T> T selectOneExclude(BasicQuery query, String... exclude) {
-        beforeSelect(query);
-        SQLEntity entity = helper.selectOneByQuery(query, null, Arrays.asList(exclude));
-        Class<T> clz = (Class<T>) query.getClass().getAnnotation(QE.class).clz();
-//        Map<String, Object> map = queryForMap(entity);
-//        T t = map2Object(clz, map);?
-        T t = queryForMap(entity, clz);
-        //Annotation @Many
-        if (null != t) {
-            setJoinList(t, clz, Arrays.asList(exclude));
-        }
-        return t;
-    }
-
-/*
-    public final <T> T selectField(Class<?> clz, String fieldName, OBuilder OBuilder, Class<T> rspClz) {
-        String sql = "select " + getColumnName(fieldName) + " as f0 from " + getTableName(clz.getSimpleName()) + " where " + OBuilder.toSql();
-        return selectOne(sql, rs -> JacksonUtil.toJavaObject(rs.get("f0"), rspClz));
-    }
-
-    public final <T> T selectField(Class<?> clz, ColumnFunc<T, ?> keyExtractor, OBuilder OBuilder, Class<T> rspClz) {
-        String sql = "select " + getColumnName(DefaultLambdaParser.getPropertyName(keyExtractor)) + " as f0 from " + getTableName(clz.getSimpleName()) + " where " + OBuilder.toSql();
-        return selectOne(sql, rs -> JacksonUtil.toJavaObject(rs.get("f0"), rspClz));
-    }
-*/
-
-
-    //endregion
-
-
-    //region insert
-
-    /**
-     * ------------insert------------
-     */
-    public final long insert(Object bean) {
-        beforeInsert(bean);
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insert(bean, null);
-        long id = executeInsert(entity, true);
-//        long id = insert(bean, false, false, "id");
-//        setFieldValue(bean, "id", id);
-        try {
-            Field field = DbUtil.getField(bean, "id");
-            field.setAccessible(true);
-            field.set(bean, id);
-        } catch (Exception e) {
-            logger.error("insert error ", e);
-        }
-        return id;
-    }
-
-    public final long insertWithKey(Object bean) {
-        beforeInsert(bean);
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insertWithGenKey(bean, null);
-        long id = executeInsert(entity, true);
-//        long id = insert(bean, false, false, "id");
-//        setFieldValue(bean, "id", id);
-        try {
-            Field field = DbUtil.getField(bean, "id");
-            field.setAccessible(true);
-            field.set(bean, id);
-        } catch (Exception e) {
-            logger.error("insert error ", e);
-        }
-        return id;
-    }
-
-
-    /**
-     * 插入记录(无id返回)
-     */
-    public final void insertOnly(Object bean) {
-        beforeInsert(bean);
-//        insert(bean, false, true, "id");
-        InsertSQLExpress insertSQLExpress = new InsertSQLExpress();
-        SQLEntity entity = insertSQLExpress.insert(bean, null);
-        executeInsert(entity, false);
-    }
-
-    /**
-     * 插入非空值
-     */
-    public final long insertSelective(Object bean, String... exclude) {
-        beforeInsert(bean);
-        List<String> exs = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(exclude)) {
-            exs.addAll(Arrays.asList(exclude));
-        }
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insertSelective(bean, exs);
-//        SQLEntity entity = helper.insertSelective(bean, exs);
-        long id = executeInsert(entity, true);
-        try {
-            Field field = DbUtil.getField(bean, "id");
-            field.setAccessible(true);
-            field.set(bean, id);
-        } catch (Exception e) {
-            logger.error("insert error ", e);
-        }
-        return id;
-    }
-
-    private long executeInsert(SQLEntity entity, boolean returnKey) {
-        long result = 0;
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(entity.parameters));
-        }
-        if (returnKey) {
-            KeyHolder keyHolder = new GeneratedKeyHolder();
-            jdbcTemplate.update(new PreparedStatementCreator() {
-                @Override
-                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                    if (helper.getDialect() == JdbcHelper.DIALECT_PGSQL) {
-                        PreparedStatement ps = connection.prepareStatement(entity.sql, new String[]{"id"});
-                        DbUtil.setParameter(ps, entity.parameters);
-                        return ps;
-                    }
-                    if (helper.getDialect() == JdbcHelper.DIALECT_MYSQL) {
-                        PreparedStatement ps = connection.prepareStatement(entity.sql, PreparedStatement.RETURN_GENERATED_KEYS);
-                        DbUtil.setParameter(ps, entity.parameters);
-                        return ps;
-                    }
-                    return null;
-                }
-            }, keyHolder);
-            Number number = keyHolder.getKey();
-            long id = -1;
-            if (null != number) {
-                id = number.longValue();
-            }
-            result = id;
-        } else {
-            jdbcTemplate.update(connection -> {
-                PreparedStatement ps = connection.prepareStatement(entity.sql);
-                DbUtil.setParameter(ps, entity.parameters);
-                return ps;
-            });
-        }
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-
-    /**
-     * 插入非空值(无id返回)
-     */
-    public final void insertSelectiveOnly(Object bean, String... exclude) {
-        beforeInsert(bean);
-        List<String> exs = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(exclude)) {
-            exs.addAll(Arrays.asList(exclude));
-        }
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insertSelective(bean, exs);
-//        SQLEntity entity = helper.insertSelective(bean, Arrays.asList(exclude));
-        executeInsert(entity, false);
-    }
-
-    /**
-     * @param withGenKey 是否主动生成主键<br>
-     *                   主键策略可以使用{@link com.kym.common.utils.sequence.IdWorker.nextId} ,避免高并发情况下通过#lastInsertId获取id错误的情况
-     */
-    public final long insert(Object bean, boolean withGenKey, boolean insertOnly, String... exclude) {
-        beforeInsert(bean);
-        InsertSQLExpress express = new InsertSQLExpress();
-        if (!withGenKey) {
-            SQLEntity entity = express.insert(bean, new ArrayList<>(Arrays.asList(exclude)));
-            return executeInsert(entity, !insertOnly);
-        } else {
-            Object id = getFieldValue(bean, "id");
-            if (DbUtil.isEmptyOrNull(id)) {
-                throw new IllegalArgumentException("without id exist for insert withGenKey");
-            }
-            SQLEntity entity = express.insertWithGenKey(bean, new ArrayList<>(Arrays.asList(exclude)));
-            executeInsert(entity, false);
-            return (long) getFieldValue(bean, "id");
-        }
-    }
-
-    public final void insertBatch(List<?> dtoList) {
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insertBatch(dtoList);
-        insertBatch(entity);
-    }
-
-    public final void insertBatch(String sql, Object[] paramters) {
-        SQLEntity entity = new SQLEntity(sql, paramters);
-        insertBatch(entity);
-    }
-
-    /**
-     * 需自己组装SQL语句
-     */
-    private void insertBatch(SQLEntity entity) {
-        long start = System.currentTimeMillis();
-        Object[] parameters = entity.parameters;
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(parameters));
-        }
-        int batch = 1;
-        int batchSize = 256;
-        int totalSize = parameters.length;
-        if (totalSize > batchSize) {
-            batch = (int) Math.ceil((double) totalSize / batchSize);
-        }
-        for (int k = 0; k < batch; k++) {
-            int startPos = k * batchSize;
-            int endPos = Math.min(totalSize, ((k + 1) * batchSize));
-            int number = endPos - startPos;
-            Object[] objs = new Object[number];
-            System.arraycopy(parameters, startPos, objs, 0, number);
-//            List<Object[]> subList = parameters.subList(i * batchSize, Math.min(totalSize, ((i + 1) * batchSize)));
-            jdbcTemplate.batchUpdate(entity.sql, new BatchPreparedStatementSetter() {
-                @Override
-                public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
-                    Object[] obj = (Object[]) objs[i];
-                    DbUtil.setParameter(preparedStatement, obj);
-//                    preparedStatement.addBatch();
-                }
-
-                @Override
-                public int getBatchSize() {
-                    return objs.length;
-                }
-            });
-        }
-
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-    }
-
-    /**
-     * 无需自己组装SQL
-     */
-    public final void insertBatch(List<String> fields, List<?> dtoList) {
-        InsertSQLExpress express = new InsertSQLExpress();
-        SQLEntity entity = express.insertBatch(fields, dtoList);
-        insertBatch(entity);
-    }
-
-    //endregion
-
-    //region update
-
-    /**
-     * ------------update------------
-     */
-
-    private int executeUpdate(SQLEntity entity) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", entity.sql, JacksonUtil.toJSONString(entity.parameters));
-        }
-        int result = jdbcTemplate.update(connection -> {
-            PreparedStatement ps = connection.prepareStatement(entity.sql);
-            DbUtil.setParameter(ps, entity.parameters);
-            return ps;
-        });
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-        return result;
-    }
-
-    public final int update(Object bean) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, OBuilder.build(), false, null, null);
-//        SQLEntity entity = helper.updateByWhere(bean, OBuilder.build());
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-    public final int update(String sql, Object... parameters) {
-        SQLEntity entity = new SQLEntity(sql, parameters);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects#SQL:{},PARAMS:{}", sql, JacksonUtil.toJSONString(parameters));
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-    public final int update(Object bean, OBuilder builder) {
-        checkConditionOnUpdate(builder);
-        beforeUpdate(bean, builder);
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, builder, false, null, null);
-//        SQLEntity entity = helper.updateByWhere(bean, builder);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-
-    public final <T> int update(Object bean, OBuilder builder, ColumnFunc<T, ?> keyExtractor) {
-        checkConditionOnUpdate(builder);
-        beforeUpdate(bean, builder);
-        List<String> includes = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(keyExtractor)) {
-            includes.add(DefaultLambdaParser.getPropertyName(keyExtractor));
-        }
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, builder, false, includes, null);
-//        SQLEntity entity = helper.updateByWhere(bean, builder, includes);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-    /**
-     * 部分字段更新(为空、为0不更新)
-     */
-    public final int updateSelective(Object bean) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, null, true, null, null);
-//        SQLEntity entity = helper.updateSelective(bean, null, null);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-
-    /**
-     * 只更新指定字段
-     */
-    public final int updateSelective(Object bean, String... includes) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        List<String> ic = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(includes)) {
-            ic = Arrays.asList(includes);
-        }
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, null, true, ic, null);
-//        SQLEntity entity = helper.updateSelective(bean, ic, null);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-
-    @SafeVarargs
-    public final <T> int updateSelective(Object bean, ColumnFunc<T, ?>... keyExtractor) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        List<String> ic = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(keyExtractor)) {
-            for (ColumnFunc<T, ?> func : keyExtractor) {
-                ic.add(DefaultLambdaParser.getPropertyName(func));
-            }
-        }
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, null, true, ic, null);
-//        SQLEntity entity = helper.updateSelective(bean, ic, null);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-    public final int updateSelectiveExclude(Object bean, String... excludes) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        List<String> ec = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(excludes)) {
-            ec = Arrays.asList(excludes);
-        }
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, null, true, null, ec);
-//        SQLEntity entity = helper.updateSelective(bean, null, ec);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-
-    public final <T> int updateSelectiveExclude(Object bean, ColumnFunc<T, ?>... exkeyExtractor) {
-        checkConditionOnUpdate(bean);
-        beforeUpdate(bean);
-        List<String> ec = new ArrayList<>();
-        if (!DbUtil.isEmptyOrNull(exkeyExtractor)) {
-            for (ColumnFunc<T, ?> tColumnFunc : exkeyExtractor) {
-                ec.add(DefaultLambdaParser.getPropertyName(tColumnFunc));
-            }
-        }
-        UpdateSQLExpress express = new UpdateSQLExpress();
-
-        SQLEntity entity = express.updateNative(bean, null, true, null, ec);
-//        SQLEntity entity = helper.updateSelective(bean, null, ec);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-        return count;
-    }
-
-
-    /**
-     * 部分字段更新(为空、为0不更新)
-     */
-    public final int updateSelective(Object bean, OBuilder OBuilder) {
-        checkConditionOnUpdate(OBuilder);
-        beforeUpdate(bean, OBuilder);
-//        SQLEntity entity = helper.updateSelectiveByWhere(bean, OBuilder);
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateNative(bean, OBuilder, true, null, null);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# update with no record effects");
-        } else {
-            logger.debug("update effect rows:{}", count);
-        }
-
-        return count;
-    }
-
-    public final <T> void updateBatchV2(List<ColumnFunc<T, ?>> keyExtractors, List<?> dtoList) {
-        List<String> fields = new ArrayList<>();
-        keyExtractors.forEach(keyExtractor -> fields.add(DefaultLambdaParser.getPropertyName(keyExtractor)));
-        updateBatch(fields, dtoList);
-    }
-
-    /**
-     * 批量更新方法
-     *
-     * @param fields
-     * @param dtoList
-     */
-    public final void updateBatch(List<String> fields, List<?> dtoList) {
-        UpdateSQLExpress express = new UpdateSQLExpress();
-        SQLEntity entity = express.updateBatch(fields, dtoList);
-        updateBatch(entity.sql, entity.parameters);
-    }
-
-    public final void updateBatch(String sql, Object[] params) {
-        long start = System.currentTimeMillis();
-        if (logger.isInfoEnabled()) {
-            logger.info("SQL>>>:\n{} \nP:{}", sql, params.length > 20 ? params.length : JacksonUtil.toJSONString(params));
-        }
-        int batch = 1;
-        int batchSize = 256;
-        int totalSize = params.length;
-        if (totalSize > batchSize) {
-            batch = (int) Math.ceil((double) totalSize / batchSize);
-        }
-        for (int k = 0; k < batch; k++) {
-            int startPos = k * batchSize;
-            int endPos = Math.min(totalSize, ((k + 1) * batchSize));
-            int number = endPos - startPos;
-            Object[] objs = new Object[number];
-            System.arraycopy(params, startPos, objs, 0, number);
-//            List<Object[]> subList = parameters.subList(i * batchSize, Math.min(totalSize, ((i + 1) * batchSize)));
-            jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
-                @Override
-                public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
-                    Object[] obj = (Object[]) objs[i];
-                    DbUtil.setParameter(preparedStatement, obj);
-//                    preparedStatement.addBatch();
-                }
-
-                @Override
-                public int getBatchSize() {
-                    return objs.length;
-                }
-            });
-        }
-
-        if (logger.isDebugEnabled()) {
-            logger.info("SQL<<< cost:{}ms", System.currentTimeMillis() - start);
-        }
-
-    }
-
-    //endregion
-
-    /**
-     * 更新数据必须指定where条件
-     */
-    private void checkConditionOnUpdate(Object bean) {
-        Object val = getFieldValue(bean, "id");
-        if (null == val) {
-            throw new IllegalArgumentException("no key exist for update SQL");
-        }
-    }
-
-    /**
-     * 更新数据必须指定条件
-     */
-    private void checkConditionOnUpdate(OBuilder OBuilder) {
-        if (null == OBuilder || DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-            throw new IllegalArgumentException("no builder condition exist for update SQL");
-        }
-    }
-
-//region delete
-
-    /**
-     * ------------delete------------
-     */
-    public final int delete(Class<?> clz, OBuilder builder) {
-        checkConditionOnDelete(builder);
-        beforeDelete(clz, builder);
-        DeleteSQLExpress express = new DeleteSQLExpress();
-        SQLEntity entity = express.delete(clz, builder);
-//        SQLEntity delete = helper.delete(clz, OBuilder);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# no record delete,class:{},builder:{}", clz.getSimpleName(), builder);
-        }
-        return count;
-    }
-
-    public final int delete(Class<?> clz, Object id) {
-        if (DbUtil.isEmptyOrNull(id)) {
-            throw new IllegalArgumentException("delete without id exist!");
-        }
-        beforeDelete(clz, id);
-        DeleteSQLExpress express = new DeleteSQLExpress();
-        SQLEntity entity = express.deleteById(clz, id);
-//        SQLEntity delete = helper.deleteById(clz, id);
-        int count = executeUpdate(entity);
-        if (count == 0) {
-            logger.warn("SQLHandler WARN# no record delete,class:{},id:{}", clz.getSimpleName(), id);
-        }
-        return count;
-    }
-
-    //endregion
-
-    /**
-     * 检验条件避免truncate表
-     */
-    private void checkConditionOnDelete(OBuilder OBuilder) {
-        if (null == OBuilder || DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-            throw new IllegalArgumentException("delete without builder condition exist!");
-        }
-    }
-
-
-    /**
-     * ---------------util tool----------
-     */
-    public final void setFieldValue(Object bean, Field field, Object val) throws IllegalAccessException {
-        long start = System.nanoTime();
-//        logger.debug("map2Object setFieldValue<<<<<<<{}", start);
-        field.setAccessible(true);
-        Class<?> type = field.getType();
-        if (type == Date.class) {
-            if (val instanceof String) {
-                //TODO yyyy-mm-dd  HH:mm:ss.SSS
-                String v = (String) val;
-                if (v.length() == 10) {
-                    LocalDate time = LocalDate.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-                    Date d = Date.from(LocalDateTime.of(time, LocalTime.MIN).atZone(ZoneId.systemDefault()).toInstant());
-                    field.set(bean, d);
-                } else if (v.length() > 20 && v.length() <= 24) {
-                    LocalDateTime time = LocalDateTime.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
-                    Date d = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
-                    field.set(bean, d);
-                } else if (v.length() > 24) {
-                    LocalDateTime time = LocalDateTime.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"));
-                    Date d = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
-                    field.set(bean, d);
-                } else {
-                    LocalDateTime time = LocalDateTime.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                    Date d = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
-                    field.set(bean, d);
-                }
-            } else {
-                field.set(bean, val);
-            }
-            //logger.warn("map2Object setFieldValue Date<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == String.class) {
-            field.set(bean, val.toString());
-            //logger.warn("map2Object setFieldValue String<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == int.class || type == Integer.class) {
-            //db tinyint(1)->boolean
-            if (val instanceof Boolean) {
-                field.set(bean, (Boolean) val ? 1 : 0);
-            } else {
-                field.set(bean, Integer.valueOf(val.toString()));
-            }
-            //logger.warn("map2Object setFieldValue Integer<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == double.class || type == Double.class) {
-            field.set(bean, Double.parseDouble(val.toString()));
-            //logger.warn("map2Object setFieldValue Double<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == long.class || type == Long.class) {
-            field.set(bean, Long.parseLong(val.toString()));
-            //logger.warn("map2Object setFieldValue Long<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == float.class || type == Float.class) {
-            field.set(bean, Float.parseFloat(val.toString()));
-        } else if (type == short.class || type == Short.class) {
-            field.set(bean, Short.parseShort(val.toString()));
-        } else if (type == byte.class || type == Byte.class) {
-            field.set(bean, Byte.valueOf(val.toString()));
-        } else if (type == boolean.class || type == Boolean.class) {
-            if (val instanceof String) {
-                boolean v = "t".equals(val) || "1".equals(val);
-                field.set(bean, v);
-            } else {
-                field.set(bean, Boolean.parseBoolean(val.toString()));
-            }
-            //logger.warn("map2Object setFieldValue Boolean<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == char.class || type == Character.class) {
-            field.set(bean, val);
-        } else if (type == BigDecimal.class) {
-            field.set(bean, new BigDecimal(val.toString()));
-            //logger.warn("map2Object setFieldValue BigDecimal<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isArray()) {
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = "[]";
-            }
-            setFieldArrayValue(bean, field, type, val.toString());
-            //logger.warn("map2Object setFieldValue Array<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isAssignableFrom(List.class) && !val.getClass().isAssignableFrom(ArrayList.class)) {
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = Collections.emptyList();
-            }
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            field.set(bean, JacksonUtil.toJavaObjectList(val.toString(), (Class<?>) collClz));
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isAssignableFrom(Set.class) && !val.getClass().isAssignableFrom(HashSet.class)) {
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = Collections.emptySet();
-            }
-            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-            List<?> dataList = JacksonUtil.toJavaObjectList(val.toString(), (Class<?>) collClz);
-            if (DbUtil.isEmptyOrNull(dataList)) {
-                field.set(bean, Collections.emptySet());
-            } else {
-                field.set(bean, new HashSet<>(dataList));
-            }
-
-        } else if (type.isAssignableFrom(Map.class)) {
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = new HashMap<>();
-            }
-            field.set(bean, JacksonUtil.toJavaObject(val.toString(), Map.class));
-        } else {
-//            logger.debug("setFieldValue>> {},{}", field.getName(), bean.getClass().getName());
-            field.set(bean, JacksonUtil.toJavaObject(val.toString(), type));
-        }
-        logger.debug("map2Object setFieldValue<<<<<<<{}-{}", (System.nanoTime() - start), field.getName());
-    }
-
-
-    public final void setFieldValueV3(Object bean, Field field, Type type, ResultSet rs, String i) throws IllegalAccessException, SQLException {
-        if (null == field) {
-            logger.warn("null field,label:{}class:{}", i, bean.getClass().getName());
-            return;
-        }
-        long start = System.nanoTime();
-//        logger.debug("map2Object setFieldValue<<<<<<<{}", start);
-        field.setAccessible(true);
-        Class<?> type1 = field.getType();
-        if (type1 == Date.class) {
-            field.set(bean, rs.getTimestamp(i));
-            //logger.warn("map2Object setFieldValue Date<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == String.class) {
-            field.set(bean, rs.getString(i));
-            //logger.warn("map2Object setFieldValue String<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == int.class || type1 == Integer.class) {
-            //db tinyint(1)->boolean
-            field.set(bean, rs.getInt(i));
-            //logger.warn("map2Object setFieldValue Integer<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == double.class || type1 == Double.class) {
-            field.set(bean, rs.getDouble(i));
-            //logger.warn("map2Object setFieldValue Double<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == long.class || type1 == Long.class) {
-            field.set(bean, rs.getLong(i));
-            //logger.warn("map2Object setFieldValue Long<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == float.class || type1 == Float.class) {
-            field.set(bean, rs.getFloat(i));
-        } else if (type1 == short.class || type1 == Short.class) {
-            field.set(bean, rs.getShort(i));
-        } else if (type1 == byte.class || type1 == Byte.class) {
-            field.set(bean, rs.getByte(i));
-        } else if (type1 == boolean.class || type1 == Boolean.class) {
-//            boolean v = "t".equals(val) || "1".equals(val);
-            field.set(bean, rs.getBoolean(i));
-            //logger.warn("map2Object setFieldValue Boolean<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1 == char.class || type1 == Character.class) {
-            field.set(bean, rs.getString(i));
-        } else if (type1 == BigDecimal.class) {
-            field.set(bean, rs.getBigDecimal(i));
-            //logger.warn("map2Object setFieldValue BigDecimal<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1.isArray()) {
-            String val = rs.getString(i);
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = "[]";
-            }
-            setFieldArrayValue(bean, field, type1, val);
-            //logger.warn("map2Object setFieldValue Array<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1.isAssignableFrom(List.class)) {
-            //logger.warn("map2Object setFieldValue List1<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            String val = rs.getString(i);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptyList());
-                return;
-            }
-
-//            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-//            //logger.warn("map2Object setFieldValue List2<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-//            //logger.warn("map2Object setFieldValue List21<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            field.set(bean, JacksonUtil.toJavaObjectList(val, (Class<?>) type));
-            //logger.warn("map2Object setFieldValue List3<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type1.isAssignableFrom(Set.class)) {
-            String val = rs.getString(i);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptySet());
-                return;
-            }
-//            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-            List<?> dataList = JacksonUtil.toJavaObjectList(val, (Class<?>) type);
-            if (DbUtil.isEmptyOrNull(dataList)) {
-                field.set(bean, Collections.emptySet());
-            } else {
-                field.set(bean, new HashSet<>(dataList));
-            }
-
-        } else if (type1.isAssignableFrom(Map.class)) {
-            String val = rs.getString(i);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptyMap());
-                return;
-            }
-            field.set(bean, JacksonUtil.toJavaObject(val, Map.class));
-        } else {
-            String val = rs.getString(i);
-//            logger.debug("setFieldValue>> {},{}", field.getName(), bean.getClass().getName());
-            field.set(bean, JacksonUtil.toJavaObject(val, type1));
-        }
-        logger.debug("map2Object setFieldValueV3<<<<<<<{}-{}", (System.nanoTime() - start), field.getName());
-    }
-
-
-    public final void setFieldValueV2(Object bean, Field field, String label, ResultSet rs) throws IllegalAccessException, SQLException {
-        long start = System.nanoTime();
-//        logger.debug("map2Object setFieldValue<<<<<<<{}", start);
-//        field.setAccessible(true);
-        Class<?> type = field.getType();
-        if (type == Date.class) {
-            field.set(bean, rs.getTimestamp(label));
-            return;
-        } else if (type == String.class) {
-            field.set(bean, rs.getString(label));
-            //logger.warn("map2Object setFieldValue String<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == int.class || type == Integer.class) {
-            //db tinyint(1)->boolean
-            field.set(bean, rs.getInt(label));
-            //logger.warn("map2Object setFieldValue Integer<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == double.class || type == Double.class) {
-            field.set(bean, rs.getDouble(label));
-            //logger.warn("map2Object setFieldValue Double<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == long.class || type == Long.class) {
-            field.set(bean, rs.getLong(label));
-            //logger.warn("map2Object setFieldValue Long<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == float.class || type == Float.class) {
-            field.set(bean, rs.getFloat(label));
-        } else if (type == short.class || type == Short.class) {
-            field.set(bean, rs.getShort(label));
-        } else if (type == byte.class || type == Byte.class) {
-            field.set(bean, rs.getByte(label));
-        } else if (type == boolean.class || type == Boolean.class) {
-            field.set(bean, rs.getBoolean(label));
-            //logger.warn("map2Object setFieldValue Boolean<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type == char.class || type == Character.class) {
-//            field.set(bean, val);
-        } else if (type == BigDecimal.class) {
-            field.set(bean, rs.getBigDecimal(label));
-            //logger.warn("map2Object setFieldValue BigDecimal<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isArray()) {
-            String val = rs.getString(label);
-            if (DbUtil.isEmptyOrNull(val)) {
-                val = "[]";
-            }
-            setFieldArrayValue(bean, field, type, val);
-            //logger.warn("map2Object setFieldValue Array<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isAssignableFrom(List.class)) {
-            String val = rs.getString(label);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptyList());
-                return;
-            }
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            field.set(bean, JacksonUtil.toJavaObjectList(val, (Class<?>) collClz));
-            //logger.warn("map2Object setFieldValue List<<<<<<<{}-{}", System.nanoTime() - start, field.getName());
-            return;
-        } else if (type.isAssignableFrom(Set.class)) {
-            String val = rs.getString(label);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptySet());
-                return;
-            }
-            Type collClz = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
-            List<?> dataList = JacksonUtil.toJavaObjectList(val, (Class<?>) collClz);
-            if (DbUtil.isEmptyOrNull(dataList)) {
-                field.set(bean, Collections.emptySet());
-            } else {
-                field.set(bean, new HashSet<>(dataList));
-            }
-
-        } else if (type.isAssignableFrom(Map.class)) {
-            String val = rs.getString(label);
-            if (DbUtil.isEmptyOrNull(val)) {
-                field.set(bean, Collections.emptyMap());
-                return;
-            }
-            field.set(bean, JacksonUtil.toJavaObject(val, Map.class));
-        } else {
-            String val = rs.getString(label);
-//            logger.debug("setFieldValue>> {},{}", field.getName(), bean.getClass().getName());
-            field.set(bean, JacksonUtil.toJavaObject(val, type));
-        }
-        logger.debug("map2Object setFieldValue<<<<<<<{}-{}", (System.nanoTime() - start), field.getName());
-    }
-
-
-    public final void setFieldValue(Object bean, String fieldName, Object val) {
-        long start = System.nanoTime();
-//        logger.debug("map2Object setFieldValue<<<<<<<{}", fieldName);
-        if (null == val) {
-            return;
-        }
-        Field field = null;
-        try {
-            try {
-                field = bean.getClass().getDeclaredField(fieldName);
-            } catch (Exception e) {
-                try {
-                    field = bean.getClass().getField(fieldName);
-                } catch (Exception e1) {
-                    try {
-                        field = bean.getClass().getSuperclass().getDeclaredField(fieldName);
-                    } catch (Exception e2) {
-                        field = bean.getClass().getSuperclass().getField(fieldName);
-                    }
-                }
-            }
-//            logger.debug("map2Object setFieldValue<<<<<<<xxxxxxxxxxx:{}", (System.nanoTime() - start));
-            setFieldValue(bean, field, val);
-//            field.setAccessible(false);
-        } catch (Exception e) {
-            logger.warn("SQLHandler ERR# setFieldValue111  field:{},{},{}", e.getClass().getSimpleName(), fieldName, val);
-        }
-
-//        logger.debug("map2Object setFieldValue  22222222222<<<<<<:{}", (System.nanoTime() - start));
-    }
-
-    private void setFieldArrayValue(Object bean, Field field, Class<?> clz, String value) {
-
-        try {
-            List<Object> list = JacksonUtil.toList(value);
-            if (null == list) {
-                field.set(bean, Collections.emptyList());
-                return;
-            }
-            if (clz == String[].class) {
-                String[] arr = new String[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = ((String) list.get(i)).replaceAll("\u0001", "/");
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == int[].class) {
-                int[] arr = new int[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Integer) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == short[].class) {
-                short[] arr = new short[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Short) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == long[].class) {
-                long[] arr = new long[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Long) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == byte[].class) {
-                byte[] arr = new byte[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Byte) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == double[].class) {
-                double[] arr = new double[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Double) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == float[].class) {
-                float[] arr = new float[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Float) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == char[].class) {
-                char[] arr = new char[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Character) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else if (clz == boolean[].class) {
-                boolean[] arr = new boolean[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = (Boolean) list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            } else {
-                Object[] arr = new Object[list.size()];
-                if (!DbUtil.isEmptyOrNull(list)) {
-                    for (int i = 0; i < list.size(); i++) {
-                        arr[i] = list.get(i);
-                    }
-                }
-                field.set(bean, arr);
-            }
-        } catch (Exception e) {
-            throw new IllegalArgumentException("convert array field ERR");
-        }
-    }
-
-    public final void setFieldValue(Class<?> type, Object bean, String fieldName, Object val) {
-        try {
-            Field field = bean.getClass().getField(fieldName);
-            field.setAccessible(true);
-            if (type == Date.class) {
-                field.set(bean, val);
-            } else if (type == String.class) {
-                field.set(bean, val.toString());
-            } else if (type == int.class || type == Integer.class) {
-                field.set(bean, Integer.valueOf(val.toString()));
-            } else if (type == double.class || type == Double.class) {
-                field.set(bean, Double.valueOf(val.toString()));
-            } else if (type == long.class || type == Long.class) {
-                field.set(bean, Long.valueOf(val.toString()));
-            } else if (type == float.class || type == Float.class) {
-                field.set(bean, Float.valueOf(val.toString()));
-            } else if (type == short.class || type == Short.class) {
-                field.set(bean, Short.valueOf(val.toString()));
-            } else if (type == byte.class || type == Byte.class) {
-                field.set(bean, Byte.valueOf(val.toString()));
-            } else if (type == boolean.class || type == Boolean.class) {
-                field.set(bean, Boolean.valueOf(val.toString()));
-            } else if (type == char.class || type == Character.class) {
-                field.set(bean, val);
-            } else if (field.getType().isArray()) {
-                field.set(bean, JacksonUtil.toList(val.toString()));
-            } else if (type == BigDecimal.class) {
-                field.set(bean, new BigDecimal(val.toString()));
-            }
-            field.setAccessible(false);
-        } catch (Exception e) {
-            logger.error("SQLHandler ERR# setFieldValue " + e.getMessage(), e);
-        }
-    }
-
-    public final Object getFieldValue(Object bean, String fieldName) {
-        Object defValu = "";
-        try {
-            fieldName = getCamelName(fieldName);
-//            Field field = bean.getClass().getField(fieldName);
-            Field field = DbUtil.getField(bean, fieldName);
-            field.setAccessible(true);
-            defValu = field.get(bean);
-            if (null == defValu) {
-                Class<?> type = field.getType();
-                if (type == String.class) {
-                    defValu = "";
-                } else if (type == int.class || type == Integer.class) {
-                    defValu = 0;
-                } else if (type == double.class || type == Double.class) {
-                    defValu = 0d;
-                } else if (type == long.class || type == Long.class) {
-                    defValu = 0L;
-                } else if (type == float.class || type == Float.class) {
-                    defValu = 0F;
-                } else if (type == short.class || type == Short.class) {
-                    defValu = 0;
-                } else if (type == byte.class || type == Byte.class) {
-                    defValu = 0;
-                } else if (type == boolean.class || type == Boolean.class) {
-                    defValu = 0;
-                } else if (type == char.class || type == Character.class) {
-                    defValu = '0';
-                } else if (field.getType().isArray()) {
-                    defValu = new Object[]{};
-                }
-            }
-            field.setAccessible(false);
-        } catch (Exception e) {
-            logger.warn("SQLHandler ERR# getFieldValue ,field:{}, bean:{} ,msg:{}", fieldName, bean.getClass().getSimpleName(), e.getMessage());
-        }
-        return defValu;
-    }
-
-
-    protected final String getColumnName(String fieldName) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = fieldName.toCharArray();
-        for (char ch : chars) {
-            if (Character.isUpperCase(ch)) {
-                sbr.append("_").append(Character.toLowerCase(ch));
-            } else {
-                sbr.append(ch);
-            }
-        }
-        return sbr.toString();
-    }
-
-    /**
-     * 获取驼峰变量名
-     */
-    protected final String getCamelName(String fieldName) {
-        StringBuilder sbr = new StringBuilder();
-        char[] chars = fieldName.toCharArray();
-        boolean preUpper = false;
-        for (char ch : chars) {
-            if ('_' == ch) {
-                preUpper = true;
-            } else {
-                if (preUpper) {
-                    sbr.append(Character.toUpperCase(ch));
-                    preUpper = false;
-                } else {
-                    sbr.append(ch);
-                }
-            }
-        }
-        return sbr.toString();
-    }
-
-    protected final String getTableName(String tbName) {
-        if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }
-        return JdbcHelper.getTbPrefix() + getColumnName(tbName);
-    }
-
-    private <T> T map2Object(Class<T> clz, ResultSet rs) throws SQLException {
-        logger.debug("map2Object>>>>>>>");
-
-        ResultSetMetaData metaData = rs.getMetaData();
-        int count = metaData.getColumnCount();
-
-        Map<String, Object> map = new HashMap<>(32);
-        for (int i = 1; i < count + 1; i++) {
-            map.put(metaData.getColumnLabel(i), rs.getString(i));
-        }
-
-        if (clz.isAssignableFrom(Map.class)) {
-            return (T) map;
-        }
-        T t = map2Object(clz, map);
-        logger.debug("map2Object<<<<<<<");
-        return t;
-    }
-
-
-    private <T> T map2ObjectV3(Class<T> clz, Map<String, Field> beanFieldMap, Map<String, Type> beanFieldClassMap, ResultSet rs) throws SQLException {
-//        logger.debug("map2ObjectV3>>>>>>>");
-        ResultSetMetaData metaData = rs.getMetaData();
-        int count = metaData.getColumnCount();
-        if (clz.isAssignableFrom(Map.class)) {
-            Map<String, String> map = new HashMap<>(32);
-            for (int i = 1; i < count + 1; i++) {
-                map.put(metaData.getColumnLabel(i), rs.getString(i));
-            }
-            return (T) map;
-        }
-        T t = null;
-        try {
-            t = clz.getDeclaredConstructor().newInstance();
-            for (int i = 1; i < count + 1; i++) {
-                String label = metaData.getColumnLabel(i);
-                setFieldValueV3(t, beanFieldMap.get(label), beanFieldClassMap.get(label), rs, label);
-            }
-        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        }
-        return t;
-    }
-
-
-/*    private <T> T map2ObjectV2(Class<T> clz, Map<String, Field> beanFieldMap, ResultSet rs) throws SQLException {
-        logger.debug("map2ObjectV2>>>>>>>");
-
-        ResultSetMetaData metaData = rs.getMetaData();
-        int count = metaData.getColumnCount();
-
-        Map<String, String> map = new HashMap<>(32);
-        for (int i = 1; i < count + 1; i++) {
-            map.put(metaData.getColumnLabel(i), rs.getString(i));
-        }
-
-        if (clz.isAssignableFrom(Map.class)) {
-            return (T) map;
-        }
-        T t = map2ObjectV2(clz, beanFieldMap, map);
-        logger.debug("map2ObjectV2<<<<<<<");
-        return t;
-    }*/
-
-
-    private <T> T map2ObjectV2(Class<T> clz, Map<String, Field> beanFieldMap, ResultSet rs) {
-        if (DbUtil.isEmptyOrNull(beanFieldMap)) {
-            return null;
-        }
-        logger.debug("map2Object native1111<<<<<<<");
-        try {
-            Map<String, Class<?>> join = new HashMap<>(8);
-            T t = clz.getDeclaredConstructor().newInstance();
-            Map<String, Field> fieldMap = new HashMap<>();
-            beanFieldMap.forEach((label, field) -> {
-                if (DbUtil.isUsageField(field)) {
-                    field.setAccessible(true);
-                    String fieldName = field.getName();
-                    Class<?> type = field.getType();
-                    if (!type.isArray() && type != List.class && type != Set.class && !DbUtil.isGenericType(type) && type != String.class && type != Date.class && type != BigDecimal.class && type != Map.class && !field.isAnnotationPresent(DBF.class)) {
-                        join.put(fieldName, type);
-                        fieldMap.put(fieldName, field);
-                        return;
-                    }
-                    try {
-                        String val = rs.getString(label);
-                        if (null == val) {
-                            if (type.isArray()) {
-                                //类型转换
-                                field.set(t, new Object[]{});
-//                                setFieldValue(t, field, new Object[]{});
-                            } else if (type.isAssignableFrom(List.class)) {
-                                field.set(t, Collections.emptyList());
-//                                setFieldValue(t, field, Collections.emptyList());
-                            } else if (type.isAssignableFrom(Set.class)) {
-                                field.set(t, Collections.emptySet());
-//                                setFieldValue(t, field, Collections.emptySet());
-                            } else if (type.isAssignableFrom(Map.class)) {
-                                field.set(t, Collections.emptyMap());
-//                                setFieldValue(t, field, Collections.emptyMap());
-                            }
-                        } else {
-                            setFieldValueV2(t, field, label, rs);
-                        }
-                    } catch (Exception e) {
-                        logger.error(e.getMessage(),e);
-                    }
-                }
-            });
-
-            logger.debug("map2Object native222222<<<<<<<");
-            //关联类型
-            if (!DbUtil.isEmptyOrNull(join)) {
-                join.forEach((fieldName, clzType) -> {
-                    //java field => Account account
-                    //sql field =>account_id,account_name
-                    try {
-                        Field field = fieldMap.get(fieldName);
-                        One one = field.getAnnotation(One.class);
-                        if (null != one && !one.noQuery() && !DbUtil.isGenericType(clzType)) {
-                            String prefix = field.getName();
-                            Object o = field.getType().getDeclaredConstructor().newInstance();
-                            Set<Field> oneFields = DbUtil.getEntityFields(field.getType());
-//                            Field[] oneFields = field.getType().getFields();
-                            boolean oneSet = false;
-                            for (Field oneField : oneFields) {
-                                if (oneField.isAnnotationPresent(DBF.class)) {
-                                    String oneKey = prefix + "_" + getColumnName(oneField.getName());
-                                    Object oneValue = rs.getObject(oneKey);
-                                    if (null == oneValue) {
-                                        continue;
-                                    }
-                                    setFieldValue(o, oneField, oneValue);
-                                    oneSet = true;
-                                }
-                            }
-                            if (oneSet) {
-                                setFieldValue(t, field, o);
-                            }
-                        }
-                        if (!DbUtil.isEmptyOrNull(rs.getString(fieldName))) {
-                            Object joinObj = JacksonUtil.toJavaObject(rs.getString(fieldName), clzType);
-                            setFieldValue(t, field, joinObj);
-                        }
-                    } catch (Exception e) {
-                        logger.error("SQLHandler ERR# deal with db join reuslt by map2object,field:" + fieldName, e);
-                    }
-
-                });
-            }
-            logger.debug("map2Object native end<<<<<<<");
-            return t;
-        } catch (InstantiationException | IllegalAccessException e) {
-            logger.error("SQLHandler ERR# deal with db reuslt by map2object", e);
-            throw new IllegalStateException(e);
-        } catch (InvocationTargetException | NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-
-    private <T> T map2Object(Class<T> clz, Map<String, Object> map) {
-        if (DbUtil.isEmptyOrNull(map)) {
-            return null;
-        }
-        Set<Field> fields = DbUtil.getEntityFields(clz);
-        logger.debug("map2Object native1111<<<<<<<");
-        try {
-            Map<String, Class<?>> join = new HashMap<>(2);
-            T t = clz.getDeclaredConstructor().newInstance();
-            Map<String, Field> fieldMap = new HashMap<>();
-            for (Field field : fields) {
-                if (DbUtil.isUsageField(field)) {
-                    String fieldName = field.getName();
-                    Class<?> type = field.getType();
-                    if (!type.isArray() && type != List.class && type != Set.class && !DbUtil.isGenericType(type) && type != String.class && type != Date.class && type != BigDecimal.class && type != Map.class && !field.isAnnotationPresent(DBF.class)) {
-                        join.put(fieldName, type);
-                        fieldMap.put(fieldName, field);
-                        continue;
-                    }
-
-
-                    Object val = map.get(getColumnName(fieldName));
-                    if (null == val) {
-                        if (type.isArray()) {
-                            //类型转换
-                            field.set(t, new Object[]{});
-                        } else if (type.isAssignableFrom(List.class)) {
-                            field.set(t, Collections.emptyList());
-                        } else if (type.isAssignableFrom(Set.class)) {
-                            field.set(t, Collections.emptySet());
-                        } else if (type.isAssignableFrom(Map.class)) {
-                            field.set(t, Collections.emptyMap());
-                        }
-                    } else {
-                        setFieldValue(t, fieldName, val);
-//                        setFieldValue(t, field,getColumnName(fieldName), val.toString());
-                    }
-                }
-            }
-
-            logger.debug("map2Object native222222<<<<<<<");
-            //关联类型
-            if (!DbUtil.isEmptyOrNull(join)) {
-                join.forEach((fieldName, clzType) -> {
-                    //java field => Account account
-                    //sql field =>account_id,account_name
-                    try {
-                        Field field = fieldMap.get(fieldName);
-                        One one = field.getAnnotation(One.class);
-                        if (null != one && !one.noQuery() && !DbUtil.isGenericType(clzType)) {
-                            String prefix = field.getName();
-                            Object o = field.getType().getDeclaredConstructor().newInstance();
-                            Set<Field> oneFields = DbUtil.getEntityFields(field.getType());
-//                            Field[] oneFields = field.getType().getFields();
-                            boolean oneSet = false;
-                            for (Field oneField : oneFields) {
-                                if (oneField.isAnnotationPresent(DBF.class)) {
-                                    String oneKey = prefix + "_" + getColumnName(oneField.getName());
-                                    Object oneValue = map.get(oneKey);
-                                    if (null == oneValue) {
-                                        continue;
-                                    }
-                                    setFieldValue(o, oneField, oneValue);
-                                    oneSet = true;
-                                }
-                            }
-                            if (oneSet) {
-                                setFieldValue(t, field, o);
-                            }
-                        }
-                        if (!DbUtil.isEmptyOrNull(map.get(fieldName))) {
-                            Object joinObj = JacksonUtil.toJavaObject(map.get(fieldName).toString(), clzType);
-                            setFieldValue(t, field, joinObj);
-                        }
-                    } catch (Exception e) {
-                        logger.error("SQLHandler ERR# deal with db join reuslt by map2object,field:" + fieldName, e);
-                    }
-
-                });
-            }
-            logger.debug("map2Object native end<<<<<<<");
-            return t;
-        } catch (InstantiationException | IllegalAccessException e) {
-            logger.error("SQLHandler ERR# deal with db reuslt by map2object", e);
-            throw new IllegalStateException(e);
-        } catch (InvocationTargetException | NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private <T> List<T> map2ObjectList(Class<T> clz, List<Map<String, Object>> list) {
-        List<T> retList = new ArrayList<>(list.size());
-        if (!DbUtil.isEmptyOrNull(list)) {
-            list.forEach(map -> {
-                T t = map2Object(clz, map);
-                if (null != t) {
-                    retList.add(t);
-                }
-            });
-        }
-        return retList;
-    }
-
-    /**
-     * 关联集合查询并赋值
-     * 优化方案:一对多可以在联表查询时一并带出,不必进行二次查询
-     */
-    private void setJoinList(Object t, Class<?> clz, List<String> exclude) {
-        Field[] fields = clz.getDeclaredFields();
-        for (Field field : fields) {
-            if (field.isAnnotationPresent(Many.class) && !field.getAnnotation(Many.class).noQuery()) {
-                String fieldName = field.getName();
-                if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
-                    continue;
-                }
-                Many manyAnnotation = field.getAnnotation(Many.class);
-                String fkField = manyAnnotation.mkf();
-                Object value = getFieldValue(t, fkField);
-                List<?> list = selectList(manyAnnotation.te(), OBuilder.build().eq(manyAnnotation.tkf(), value));
-                field.setAccessible(true);
-                try {
-                    field.set(t, list);
-                } catch (Exception e) {
-                    logger.error("illegal argument error:{}, entity:" + fieldName, clz.getSimpleName());
-                }
-//                setFieldValue(t, fieldName, list);
-            }
-        }
-    }
-
-
-    @Override
-    public String getHandlerType() {
-        return IHandler.JDBC;
-    }
-
-}

+ 0 - 1733
car-wash-jdbc/src/main/java/com/kym/jdbc/template/JdbcHelper.java

@@ -1,1733 +0,0 @@
-package com.kym.jdbc.template;
-
-import com.kym.DbUtil;
-import com.kym.JacksonUtil;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.IHandler;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.SQLEntity;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.annotations.FK;
-import com.kym.jdbc.annotations.JoinType;
-import com.kym.jdbc.annotations.Many;
-import com.kym.jdbc.annotations.OP;
-import com.kym.jdbc.annotations.One;
-import com.kym.jdbc.annotations.QE;
-import com.kym.jdbc.annotations.QF;
-import com.kym.jdbc.annotations.QueryType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-
-/**
- * SQL动态解析器
- * <p>
- * jdbcTemplate模式
- *
- * @author yaop
- */
-public class JdbcHelper {
-    private final Logger logger = LoggerFactory.getLogger(JdbcHelper.class);
-
-    public static final int DIALECT_MYSQL = 1;
-    public static final int DIALECT_MSSQL = 2;
-    public static final int DIALECT_ORACLE = 3;
-    public static final int DIALECT_PGSQL = 4;
-
-    public static final String[] BASE_IGNORE = {"createAt", "updateAt", "createBy", "updateBy"};
-
-    private static final String DEFAULT_MKF = "id";
-
-    private String comma = "`";
-
-    private int dialect = 1;
-    /***
-     * 表名前缀
-     */
-    public static String tbPrefix = "t";
-
-    private static Function<String, String> func;
-
-
-    /**
-     * 设置解析器的SQL方言类型,默认MYSQL
-     */
-    public void setDialect(int dialectType) {
-        this.dialect = dialectType;
-        OBuilder.dialect = dialectType;
-        switch (dialectType) {
-            case IHandler.DIALECT_MYSQL -> this.comma = "`";
-            case IHandler.DIALECT_MSSQL -> this.comma = "'";
-            case IHandler.DIALECT_ORACLE -> this.comma = "\"";
-            case IHandler.DIALECT_PGSQL -> this.comma = "\"";
-            default -> {
-            }
-        }
-    }
-
-    public int getDialect() {
-        return dialect;
-    }
-
-    /**
-     * 设置表名前缀
-     */
-    public static void setFunc(Function<String, String> func) {
-        JdbcHelper.func = func;
-    }
-
-    public static void setTablePrefix(String prefix) {
-        JdbcHelper.tbPrefix = prefix;
-    }
-
-
-    public static String getTbPrefix() {
-        return JdbcHelper.tbPrefix;
-    }
-
-
-    //region json处理
-
-
-    //endregion
-
-    //region select
-    public SQLEntity selectList(String sql, Object... params) {
-        SQLEntity entity = new SQLEntity();
-      /*  if (!DbUtil.isEmptyOrNull(params)) {
-            for (Object param : params) {
-                if (param.getClass() == String.class) {
-                    sql = sql.replaceFirst("\\?", "'" + DbUtil.injectDefend(param.toString()) + "'");
-                } else if (param.getClass() == Date.class) {
-                    sql = sql.replaceFirst("\\?", "'" + new Timestamp(((Date) param).getTime()) + "'");
-                } else {
-                    sql = sql.replaceFirst("\\?", DbUtil.injectDefend(param.toString()));
-                }
-            }
-        }*/
-        entity.sql = sql;
-        entity.parameters = params;
-        return entity;
-    }
-
-
-    /**
-     * 聚合函数查询<p>
-     * 注意:聚合函数的查询需要使用子查询</p>
-     *
-     * @param clz
-     * @param func    聚合查询字段 count(1) sum(amt)
-     * @param builder
-     * @return
-     */
-    public SQLEntity selectFunc(Class<?> clz, String func, OBuilder builder) {
-        SQLEntity entity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>(16);
-        boolean distinct = distinctAggerate(func);
-        StringBuilder sbr = new StringBuilder();
-        boolean originEntity = !clz.getSimpleName().endsWith("Info");
-        if (originEntity) {
-            String funcField = func;
-            if (!distinct) {
-                funcField = func.contains("COUNT(") ? "1" : func.trim().split("\\(")[1].split("\\)")[0].trim();
-            }
-            sbr.append("SELECT ").append(funcField).append(" FROM ").append(getTableName(clz, clz.getSimpleName()));
-            if (null != builder) {
-                if (!DbUtil.isEmptyOrNull(builder.getWheres())) {
-                    List<OBuilder.Where> wheres = builder.getWheres();
-                    if (!DbUtil.isEmptyOrNull(wheres)) {
-                        sbr.append(" \r\n WHERE 1=1");
-                        wheres.forEach(wh -> {
-                            sbr.append(" AND ");
-                            appendBuilderWhere(sbr, wh, "", parameters);
-                        });
-                    }
-                }
-                //GROUP BY
-                if (!DbUtil.isEmptyOrNull(builder.getGroupBys())) {
-                    sbr.append("  \r\n GROUP BY ");
-                    builder.getGroupBys().forEach(group -> {
-                        sbr.append(group).append(" ,");
-                    });
-                    sbr.deleteCharAt(sbr.length() - 1);
-                }
-                //ORDER BY
-                if (!DbUtil.isEmptyOrNull(builder.getOrderBys())) {
-                    sbr.append(" ORDER BY ");
-                    builder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
-                    sbr.deleteCharAt(sbr.length() - 1);
-                }
-
-                //count不分页
-                if (!func.contains("COUNT(")) {
-                    //分页
-                    String result = appendWhereLimit(builder, sbr);
-                    if (null != result) {
-                        if (!distinct) {
-                            entity.sql = "SELECT " + func + " FROM (" + result + ") temp";
-                        } else {
-                            entity.sql = result;
-                        }
-                    }
-                }
-            }
-            if (!distinct) {
-                entity.sql = "SELECT " + func + " FROM (" + sbr.toString() + ") temp";
-            } else {
-                entity.sql = sbr.toString();
-            }
-        } else {
-            //支持聚合查询的关联
-            String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
-            try {
-                Object obj = Class.forName(queryDomain).newInstance();
-                if (!DbUtil.isEmptyOrNull(func)) {
-                    DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
-                }
-                return select((BasicQuery) obj, builder, null, null, func, true);
-            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
-                throw new IllegalStateException(e);
-            }
-
-        }
-        entity.parameters = parameters.toArray();
-        return entity;
-    }
-
-    /**
-     * 聚合函数查询
-     */
-    public SQLEntity selectDistinct(Class<?> clz, String func, OBuilder OBuilder) {
-        return selectFunc(clz, func, OBuilder);
-    }
-
-    public SQLEntity selectListByWhere(Class<?> clz, OBuilder OBuilder, List<String> include, List<String> exclude, boolean isList) {
-        return selectListByWhereV2(clz, OBuilder, include, exclude, null, isList);
-    }
-
-
-    public SQLEntity selectListByWhereV2(Class<?> clz, OBuilder OBuilder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-        Set<Field> fields = DbUtil.getEntityFields(clz);
-        boolean isSimple = !clz.getSimpleName().endsWith("Info");
-        if (isSimple) {
-            Entity entity = clz.getAnnotation(Entity.class);
-            StringBuilder sbr = new StringBuilder();
-            if (!DbUtil.isEmptyOrNull(aggregate)) {
-                sbr.append("SELECT ").append(aggregate).append(" FROM ").append(getTableName(entity));
-            } else {
-                if (DbUtil.isEmptyOrNull(include)) {
-                    if (DbUtil.isEmptyOrNull(exclude)) {
-                        sbr.append("SELECT * FROM ").append(getTableName(entity));
-                    } else {
-                        sbr.append("SELECT ");
-                        for (Field field : fields) {
-                            if (DbUtil.isUsageField(field)) {
-                                //richId  rich2Id 不关联查
-                                String fileName = field.getName();
-                                if (!exclude.contains(fileName)) {
-                                    sbr.append(this.comma).append(DbUtil.getColumnName(fileName)).append(this.comma).append(" ,");
-                                }
-                            }
-                        }
-                        sbr.deleteCharAt(sbr.length() - 1);
-                        sbr.append("  \n FROM ").append(getTableName(entity));
-                    }
-                } else {
-                    sbr.append("SELECT ");
-                    for (Field field : fields) {
-                        if (DbUtil.isUsageField(field)) {
-                            String fileName = field.getName();
-                            if (include.contains(fileName)) {
-                                sbr.append(this.comma).append(DbUtil.getColumnName(fileName)).append(this.comma).append(" ,");
-                            }
-                        }
-                    }
-                    sbr.deleteCharAt(sbr.length() - 1);
-                    sbr.append("  \n FROM ").append(getTableName(entity));
-                }
-            }
-            if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-                List<OBuilder.Where> wheres = OBuilder.getWheres();
-                if (!DbUtil.isEmptyOrNull(wheres)) {
-                    sbr.append(" \r\n WHERE 1=1");
-                    wheres.forEach(wh -> {
-                        sbr.append(" AND ");
-                        appendBuilderWhere(sbr, wh, "", parameters);
-                    });
-                }
-            }
-
-
-            if (isList) {
-                //ORDER BY
-                if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getOrderBys())) {
-                    sbr.append(" ORDER BY ");
-                    OBuilder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
-                    sbr.deleteCharAt(sbr.length() - 1);
-                } else {
-                    sbr.append(" ORDER BY update_at DESC ");
-                }
-
-                //limit
-                String result = appendWhereLimit(OBuilder, sbr);
-                if (null != result) {
-                    sqlEntity.sql = result;
-                }
-            }
-
-            sbr.append(";");
-            sqlEntity.sql = sbr.toString();
-        } else {
-            String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
-            Object obj;
-            try {
-                obj = Class.forName(queryDomain).newInstance();
-                if (!DbUtil.isEmptyOrNull(aggregate)) {
-                    DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
-                }
-            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
-                throw new IllegalStateException(e);
-            }
-            return select((BasicQuery) obj, OBuilder, include, exclude, aggregate, isList);
-        }
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-
-    public SQLEntity selectListByQuery(BasicQuery query, List<String> include, List<String> exclude) {
-        return select(query, null, include, exclude, null, true);
-    }
-
-
-    /**
-     * 查询SQL解析生成
-     *
-     * @param query     query条件对象
-     * @param OBuilder  where条件对象
-     * @param include   指定查询字段集合
-     * @param exclude   指定过滤不查询字段集合
-     * @param aggregate 聚合查询条件
-     */
-    private SQLEntity select(BasicQuery query, OBuilder OBuilder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>(16);
-        if (!DbUtil.isEmptyOrNull(query.includeFields)) {
-            if (DbUtil.isEmptyOrNull(include)) {
-                include = new ArrayList<>();
-            }
-            for (String includeField : query.includeFields) {
-                if (!include.contains(includeField)) {
-                    include.add(includeField);
-                }
-            }
-        }
-        if (!DbUtil.isEmptyOrNull(query.excludeFields)) {
-            if (DbUtil.isEmptyOrNull(exclude)) {
-                exclude = new ArrayList<>();
-            }
-            for (String excludeField : query.excludeFields) {
-                if (!exclude.contains(excludeField)) {
-                    exclude.add(excludeField);
-                }
-            }
-        }
-        StringBuilder sbr = new StringBuilder();
-        int aliasIdx = 0;
-        //表别名 @QF->inner @FK、@One->left
-        Map<String, String> alias = new HashMap<>(4);
-        //关联表名
-        Map<String, String> tbs = new HashMap<>(4);
-        QE qEAnnotation = query.getClass().getAnnotation(QE.class);
-        String queryClassName = query.getClass().getSimpleName();
-        if (null == qEAnnotation) {
-            throw new IllegalStateException("query entity of " + queryClassName + " @Query Entity is not defined!");
-        }
-        Class<?> infoClass = qEAnnotation.clz();
-        Entity entity = infoClass.getSuperclass().getAnnotation(Entity.class);
-//        Field[] fields = infoClass.getFields();
-        Set<Field> fields = DbUtil.getEntityFields(infoClass);
-        Set<Field> qfields = DbUtil.getQueryFields(query.getClass());
-//        Field[] qfields = query.getClass().getFields();
-        //关联表别名
-        //------1.查询字段
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            //常量字段过滤
-            if (!DbUtil.isUsageField(field)) {
-                continue;
-            }
-            One oneAnnotation = field.getAnnotation(One.class);
-            Many manyAnnotation = field.getAnnotation(Many.class);
-            boolean isExtenstionField = null != oneAnnotation || null != manyAnnotation;
-            //忽略字段过滤
-            if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
-                continue;
-            }
-            //指定查询
-            if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
-                continue;
-            }
-            DBF DBFAnnotation = field.getAnnotation(DBF.class);
-            if (null != DBFAnnotation) {
-                FK foreignKey = field.getAnnotation(FK.class);
-                if (null != foreignKey) {
-                    Class<?> entityClass = foreignKey.clz();
-                    Entity ey = entityClass.getAnnotation(Entity.class);
-                    for (Field qfield : qfields) {
-                        if (qfield.isAnnotationPresent(QF.class)) {
-                            QF qf = qfield.getAnnotation(QF.class);
-                            String mkf = qf.pkf();
-                            if (!DbUtil.isEmptyOrNull(mkf) && mkf.equals(fieldName)) {
-                                if (null != DbUtil.getFieldValue(query, qfield)) {
-                                    alias.putIfAbsent(fieldName, "i" + aliasIdx++);
-                                    tbs.putIfAbsent(fieldName, getTableName(ey));
-                                }
-                            }
-                        }
-                    }
-                    alias.putIfAbsent(fieldName, "l" + aliasIdx++);
-                    tbs.putIfAbsent(fieldName, getTableName(ey));
-                }
-            } else {
-                if (null != oneAnnotation) {
-                    String mkf = oneAnnotation.mkf();
-                    if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
-                        mkf = fieldName;
-                    }
-                    JoinType joinType = oneAnnotation.join();
-                    if (JoinType.LEFT == joinType) {
-                        alias.put(mkf, "l" + aliasIdx++);
-                    } else if (JoinType.INNER == joinType) {
-                        alias.put(mkf, "i" + aliasIdx++);
-                    } else if (JoinType.RIGHT == joinType) {
-                        alias.put(mkf, "r" + aliasIdx++);
-                    }
-                }
-            }
-        }
-        //非聚合查询
-        if (DbUtil.isEmptyOrNull(aggregate)) {
-            sbr.append("SELECT");
-            //------1.查询主表字段
-            boolean appendFields = false;
-            for (Field field : fields) {
-                String fieldName = field.getName();
-                //常量字段过滤
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
-                //忽略字段过滤
-                if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
-                    continue;
-                }
-                //指定查询
-                if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
-                    continue;
-                }
-                DBF DBFAnnotation = field.getAnnotation(DBF.class);
-                if (null != DBFAnnotation) {
-                    if (appendFields) {
-                        sbr.append(",");
-                    }
-                    sbr.append(" l.").append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma);
-                    appendFields = true;
-                }
-            }
-            //-------2.查询关联字段
-            for (Field field : fields) {
-                Class<?> type = field.getType();
-                String fieldName = field.getName();
-                //常量字段过滤
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
-                //忽略字段过滤
-                if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
-                    continue;
-                }
-                //指定查询
-                if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName)) {
-                    continue;
-                }
-                Class<?> fieldClass = field.getType();
-                One oneAnnotation = field.getAnnotation(One.class);
-                if (null != oneAnnotation) {
-                    //忽略查询
-                    if (oneAnnotation.noQuery()) {
-                        continue;
-                    }
-                    String fkField = oneAnnotation.mkf();
-                    if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(fkField)) {
-                        fkField = fieldName;
-                    }
-                    // join字段
-                    if (!DbUtil.isEmptyOrNull(fkField)) {
-                        //1.join查询对象
-                        if (!DbUtil.isGenericType(type) && type != String.class && !type.isArray() && !type.isAssignableFrom(List.class)) {
-//                            alias.putIfAbsent(fkField, "l" + aliasIdx++);
-                            Field[] joinFields = fieldClass.getFields();
-                            for (Field joinField : joinFields) {
-                                if (DbUtil.isUsageField(joinField)) {
-                                    if (!"SELECT".contentEquals(sbr)) {
-                                        sbr.append(",");
-                                    }
-                                    sbr.append(alias.get(fkField)).append(".").append(this.comma).append(DbUtil.getColumnName(joinField.getName())).append(this.comma).append(" AS ").append(this.comma).append(fieldName).append("_").append(DbUtil.getColumnName(joinField.getName())).append(this.comma);
-                                }
-                            }
-
-                            //2.join查询变量
-                        } else {
-                            if (!"SELECT".equals(sbr.toString().trim())) {
-                                sbr.append(",");
-                            }
-                            sbr.append(alias.get(fkField)).append(".").append(this.comma).append(DbUtil.getColumnName(oneAnnotation.tf())).append(this.comma).append(" AS ").append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma);
-                        }
-                    }
-                }
-            }
-        } else {
-           /* //聚合查询需要获取关联表别名
-            for (Field field : fields) {
-                if (field.isAnnotationPresent(Fk.class)) {
-                    alias.putIfAbsent(field.getName(), "l" + aliasIdx++);
-                }
-            }*/
-
-            String aggregateField = aggregate;
-            boolean distinct = distinctAggerate(aggregate);
-            if (!distinct) {
-                aggregateField = aggregate.contains("COUNT(") ? "l.*" : aggregate.trim().split("\\(")[1].split("\\)")[0].trim();
-            }
-            sbr.append("SELECT ").append(aggregateField);
-        }
-
-        sbr.append("   \n FROM ").append(this.comma).append(getTableName(entity)).append(this.comma).append(" AS l");
-        List<String> joined = new ArrayList<>();
-        //-------3.关联对象  JOINS
-        //BUG:涉及到关联查询的对象字段需要inner join @QF
-        Field[] qfs = query.getClass().getDeclaredFields();
-        for (Field qf : qfields) {
-            //qf 内联查询
-            if (qf.isAnnotationPresent(QF.class)) {
-                Object val = DbUtil.getFieldValue(query, qf);
-                if (null != val) {
-                    String amkf = qf.getAnnotation(QF.class).pkf();
-                    if (!DbUtil.isEmptyOrNull(amkf)) {
-//                        if (!joinFields.contains(amkf)) {
-//                            joinFields.add(amkf);
-//                            alias.putIfAbsent(amkf, "i" + aliasIdx++);
-                        if (!joined.contains(alias.get(amkf))) {
-                            joined.add(alias.get(amkf));
-                        } else {
-                            continue;
-                        }
-                        Class<?> aliasClass = getFkDomainClass(qf, infoClass);
-                        sbr.append(" INNER JOIN ").append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(amkf)).append(" ON ").append("l.").append(this.comma).append(DbUtil.getColumnName(amkf)).append(this.comma).append("=").append(alias.get(amkf)).append(".").append(this.comma).append(DbUtil.getColumnName(qf.getAnnotation(QF.class).tkf())).append(this.comma);
-                    }
-                }
-//                }
-            }
-        }
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            //忽略查询
-            if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
-                continue;
-            }
-            One oneAnnotation = field.getAnnotation(One.class);
-            if (null != oneAnnotation) {
-                //忽略查询
-                if (oneAnnotation.noQuery()) {
-                    continue;
-                }
-                if (!DbUtil.isUsageField(field)) {
-                    continue;
-                }
-                String mkf = oneAnnotation.mkf();
-                if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
-                    mkf = fieldName;
-                }
-                //joins
-                if (!DbUtil.isEmptyOrNull(mkf)) {
-                    if (!joined.contains(alias.get(mkf))) {
-                        joined.add(alias.get(mkf));
-                    } else {
-                        continue;
-                    }
-//                    joinFields.add(fkField);
-                    Class<?> aliasClass = getFkDomainClass(field, infoClass);
-//                    alias.putIfAbsent(fkField, "l" + aliasIdx++);
-                    if (oneAnnotation.join() == JoinType.LEFT) {
-                        sbr.append(" \n LEFT JOIN ");
-                    } else if (oneAnnotation.join() == JoinType.INNER) {
-                        sbr.append("  \n  INNER JOIN  ");
-                    } else {
-                        sbr.append("  \n RIGHT JOIN ");
-                    }
-                    sbr.append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(mkf)).append(" ON ").append("l.").append(this.comma).append(DbUtil.getColumnName(oneAnnotation.mkf())).append(this.comma).append("=").append(alias.get(mkf)).append(".").append(this.comma).append(DbUtil.getColumnName(oneAnnotation.tkf())).append(this.comma);
-                }
-            }
-        }
-        //-------4.查询条件
-        sbr.append(" \n WHERE 1=1 ");
-        Field[] queryFields = query.getClass().getDeclaredFields();
-        //query条件和Builder条件仅支持一个(查询时只提供一个条件构造实体)
-        if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-            List<OBuilder.Where> wheres = OBuilder.getWheres();
-            wheres.forEach(wh -> {
-                //联表查询字段
-                String aliasName = alias.getOrDefault(getMkf(query, wh), "l");
-                sbr.append(" AND ");
-                appendBuilderWhere(sbr, wh, aliasName, parameters);
-            });
-        } else {
-            for (Field qf : queryFields) {
-                Object val = DbUtil.getFieldValue(query, qf);
-                String fieldName = qf.getName();
-                if (DbUtil.isEmptyOrNull(val)) {
-                    continue;
-                }
-                QF qfAnnotation = qf.getAnnotation(QF.class);
-                if (null == qfAnnotation) {
-                    if (!fieldName.endsWith("Sort")) {
-                        sbr.append(" AND l.").append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma);
-                        if (String.class.equals(qf.getType())) {
-                            if (DIALECT_MYSQL == dialect) {
-                                sbr.append(" LIKE concat('%',?,'%')");
-                            } else if (DIALECT_PGSQL == dialect) {
-                                sbr.append(" like concat('%',?::text,'%')");
-                            } else if (DIALECT_MSSQL == dialect) {
-                                sbr.append(" LIKE '%'+?+'%')");
-                            } else if (DIALECT_ORACLE == dialect) {
-                                sbr.append(" LIKE '%'||?||'%')");
-                            }
-                            parameters.add(val);
-                        } else {
-                            sbr.append(" = ?");
-                            parameters.add(val);
-//                            .append(val);
-                        }
-                    }
-                } else {
-                    //foreignKeys
-                    String mkf = qfAnnotation.pkf();
-                    if (qfAnnotation.qt() == QueryType.IGNORE) {
-                        continue;
-                    }
-                    if (!DbUtil.isEmptyOrNull(mkf)) {
-                        String tf = qfAnnotation.tf();
-                        if (DbUtil.isEmptyOrNull(tf)) {
-                            logger.error("SQL2Helper ERR# [" + fieldName + "] @QF with mkf define,but without tkf exist!!!");
-                        } else {
-                            if (qfAnnotation.qt() == QueryType.MAIN) {
-                                sbr.append(" AND ").append(" l").append(".").append(this.comma).append(DbUtil.getColumnName(mkf)).append(this.comma);
-                            } else {
-                                sbr.append(" AND ").append(alias.get(mkf)).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma);
-                            }
-                            //字符串使用模糊查询
-                            if (String.class.equals(qf.getType())) {
-                                if (DIALECT_MYSQL == dialect) {
-                                    sbr.append(" like concat('%',?,'%')");
-                                } else if (DIALECT_PGSQL == dialect) {
-                                    sbr.append(" like concat('%',?::text,'%')");
-                                } else if (DIALECT_MSSQL == dialect) {
-                                    sbr.append(" like '%'+'?'+'%')");
-                                } else if (DIALECT_ORACLE == dialect) {
-                                    sbr.append(" like '%'||'?'||'%')");
-                                }
-                                parameters.add(val);
-                            } else {
-                                sbr.append(" =");
-//                                parameters.add(val);
-                                getValue(sbr, val, parameters);
-                            }
-                        }
-
-                    }
-                    //sql
-                    String whereSql = qfAnnotation.sql();
-                    String tbAlias = alias.getOrDefault(qfAnnotation.pkf(), "l");
-                    whereSql = appendWhereSql(whereSql, Collections.singletonList(val), tbAlias, parameters);
-                    if (!DbUtil.isEmptyOrNull(whereSql)) {
-                        sbr.append(" AND ").append(whereSql);
-                    }
-                    //op
-                    String operator = qfAnnotation.op();
-                    if (!DbUtil.isEmptyOrNull(operator)) {
-                        String tf = qfAnnotation.tf();
-                        if (DbUtil.isEmptyOrNull(tf)) {
-                            logger.error("SQL2Helper ERR# " + fieldName + "@QF with operator defined,but without tkf exist!!!");
-                        } else {
-                            //JIN  JINT
-                            if (operator.equals(OP.JIN)) {
-                                int loop = 1;
-                                String each = qfAnnotation.each();
-                                if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    loop = list.size();
-
-                                    parameters.addAll((Collection<?>) val);
-                                } else if (val.getClass().isArray()) {
-                                    loop = Array.getLength(val);
-                                    for (int i = 0; i < loop; i++) {
-                                        parameters.add(Array.get(val, i));
-                                    }
-                                } else {
-                                    loop = 1;
-                                    parameters.add(val);
-                                }
-                                // and ( json_contains(l.id_list,'1'))
-                                if (dialect == IHandler.DIALECT_MYSQL) {
-                                    sbr.append(" AND ").append("( ");
-                                    for (int i = 0; i < loop; i++) {
-                                        sbr.append(" (JSON_CONTAINS(").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append(",").append("JSON_ARRAY(?)) ");
-                                        if (i != loop - 1) {
-                                            sbr.append(each);
-                                        }
-                                    }
-                                    sbr.append(") ");
-                                    //  owner_id_list::jsonb @> jsonb_build_array(2)
-                                    //  owner_id_list::jsonb @> '[2]'
-                                } else if (dialect == IHandler.DIALECT_PGSQL) {
-                                    sbr.append(" AND ").append("( ");
-                                    for (int i = 0; i < loop; i++) {
-                                        sbr.append(" (").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append("::jsonb @>  ").append("jsonb_build_array(?)) ");
-                                        if (i != loop - 1) {
-                                            sbr.append(each);
-                                        }
-                                    }
-                                    sbr.append(") ");
-                                }
-
-                            } else if (operator.equals(OP.JINT)) {
-
-                                //and (JSON_OVERLAPS(role,'["a","d"]')=1)
-                                if (dialect == IHandler.DIALECT_MYSQL) {
-                                    sbr.append(" AND ").append("(").append(operator).append("JSON_OVERLAPS(").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append(",").append("'?')=1").append(")");
-                                    parameters.add(JacksonUtil.toJSONString(val));
-                                } else if (dialect == IHandler.DIALECT_PGSQL) {
-                                    //    //ARRAY[1,4,3] && ARRAY[2,1]
-                                    sbr.append(" AND ").append("(").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append("::jsonb && ").append("jsonb_build_array(?))");
-                                    parameters.add(JacksonUtil.toJSONString(val));
-                                }
-                            } else if (operator.equals(OP.IN) || operator.equals(OP.NIN)) {
-                                sbr.append(" AND ").append("(").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append(" ").append(operator).append("  (");
-                                if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
-                                    sbr.append(collect).append(") ) ");
-                                    parameters.addAll((Collection<?>) val);
-                                } else if (val.getClass().isArray()) {
-                                    int length = Array.getLength(val);
-                                    for (int i = 0; i < length; i++) {
-                                        sbr.append("?");
-                                        if (i != length - 1) {
-                                            sbr.append(",");
-                                        }
-                                        parameters.add(Array.get(val, i));
-                                    }
-                                    sbr.append("))");
-                                } else {
-                                    throw new IllegalArgumentException("不支持的参数格式");
-                                }
-
-                            } else if (operator.equals(OP.RLK) || operator.equals(OP.LK) || operator.equals(OP.LLK)) {
-                                sbr.append(" AND ").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append(" ").append(operator);
-                                parameters.add(val);
-                            } else {
-                                sbr.append(" AND ").append(tbAlias).append(".").append(this.comma).append(DbUtil.getColumnName(tf)).append(this.comma).append(" ").append(operator);
-                                if (qf.getType().isArray()) {
-                                    sbr.append(" (");
-                                    int length = Array.getLength(val);
-                                    for (int i = 0; i < length; i++) {
-                                        Object value = Array.get(val, i);
-                                        getValue(sbr, value, parameters);
-                                        if (i != length - 1) {
-                                            sbr.append(",");
-                                        }
-                                    }
-                                    sbr.append(")");
-                                } else if (val instanceof Collection<?>) {
-                                    List<Object> list = JacksonUtil.toList(val);
-                                    String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
-                                    sbr.append(collect).append(")  ");
-                                    parameters.addAll((Collection<?>) val);
-                                } else {
-                                    getValue(sbr, val, parameters);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-
-        //-------6.GROUP BY
-        if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getGroupBys())) {
-            sbr.append(" GROUP BY ");
-            OBuilder.getGroupBys().forEach(group -> {
-                sbr.append(group).append(" ,");
-            });
-            sbr.deleteCharAt(sbr.length() - 1);
-        }
-
-        //-------5.having
-        //todo
-
-        //-------7.ORDER BY(query)
-        boolean ordered = false;
-        //聚合查询不需要排序
-        if (DbUtil.isEmptyOrNull(aggregate) && isList) {
-            //多个排序字段需要确定先后顺序
-            Map<Integer, String> sortMap = new HashMap<>(16);
-            if (DbUtil.isEmptyOrNull(query.sortFields)) {
-                for (Field qf : queryFields) {
-                    Object val = DbUtil.getFieldValue(query, qf);
-                    if (null == val) {
-                        continue;
-                    }
-                    int sortValue = 0;
-                    if (val instanceof Integer) {
-                        sortValue = (int) val;
-                    }
-                    if (sortValue == 0) {
-                        continue;
-                    }
-                    String fieldName = qf.getName();
-
-                    List<Field> sorted = new ArrayList<>();
-                    QF qfAnnotation = qf.getAnnotation(QF.class);
-                    if (null == qfAnnotation) {
-                        if (fieldName.endsWith("Sort")) {
-                            if (!ordered) {
-                                ordered = true;
-                                sbr.append(" ORDER BY ");
-                            }
-
-//                            sbr.append(" l.")
-//                                    .append(this.comma)
-//                                    .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
-//                                    .append(this.comma);
-                            if (sortValue % 2 == BasicQuery.SORT_ASC) {
-                                sortMap.put(sortValue, String.format("%s ASC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
-//                                sbr.append(" ASC ,");
-                            } else {
-//                                sbr.append(" DESC ,");
-                                sortMap.put(sortValue, String.format("%s DESC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
-                            }
-                        }
-                    }
-
-                    if (!DbUtil.isEmptyOrNull(sortMap)) {
-                        Set<Integer> integers = sortMap.keySet();
-                        List<Integer> sorts = new ArrayList<>(integers);
-                        sorts.sort(Comparator.comparingInt(o -> o));
-                        sbr.append(sorts.stream().map(k -> "l." + sortMap.get(k)).collect(Collectors.joining(",")));
-                    }
-               /*     if (null == qfAnnotation) {
-                        if (fieldName.endsWith("Sort")) {
-                            if (!ordered) {
-                                ordered = true;
-                                sbr.append(" ORDER BY ");
-                            }
-                            sbr.append(" l.")
-                                    .append(this.comma)
-                                    .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
-                                    .append(this.comma);
-                            if (sortType == BasicQuery.SORT_ASC) {
-                                sbr.append(" ASC ,");
-                            } else if (sortType == BasicQuery.SORT_DESC) {
-                                sbr.append(" desc ,");
-                            }
-                        }
-                    }*/
-                }
-            } else {
-                String[] sorts = query.sortFields;
-                for (String sortField : sorts) {
-                    try {
-                        Field sf = query.getClass().getDeclaredField(sortField + "Sort");
-                        Object val = DbUtil.getFieldValue(query, sf);
-                        if (null == val) {
-                            continue;
-                        }
-                        int sortType = (int) val;
-                        if (!ordered) {
-                            ordered = true;
-                            sbr.append(" ORDER BY ");
-                        }
-
-                        sbr.append(" l.").append(this.comma).append(DbUtil.getColumnName(sortField)).append(this.comma);
-                        if (sortType == BasicQuery.SORT_ASC) {
-                            sbr.append(" ASC ,");
-                        } else if (sortType == BasicQuery.SORT_DESC) {
-                            sbr.append(" DESC ,");
-                        }
-                    } catch (NoSuchFieldException e) {
-                        logger.warn("SQL2Helper warn# sort field is not exist,{}", sortField);
-                    }
-                }
-            }
-        }
-        //-------7.ORDER BY(builder)  聚合查询不需要排序
-        if (DbUtil.isEmptyOrNull(aggregate) && isList) {
-            if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getOrderBys())) {
-                if (!ordered) {
-                    ordered = true;
-                    sbr.append(" ORDER BY ");
-                }
-                OBuilder.getOrderBys().forEach(order -> sbr.append(" l.").append(order).append(" ,"));
-            }
-            if (ordered && sbr.toString().endsWith(",")) {
-                sbr.deleteCharAt(sbr.length() - 1);
-            }
-            //------7.ORDER BY default update_at DESC
-            if (!ordered) {
-                sbr.append(" ORDER BY l.update_at DESC");
-            }
-        }
-
-        //-------8.limit(query)
-        if (isList) {
-            if (query.pageSize > 0) {
-                if (DIALECT_MYSQL == dialect) {
-                    sbr.append(" LIMIT ");
-                    if (query.pageIndex > 0) {
-                        sbr.append((query.pageIndex - 1) * query.pageSize).append(",");
-                    }
-                    if (query.pageSize > 0) {
-                        sbr.append(query.pageSize);
-                    }
-                } else if (DIALECT_MSSQL == dialect) {
-                    sbr.append(" OFFSET ");
-                    if (query.pageIndex > 0) {
-                        sbr.append((query.pageIndex - 1) * query.pageSize).append(" ROWS ");
-                    }
-                    if (query.pageSize > 0) {
-                        sbr.append(" FETCH NEXT ").append(query.pageSize).append(" ROWS ONLY  ");
-                    }
-                } else if (DIALECT_PGSQL == dialect) {
-                    sbr.append(" LIMIT ").append(query.pageSize);
-                    if (query.pageIndex > 0) {
-                        sbr.append(" OFFSET ").append((query.pageIndex - 1) * query.pageSize);
-                    }
-                } else if (DIALECT_ORACLE == dialect) {
-                    StringBuilder sr = new StringBuilder();
-                    sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr).append(") o ");
-                    if (query.pageSize > 0) {
-                        sr.append(" WHERE ROWNUM<=").append(query.pageSize).append(")  o1");
-                    }
-                    if (query.pageIndex > 0) {
-                        sr.append(" WHERE o1.rowno>").append((query.pageIndex - 1) * query.pageSize).append(";");
-                    }
-                    //聚合类使用子查询
-                    if (!DbUtil.isEmptyOrNull(aggregate)) {
-                        sqlEntity.sql = "SELECT " + aggregate + " FROM (" + sr.toString() + ") temp";
-                    }
-                    sqlEntity.sql = sr.toString();
-                }
-                //-------8.limit(builder)
-            } else {
-                String result = appendWhereLimit(OBuilder, sbr);
-                if (null != result) {
-                    //聚合类使用子查询
-                    if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
-                        sbr.setLength(0);
-                        sbr.append("SELECT ").append(aggregate).append(" FROM (").append(result).append(") temp");
-                    }
-                }
-            }
-
-        }
-
-        sqlEntity.sql = sbr.toString();
-        //聚合类使用子查询
-        if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
-            String tmpSql = sbr.toString();
-            sbr.setLength(0);
-            sbr.append("SELECT ").append(aggregate).append(" FROM (").append(tmpSql).append(") temp");
-        }
-        sbr.append(";");
-
-        sqlEntity.sql = sbr.toString();
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-
-    private boolean distinctAggerate(String aggregate) {
-        return aggregate.toLowerCase().contains("distinct(");
-    }
-
-    private String getMkf(BasicQuery query, OBuilder.Where where) {
-        String fieldName = where.key;
-        if (DbUtil.isEmptyOrNull(fieldName)) {
-            if (!DbUtil.isEmptyOrNull(where.sql)) {
-                logger.warn("SQL#builder with sql foreign key is not support yet! {}", where.sql);
-            }
-            return null;
-        }
-        try {
-            //info
-            Class<?> infoClz = query.getClass().getAnnotation(QE.class).clz();
-            Field field = infoClz.getField(DbUtil.getCamelName(fieldName));
-            if (field.isAnnotationPresent(One.class)) {
-                One one = field.getAnnotation(One.class);
-                where.key = one.tf();
-                return one.mkf();
-            }
-        } catch (NoSuchFieldException e) {
-            try {
-                //query
-                Field field = query.getClass().getField(DbUtil.getCamelName(fieldName));
-                if (field.isAnnotationPresent(QF.class)) {
-                    QF qf = field.getAnnotation(QF.class);
-                    where.key = qf.tf();
-                    return qf.pkf();
-                }
-            } catch (NoSuchFieldException e1) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-
-    public SQLEntity selectOne(String sql, Object... params) {
-        return selectList(sql, params);
-    }
-
-    public SQLEntity selectOneByQuery(BasicQuery query, List<String> include, List<String> exclude) {
-        return select(query, null, include, exclude, null, false);
-    }
-
-    public SQLEntity selectById(Class<?> clz, Object id, List<String> include, List<String> exclude) {
-        return selectListByWhere(clz, OBuilder.build().eq("id", id), include, exclude, false);
-    }
-
-    public SQLEntity selectOneByWhere(Class<?> clz, OBuilder OBuilder, List<String> include, List<String> exclude) {
-        return selectListByWhere(clz, OBuilder, include, exclude, false);
-    }
-
-    public SQLEntity selectCount(Class<?> clz, OBuilder OBuilder) {
-        return selectFunc(clz, "COUNT(1)", OBuilder);
-    }
-
-    public SQLEntity selectCountByQuery(BasicQuery query) {
-        return select(query, null, null, null, "COUNT(1)", false);
-    }
-//endregion select
-
-
-    //region insert
-
-    /**
-     * 存储过程
-     *
-     * @param sql
-     * @param params
-     * @return
-     */
-    public SQLEntity call(String sql, Object... params) {
-        SQLEntity sqlEntity = new SQLEntity();
-        sqlEntity.sql = sql;
-        sqlEntity.parameters = params;
-//        if (!DbUtil.isEmptyOrNull(params)) {
-//            sql = String.format(sql, params);
-//        }
-//    "CALL updateRole(#{id,jdbcType=VARCHAR,mode=IN},#{result,jdbcType=INTEGER,mode=OUT});";
-        return sqlEntity;
-    }
-
-    /**
-     * --------------insert method begin ---------------
-     */
-    public SQLEntity insertSelective(Object o, List<String> exclude) {
-        return insertWithCheck(o, true, false, exclude);
-    }
-
-    public SQLEntity insert(Object o, List<String> exclude) {
-        return insertWithCheck(o, false, false, exclude);
-    }
-
-    public SQLEntity insertWithGenKey(Object o, List<String> exclude) {
-        return insertWithCheck(o, false, true, exclude);
-    }
-
-    /***
-     * 插入方法
-     * @param o 插入实体对象
-     * @param ignoreNull 忽略空字段
-     * @param withAutoIncreamentKey 对象是否已赋值自增主键
-     * @param exclude 忽略字段
-     * @return
-     */
-    private SQLEntity insertWithCheck(Object o, boolean ignoreNull, boolean withAutoIncreamentKey, List<String> exclude) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-        StringBuilder sbr = new StringBuilder("INSERT INTO ");
-        sbr.append(getTableName(o.getClass(), o.getClass().getSimpleName()));
-        sbr.append("(");
-
-        StringBuilder vb = new StringBuilder("(");
-        //自带主键
-        if (withAutoIncreamentKey) {
-            sbr.append("id,");
-            try {
-                parameters.add(DbUtil.getFieldValue(o, DbUtil.getField(o, "id")));
-                vb.append("?").append(",");
-            } catch (NoSuchFieldException e) {
-                logger.error("SQL2Helper ERR# insert with primary key,but without a value!!");
-                throw new IllegalStateException("no primary key value exist.");
-            }
-        }
-        exclude.add("id");
-        Set<Field> fields = DbUtil.getEntityFields(o.getClass());
-    /*    List<Field> fields1 = new ArrayList<>();
-        Entity declaredAnnotation = o.getClass().getDeclaredAnnotation(Entity.class);
-        if (null != declaredAnnotation) {
-            fields = o.getClass().getFields();
-            fields1.addAll(Arrays.asList( o.getClass().getFields()));
-        } else {
-            declaredAnnotation = o.getClass().getSuperclass().getDeclaredAnnotation(Entity.class);
-            if(null==declaredAnnotation){
-                throw new IllegalArgumentException("no @Entity define in class");
-            }
-            fields = o.getClass().getSuperclass().getDeclaredFields();
-            fields1.addAll(Arrays.asList( o.getClass().getFields()));
-            Field[] declaredFields = o.getClass().getSuperclass().getDeclaredFields();
-            fields1.addAll(Arrays.asList( o.getClass().getSuperclass().getDeclaredFields()));
-        }*/
-        for (Field field : fields) {
-            if (DbUtil.isUsageField(field)) {
-                String fieldName = field.getName();
-                if (!DbUtil.isEmptyOrNull(exclude)) {
-                    //忽略属性
-                    if (exclude.contains(fieldName)) {
-                        continue;
-                    }
-                }
-                Type type = field.getGenericType();
-                DBF DBF = field.getAnnotation(DBF.class);
-                if (null != DBF) {
-                    Object value = DbUtil.getFieldValue(o, field);
-                    if (ignoreNull) {
-                        if (null != value) {
-                            //TODO 校验值
-                            checkFieldValue(field, value, true);
-                            sbr.append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma).append(",");
-                            appendValue(vb, type, value, parameters);
-                        }
-                    } else {
-                        if (type == Date.class && null == value) {
-                            continue;
-                        }
-                        sbr.append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma).append(",");
-                        appendValue(vb, type, value, parameters);
-                    }
-                }
-            }
-        }
-        sbr.deleteCharAt(sbr.length() - 1);
-        vb.deleteCharAt(vb.length() - 1);
-        sbr.append(")").append(" VALUES ");
-        sbr.append(vb.toString()).append(")");
-        sbr.append(";");
-        sqlEntity.sql = sbr.toString();
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-    //endregion insert
-
-    //region update
-    private SQLEntity updateNative(Object o, OBuilder OBuilder, boolean ignoreNull, List<String> includes, List<String> excludes) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-
-        StringBuilder sbr = new StringBuilder("UPDATE ");
-        sbr.append(getTableName(o.getClass(), o.getClass().getSimpleName())).append(" SET ");
-        Set<Field> fields = DbUtil.getEntityFields(o.getClass());
-        boolean hasUpdateField = false;
-        for (Field field : fields) {
-            if (DbUtil.isUsageField(field)) {
-                DBF dbf = field.getAnnotation(DBF.class);
-                if (null == dbf) {
-                    continue;
-                }
-                String fieldName = field.getName();
-                if (!DbUtil.isEmptyOrNull(excludes)) {
-                    if (excludes.contains(DbUtil.getColumnName(fieldName)) || excludes.contains(fieldName)) {
-                        continue;
-                    }
-                }
-                if (!DbUtil.isEmptyOrNull(includes)) {
-                    if (!includes.contains(fieldName) && !includes.contains(DbUtil.getColumnName(fieldName))) {
-                        continue;
-                    }
-                }
-                if (dbf.canUpdate() && !isImmutableField(fieldName)) {
-                    Type type = field.getGenericType();
-                    Object value = DbUtil.getFieldValue(o, field);
-                    if (ignoreNull) {
-                        if (!DbUtil.isEmptyOrNull(value) && !"0".equals(value.toString())) {
-                            checkFieldValue(field, value, false);
-                            sbr.append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma).append("=");
-                            appendValue(sbr, type, value, parameters);
-                            hasUpdateField = true;
-                        }
-                    } else {
-                        if (null == value && type == Date.class) {
-                            continue;
-                        }
-                        sbr.append(this.comma).append(DbUtil.getColumnName(fieldName)).append(this.comma).append("=");
-                        appendValue(sbr, type, value, parameters);
-                        hasUpdateField = true;
-                    }
-
-                }
-            }
-        }
-        if (!hasUpdateField) {
-            throw new RuntimeException("no field to UPDATE ,#SQL:{}" + sbr.toString());
-        }
-        if (sbr.toString().endsWith(",")) {
-            sbr.deleteCharAt(sbr.length() - 1);
-        }
-        //where
-        if (null != OBuilder && !DbUtil.isEmptyOrNull(OBuilder.getWheres())) {
-            List<OBuilder.Where> wheres = OBuilder.getWheres();
-            if (!DbUtil.isEmptyOrNull(wheres)) {
-                sbr.append(" WHERE ");
-                wheres.forEach(wh -> {
-                    if (ignoreNull) {
-                        if (null != wh.value) {
-                            sbr.append(this.comma).append(DbUtil.getColumnName(wh.key)).append(this.comma).append(" ").append(wh.op).append(" ");
-                            appendValue(sbr, wh.value, parameters);
-                            sbr.append(" AND ");
-                        }
-                    } else {
-                        sbr.append(this.comma).append(DbUtil.getColumnName(wh.key)).append(this.comma).append(" ").append(wh.op).append(" ");
-                        appendValue(sbr, wh.value, parameters);
-                        sbr.append(" AND ");
-                    }
-                });
-                sbr.delete(sbr.length() - 5, sbr.length());
-            }
-            if (DIALECT_MYSQL == dialect) {
-                //mysql innodb 锁
-                if (OBuilder.forUpdate) {
-                    sbr.append(" FOR UPDATE ");
-                }
-                if (OBuilder.forShare) {
-                    sbr.append(" LOCK IN SHARE MODE");
-                }
-            }
-        } else {
-            try {
-                Field f = DbUtil.getField(o, "id");
-                sbr.append(" WHERE id=?");
-                parameters.add(DbUtil.getFieldValue(o, f));
-            } catch (Exception e) {
-                throw new IllegalArgumentException("tkf id is not exist!!!");
-            }
-        }
-        sbr.append(";");
-        sqlEntity.sql = sbr.toString();
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-    public SQLEntity updateByWhere(Object o, OBuilder builder) {
-        return updateNative(o, builder, false, null, null);
-    }
-
-
-    public SQLEntity updateByWhere(Object o, OBuilder builder, List<String> includes) {
-        return updateNative(o, builder, false, includes, null);
-    }
-
-    public SQLEntity updateByWhere(Object o, OBuilder builder, List<String> includes, List<String> excludes) {
-        return updateNative(o, builder, false, includes, excludes);
-    }
-
-    public SQLEntity update(String sql, Object... params) {
-        SQLEntity sqlEntity = new SQLEntity();
-        sqlEntity.sql = sql;
-        sqlEntity.parameters = params;
-        return sqlEntity;
-    }
-
-    public SQLEntity updateSelective(Object o, List<String> includes, List<String> excludes) {
-        return updateNative(o, null, true, includes, excludes);
-    }
-
-    public SQLEntity updateSelectiveByWhere(Object o, OBuilder OBuilder) {
-        return updateNative(o, OBuilder, true, null, null);
-    }
-//endregion update
-
-
-    //region delete
-    public SQLEntity deleteById(Class<?> clz, Object id) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-
-        if (null != id) {
-            parameters.add(id);
-        } else {
-            throw new IllegalArgumentException("null value with id!!!");
-        }
-        sqlEntity.sql = "DELETE FROM " + getTableName(clz, clz.getSimpleName()) + " WHERE id= ?";
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-
-    public SQLEntity delete(Class<?> clz, OBuilder OBuilder) {
-        SQLEntity sqlEntity = new SQLEntity();
-        List<Object> parameters = new ArrayList<>();
-        StringBuilder sbr = new StringBuilder("DELETE FROM ");
-        sbr.append(getTableName(clz, clz.getSimpleName()));
-        if (null != OBuilder) {
-            List<OBuilder.Where> wheres = OBuilder.getWheres();
-            if (!DbUtil.isEmptyOrNull(wheres)) {
-                sbr.append(" WHERE 1=1");
-                wheres.forEach(wh -> {
-                    sbr.append(" AND ");
-                    appendBuilderWhere(sbr, wh, "", parameters);
-                });
-            }
-        } else {
-            throw new IllegalArgumentException(" delete with no where condition exist!!!");
-        }
-        sqlEntity.sql = sbr.toString();
-        sqlEntity.parameters = parameters.toArray();
-        return sqlEntity;
-    }
-
-    //endregion delete
-
-    private String appendWhereLimit(OBuilder OBuilder, StringBuilder sbr) {
-        if (null != OBuilder) {
-            if (OBuilder.limitDelta() > 0) {
-                if (DIALECT_MYSQL == dialect) {
-                    sbr.append(" LIMIT ");
-                    if (OBuilder.limitStart() > 0) {
-                        sbr.append(OBuilder.limitStart()).append(",");
-                    }
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(OBuilder.limitDelta());
-                    }
-                    return null;
-                } else if (DIALECT_MSSQL == dialect) {
-                    sbr.append(" OFFSET ");
-                    if (OBuilder.limitStart() >= 0) {
-                        sbr.append(OBuilder.limitStart()).append(" ROWS ");
-                    }
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(" FETCH NEXT  ").append(OBuilder.limitDelta()).append(" ROWS ONLY  ");
-                    }
-                    return null;
-                } else if (DIALECT_PGSQL == dialect) {
-                    sbr.append(" LIMIT ");
-
-                    if (OBuilder.limitDelta() > 0) {
-                        sbr.append(OBuilder.limitDelta());
-                    }
-                    if (OBuilder.limitStart() >= 0) {
-                        sbr.append(" OFFSET ").append(OBuilder.limitStart());
-                    }
-                    return null;
-                } else if (DIALECT_ORACLE == dialect) {
-                    StringBuilder sr = new StringBuilder();
-                    sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr.toString()).append(") o ");
-                    if (OBuilder.limitDelta() > 0) {
-                        sr.append(" WHERE ROWNUM<=").append(OBuilder.limitDelta()).append(")  o1");
-                    }
-                    if (OBuilder.limitStart() >= 0) {
-                        sr.append(" WHERE o1.rowno>").append(OBuilder.limitStart());
-                    }
-                    return sr.toString();
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 拼接Builder 条件
-     */
-    private void appendBuilderWhere(StringBuilder sbr, OBuilder.Where wh, String tbAlias, List<Object> parameters) {
-        if (DbUtil.isEmptyOrNull(wh.sql)) {
-            if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                sbr.append(tbAlias).append(".");
-            }
-            sbr.append(this.comma).append(DbUtil.getColumnName(wh.key)).append(this.comma).append(" ").append(wh.op);
-            String op = wh.op;
-            Object value = wh.value;
-            if ("in".equals(op.trim()) || "not in".equals(op.trim())) {
-                sbr.append("(");
-                for (int i = 0; i < Array.getLength(value); i++) {
-                    Object v = Array.get(value, i);
-                    sbr.append("?");
-                    parameters.add(v);
-                   /* if (v.getClass() == String.class) {
-                        sbr.append("'").append(DbUtil.injectDefend(v.toString())).append("'");
-                    } else {
-                        sbr.append(v);
-                    }*/
-                    if (i != Array.getLength(value) - 1) {
-                        sbr.append(",");
-                    }
-                }
-                sbr.append(")");
-            } else {
-                //转换取值方式
-                sbr.append("?");
-                parameters.add(value);
-           /*     if (value.getClass() == String.class) {
-                    sbr.append("'").append(value).append("'");
-                } else if (wh.value.getClass() == Date.class) {
-                    sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'");
-                } else {
-
-//                    sbr.append(value);
-                }*/
-            }
-        } else {
-            //别名判断
-            sbr.append(" (");
-            sbr.append(appendWhereSql(wh.sql, wh.sqlValues, tbAlias, parameters));
-            sbr.append(") ");
-        }
-    }
-
-    /**
-     * whereSql拼接,需要注意json类型处理
-     *
-     * @param whereSql
-     * @param val
-     * @param tbAlias
-     * @param parameters
-     * @return
-     */
-    private String appendWhereSql(String whereSql, List<Object> val, String tbAlias, List<Object> parameters) {
-//        parameters.addAll(val);
-        if (!DbUtil.isEmptyOrNull(whereSql)) {
-            if (!DbUtil.isEmptyOrNull(val)) {
-                if (whereSql.contains("?")) {
-                    String regex = "\\?";
-                    for (Object o : val) {
-                        if (o.getClass() == String.class) {
-                            whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
-                        } else if (o.getClass() == Date.class) {
-                            whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
-                        } else {
-                            whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
-                        }
-                    }
-                    while (whereSql.contains("?")) {
-                        for (Object o : val) {
-                            if (o.getClass() == String.class) {
-                                whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
-                            } else if (o.getClass() == Date.class) {
-                                whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
-                            } else {
-                                whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
-                            }
-                        }
-                    }
-                } else {
-                    if (val.size() == 1 && val.get(0) instanceof Boolean) {
-                        if (!(Boolean) val.get(0)) {
-                            return null;
-                        }
-                    }
-                }
-            }
-            String[] splits = whereSql.split(" AND ");
-            boolean containsComma = false;
-            if (splits.length > 1) {
-                StringBuilder sbd = new StringBuilder();
-                for (int i = 0; i < splits.length; i++) {
-                    if (splits[i].startsWith("(")) {
-                        containsComma = true;
-                        sbd.append("(");
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits[i].trim().substring(1));
-                    } else {
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits[i].trim());
-                    }
-                    if (i != splits.length - 1) {
-                        sbd.append(" AND ");
-                    }
-                }
-                whereSql = sbd.toString();
-            }
-            String[] splits1 = whereSql.split(" OR ");
-            if (splits1.length > 1) {
-                StringBuilder sbd = new StringBuilder();
-                for (int i = 0; i < splits1.length; i++) {
-                    if (splits1[i].startsWith("(")) {
-                        if (!containsComma) {
-                            sbd.append("(");
-                            if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                                sbd.append(tbAlias).append(".");
-                            }
-                            sbd.append(splits1[i].trim().substring(1));
-                        }
-                    } else {
-                        if (!DbUtil.isEmptyOrNull(tbAlias)) {
-                            sbd.append(tbAlias).append(".");
-                        }
-                        sbd.append(splits1[i].trim());
-                    }
-                    if (i != splits1.length - 1) {
-                        sbd.append(" OR ");
-                    }
-                }
-                whereSql = sbd.toString();
-            }
-        }
-        return whereSql;
-    }
-
-
-    private void appendValue(StringBuilder sbr, Type type, Object value, List<Object> parameters) {
-        sbr.append("?").append(",");
-        parameters.add(value);
-//        if (DbUtil.isGenericType(type)) {
-//            parameters.add(value);
-//        } else {
-//            parameters.add(JacksonUtil.toJSONString(value));
-//        }
-     /*   if (type == String.class) {
-            if (null == value) {
-                sbr.append("?").append(", ");
-                parameters.add("");
-            } else {
-                sbr.append("?").append(", ");
-                parameters.add(value);
-//                sbr.append("'");
-             *//*   String v = (String) value;
-                if (v.contains("'")) {
-                    sbr.append(DbUtil.injectDefend(v.replaceAll("'", "\\\\'")));
-                } else {
-                    sbr.append(DbUtil.injectDefend(v));
-                }
-                sbr.append("'").append(",");*//*
-            }
-        } else if (DbUtil.isGenericType(type)) {
-            sbr.append("?").append(", ");
-            parameters.add(value);
-         *//*   if (null == value) {
-                sbr.append(0).append(",");
-            } else {
-                sbr.append(value).append(",");
-            }*//*
-        } else if (type == Date.class) {
-            sbr.append("?").append(", ");
-            parameters.add(value);
-        } else {
-
-        }*/
-    }
-
-    private void appendValue(StringBuilder sbr, Object value, List<Object> parameters) {
-        sbr.append(" ? ");
-        parameters.add(value);
-      /*  if (null != value) {
-            if (value instanceof String) {
-                sbr.append("'");
-                String v = (String) value;
-                if (v.contains("'")) {
-                    sbr.append(DbUtil.injectDefend(v.replaceAll("'", "\\\\'")));
-                } else {
-                    sbr.append(DbUtil.injectDefend(v));
-                }
-                sbr.append("'").append(",");
-            } else if (DbUtil.isGenericType(value)) {
-                sbr.append(value).append(",");
-            } else if (value instanceof Date) {
-                sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'").append(",");
-            } else {
-                sbr.append("'").append(JacksonUtil.toJSONString(value)).append("'").append(",");
-            }
-        } else {
-            //类型默认值
-            sbr.append(" ").append(",");
-        }*/
-    }
-
-
-    private void getValue(StringBuilder sbr, Object value, List<Object> parameters) {
-        if (null != value) {
-//            if (value instanceof String) {
-//                sbr.append("'").append(value).append("'");
-//            } else if (DbUtil.isGenericType(value)) {
-//                sbr.append(value);
-//            } else if (value instanceof Date) {
-//                sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'");
-//            } else {
-//                sbr.append("'").append(JacksonUtil.toJSONString(value)).append("'");
-//            }
-            sbr.append("?");
-            parameters.add(value);
-        } else {
-            throw new IllegalArgumentException("append value with NULL");
-        }
-    }
-
-
-    private String getTableName(Entity anno) {
-        String tbName = anno.tbName();
-        if (!DbUtil.isEmptyOrNull(tbName)) {
-            return DbUtil.getColumnName(tbName);
-        }
-        Class<?> clz = anno.clz();
-       /* if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }*/
-        return JdbcHelper.tbPrefix + DbUtil.getColumnName(clz.getSimpleName());
-    }
-
-    public static String getTableName(Class<?> clz, String tbName) {
-        if (clz.isAnnotationPresent(Entity.class)) {
-            Entity entity = clz.getAnnotation(Entity.class);
-            if (!DbUtil.isEmptyOrNull(entity.tbName())) {
-                return DbUtil.getColumnName(entity.tbName());
-            }
-        } else if (clz.getSuperclass().isAnnotationPresent(Entity.class)) {
-            Class<?> superClz = clz.getSuperclass();
-            Entity entity = superClz.getAnnotation(Entity.class);
-            if (!DbUtil.isEmptyOrNull(entity.tbName())) {
-                return DbUtil.getColumnName(entity.tbName());
-            }
-        }
-        if (tbName.endsWith("Info")) {
-            tbName = tbName.substring(0, tbName.length() - 4);
-        }
-        return JdbcHelper.tbPrefix + DbUtil.getColumnName(tbName);
-    }
-
-
-    /**
-     * 获取外键关联实体类
-     */
-    private Class<?> getFkDomainClass(Field f, Class<?> domainClass) {
-        try {
-            if (f.isAnnotationPresent(FK.class)) {
-                return f.getAnnotation(FK.class).clz();
-            }
-            if (f.isAnnotationPresent(One.class)) {
-                One oneAnnotation = f.getAnnotation(One.class);
-                if (null != oneAnnotation) {
-                    if (oneAnnotation.te() != void.class) {
-                        return oneAnnotation.te();
-                    }
-                    if (!DbUtil.isEmptyOrNull(oneAnnotation.mkf())) {
-                        if (DbUtil.isGenericType(f.getType())) {
-                            Field field = domainClass.getDeclaringClass().getDeclaredField(oneAnnotation.mkf());
-                            if (field.isAnnotationPresent(FK.class)) {
-                                return field.getAnnotation(FK.class).clz();
-                            }
-                        } else {
-                            return f.getDeclaringClass();
-                        }
-                    }
-                }
-            }
-            if (f.isAnnotationPresent(QF.class)) {
-                QF qf = f.getAnnotation(QF.class);
-                if (!DbUtil.isEmptyOrNull(qf.pkf())) {
-                    Field field = domainClass.getDeclaringClass().getDeclaredField(qf.pkf());
-                    return field.getAnnotation(FK.class).clz();
-                }
-            }
-        } catch (NoSuchFieldException e) {
-            logger.error("SQL2Helper ERR# getFkDomainClass ,fileName:{},class:{}", f.getName(), domainClass.getSimpleName());
-        }
-        return Void.class;
-    }
-
-    private boolean isImmutableField(String fieldName) {
-        List<String> immutableFields = new ArrayList<>();
-        immutableFields.add("id");
-        immutableFields.add("createat");
-        immutableFields.add("updateat");
-        return immutableFields.contains(fieldName.toLowerCase());
-    }
-
-    /**
-     * 校验字段的值
-     */
-    private void checkFieldValue(Field field, Object value, boolean insertCheck) {
-        if (!field.isAnnotationPresent(DBF.class)) {
-            return;
-        }
-        DBF dbf = field.getAnnotation(DBF.class);
-
-        //插入SQL校验必填
-        if (insertCheck) {
-            if (dbf.required() && DbUtil.isEmptyOrNull(value)) {
-                throw new IllegalArgumentException("【" + dbf.comment() + "】取值不能为空");
-            }
-        }
-        int min = dbf.min();
-        int max = dbf.max();
-        if (dbf.min() > 0) {
-            if (value instanceof Integer || value instanceof Short || value instanceof Double || value instanceof Long) {
-                if (BigDecimal.valueOf(min).compareTo(new BigDecimal(String.valueOf(value))) > 0) {
-                    throw new IllegalArgumentException("【" + dbf.comment() + "】最小值为" + min);
-                }
-                if (max > 0 && BigDecimal.valueOf(max).compareTo(new BigDecimal(value.toString())) < 0) {
-                    throw new IllegalArgumentException("【" + dbf.comment() + "】最大值为" + max);
-                }
-            } else if (value instanceof String || value instanceof Character) {
-                if (!DbUtil.isEmptyOrNull(value)) {
-                    int length = value.toString().length();
-                    if (min > length) {
-                        throw new IllegalArgumentException("【" + dbf.comment() + "】最小长度为" + min);
-                    }
-                    if (max > 0 && max < length) {
-                        throw new IllegalArgumentException("【" + dbf.comment() + "】最大长度为" + max);
-                    }
-                }
-            }
-        }
-
-
-    }
-}

+ 0 - 7
car-wash-service/pom.xml

@@ -31,13 +31,6 @@
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.kym</groupId>
-            <artifactId>car-wash-jdbc</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-        </dependency>
-
-
         <dependency>
             <groupId>com.github.wechatpay-apiv3</groupId>
             <artifactId>wechatpay-java</artifactId>

+ 0 - 292
car-wash-service/src/main/java/com/kym/dao/DbHandler.java

@@ -1,292 +0,0 @@
-package com.kym.dao;
-
-import com.kym.common.ContextHelper;
-import com.kym.common.IUser;
-import com.kym.common.utils.CommUtil;
-import com.kym.DbUtil;
-import com.kym.JacksonUtil;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.IHandler;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.annotations.DBF;
-import com.kym.jdbc.annotations.Entity;
-import com.kym.jdbc.lambda.ColumnFunc;
-import com.kym.jdbc.lambda.DefaultLambdaParser;
-import com.kym.jdbc.template.JdbcExecute;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-
-/**
- * jdbc工具类
- *
- * @author yaop at 2019/4/27 17:35
- */
-@Slf4j
-@Component("dbHandler")
-public class DbHandler extends JdbcExecute {
-
-
-  /*  @Autowired
-    public void setExtMapper(ExtMapper mapper) {
-
-        Log.TOTAL.i("------->>> mybatis autowired success <<<-------");
-        super.setMapper(mapper);
-    }*/
-
-    @Autowired
-    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
-        super.setJdbcTemplate(jdbcTemplate, IHandler.DIALECT_MYSQL);
-    }
-
-    //TODO JSON数据的处理(mysql、postgresql)
-
-    @Override
-    protected void beforeInsert(Object bean) {
-        super.beforeInsert(bean);
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            setFieldValue(bean, "createBy", user.id);
-            setFieldValue(bean, "updateBy", user.id);
-            setFieldValue(bean, "companyId", user.companyId);
-        }
-    }
-
-
-    @Override
-    protected void beforeDelete(Class<?> clz, Object id) {
-        super.beforeDelete(clz, id);
-    }
-
-    @Override
-    protected void beforeDelete(Class<?> clz, OBuilder OBuilder) {
-        super.beforeDelete(clz, OBuilder);
-    }
-
-    @Override
-    protected void beforeUpdate(Object bean, OBuilder OBuilder) {
-        super.beforeUpdate(bean, OBuilder);
-    }
-
-    @Override
-    protected void beforeUpdate(Object bean) {
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            setFieldValue(bean, "updateBy", user.id);
-        }
-
-     /*   else {
-            IAccount account = ContextHelper.getAccount();
-            if (null != account) {
-                setFieldValue(bean, "updateBy", account.id);
-            }
-        }*/
-    }
-
-    @Override
-    protected void beforeSelect(BasicQuery query) {
-        super.beforeSelect(query);
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            setFieldValue(query, "companyId", user.companyId);
-        }
-
-        setFieldValue(query, "deleted", false);
-    }
-
-
-    @Override
-    protected void beforeSelect(Class<?> clz, OBuilder OBuilder) {
-        super.beforeSelect(clz, OBuilder);
-    }
-
-
-    /**
-     * 查询是否存在
-     */
-    public final boolean selectExist(Class<?> clz, int id) {
-        Object i = selectObject("select id from " + getTableName(clz.getSimpleName()) + " where id =" + id);
-        return !CommUtil.isEmptyOrNull(i);
-    }
-
-    /**
-     * in 子句
-     */
-    public final <T> List<T> selectListInExclude(Class<T> clz, String field, Object[] values, String... excludes) {
-        if (CommUtil.isEmptyOrNull(values)) {
-            log.warn("query list with no parameters!");
-            return Collections.emptyList();
-        }
-        return selectListExclude(clz, OBuilder.build().in(field, values), excludes);
-    }
-
-
-    public final <T> List<T> selectListIn(Class<T> clz, String field, Object[] values, String... includes) {
-        if (CommUtil.isEmptyOrNull(values)) {
-            log.warn("query list with no parameters!");
-            return Collections.emptyList();
-        }
-        return selectList(clz, OBuilder.build().in(field, values), includes);
-    }
-
-
-    /**
-     * map传参查询集合
-     */
-    public final <T> List<T> selectListExclude(Class<T> clz, Map<String, Object> params, String... ignores) {
-        if (null != params && !params.isEmpty()) {
-            log.warn("query list with no parameters!");
-            return Collections.emptyList();
-        }
-        OBuilder builder = OBuilder.build();
-        params.forEach(builder::eq);
-        return selectList(clz, builder, ignores);
-    }
-
-
-    /**
-     * 校验字段值的唯一性
-     */
-    public <T> T checkUniqueValue(Class<T> clz, OBuilder builder, ColumnFunc<T, ?> columnFunc, long oldPojoId) {
-        T o = selectOne(clz, builder);
-        if (null == o) {
-            return null;
-        }
-        long queryId = CommUtil.null2Long(getFieldValue(o, "id"));
-        String comment = clz.getAnnotation(Entity.class).comment();
-        String fieldComment = null;
-        String fieldName = DefaultLambdaParser.getPropertyName(columnFunc);
-        try {
-            fieldComment = clz.getDeclaredField(fieldName).getAnnotation(DBF.class).comment();
-        } catch (NoSuchFieldException e) {
-            log.error("checkUniqueValue error:{}", e.getMessage());
-        }
-        if (0 == oldPojoId) {
-            CommUtil.asserts(queryId <= 0, comment + fieldComment + "已存在");
-        } else {
-            CommUtil.asserts(queryId == oldPojoId, comment + fieldComment + "已存在");
-        }
-
-        return o;
-    }
-
-    /**
-     * 校验字段值的唯一性
-     */
-    public <T> void checkUniqueValue(Class<T> clz, ColumnFunc<T, ?> columnFunc, Object fieldValue) {
-        String fieldName = DefaultLambdaParser.getPropertyName(columnFunc);
-
-        OBuilder builder = OBuilder.build().eq(fieldName, fieldValue);
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            builder.eq("companyId", user.companyId);
-        }
-
-        checkUniqueValue(clz, builder, columnFunc, 0);
-    }
-
-    /**
-     * 校验字段值的唯一性
-     */
-    public <T> void checkUniqueValue(Class<T> clz, ColumnFunc<T, ?> columnFunc, Object fieldValue, long oldPojoId) {
-        String fieldName = DefaultLambdaParser.getPropertyName(columnFunc);
-
-        OBuilder builder = OBuilder.build().eq(fieldName, fieldValue);
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            builder.eq("companyId", user.companyId);
-        }
-
-        checkUniqueValue(clz, builder, columnFunc, oldPojoId);
-    }
-
-
-    /**
-     * 可选地更新记录
-     */
-    public void updateSelective(Class<?> clz, Map<String, Object> params, long id) {
-        StringBuilder sbr = new StringBuilder("UPDATE ");
-        sbr.append(getTableName(clz.getSimpleName())).append(" SET ");
-        if (DbUtil.isEmptyOrNull(params)) {
-            throw new IllegalArgumentException("no data to update");
-        }
-
-        sbr.append(params.keySet().stream().map(k -> String.format(" %s=? ", getColumnName(k))).collect(Collectors.joining(",")));
-        List<Object> ll = new ArrayList<>(params.values());
-
-        sbr.append(" WHERE id=").append(id);
-
-        update(sbr.toString(), ll.toArray());
-    }
-
-    public void updateSelective(Class<?> clz, Map<String, Object> params, Map<String, Object> wheres) {
-        StringBuilder sbr = new StringBuilder("UPDATE ");
-        sbr.append(getTableName(clz.getSimpleName())).append(" SET ");
-        if (DbUtil.isEmptyOrNull(params)) {
-            throw new IllegalArgumentException("no data to update");
-        }
-        if (DbUtil.isEmptyOrNull(wheres)) {
-            throw new IllegalArgumentException("no condition exists  for  update operation");
-        }
-        sbr.append(params.keySet().stream().map(k -> String.format(" %s=? ", getColumnName(k))).collect(Collectors.joining(",")));
-        List<Object> ll = new ArrayList<>(params.values());
-
-        sbr.append(" WHERE ");
-        sbr.append(wheres.keySet().stream().map(k -> String.format(" %s=? ", getColumnName(k))).collect(Collectors.joining(" AND ")));
-        ll.addAll(wheres.values());
-
-        update(sbr.toString(), ll.toArray());
-    }
-
-    /**
-     * 无条件查询集合
-     */
-    public <T> List<T> selectAll(Class<T> clz, String... excludes) {
-        List<T> list = selectListExclude(clz, OBuilder.build().limit(-1), excludes);
-        if (CommUtil.isEmptyOrNull(list)) {
-            return Collections.emptyList();
-        } else {
-            return list;
-        }
-    }
-
-    /**
-     * 有条件查询集合
-     */
-    public List<?> selectAll(Class<? extends BasicQuery> queryClz, Object query, String... excludes) {
-        BasicQuery q = null;
-        if (null != query) {
-            q = JacksonUtil.toJavaObject(JacksonUtil.toJSONString(query), queryClz);
-        }
-        if (null == q) {
-            return Collections.emptyList();
-        }
-        q.pageSize = -1;
-        List<?> list = selectListExclude(q, excludes);
-        if (CommUtil.isEmptyOrNull(list)) {
-            return Collections.emptyList();
-        } else {
-            return list;
-        }
-    }
-
-
-    public <T> T selectOneByUuid(Class<T> entityClass, String uid) {
-        return selectOneExist(entityClass, OBuilder.build().eq("uuid", uid));
-    }
-
-
-
-    public void replaceInsert(Object bean) {
-        String sql = "replace into t_seed ()";
-    }
-
-}

+ 0 - 13
car-wash-service/src/main/java/com/kym/dao/admin/FeedbackDAO.java

@@ -1,13 +0,0 @@
-package com.kym.dao.admin;
-
-import com.kym.dao.DbHandler;
-import org.springframework.stereotype.Component;
-
-/**
-*纠错反馈
-*@date 2024-09-22T20:40:35.300431885
-*/
-@Component
-public class FeedbackDAO extends DbHandler {
-
-}

+ 0 - 390
car-wash-service/src/main/java/com/kym/service/IService.java

@@ -1,390 +0,0 @@
-package com.kym.service;
-
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.ReflectUtil;
-import com.kym.common.ContextHelper;
-import com.kym.common.DiffVo;
-import com.kym.common.IUser;
-import com.kym.common.constant.ResponseEnum;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.BeanUtil;
-import com.kym.common.utils.CommUtil;
-import com.kym.dao.DbHandler;
-import com.kym.entity.admin.AdminUser;
-import com.kym.entity.common.SimpleVo;
-import com.kym.entity.common.SimpleVo.SimpleAttachVo;
-import com.kym.entity.common.SimpleVo.SimpleUserVo;
-import com.kym.entity.miniapp.Attachment;
-import com.kym.jdbc.BasicQuery;
-import com.kym.jdbc.Bean;
-import com.kym.jdbc.OBuilder;
-import com.kym.jdbc.annotations.DBF;
-import lombok.Getter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-
-/**
- * 公共注入服务
- *
- * @author yaop
- */
-public class IService {
-
-    @Getter
-    protected DbHandler db;
-
-    @Autowired
-    @Qualifier("dbHandler")
-    public void setDb(DbHandler db) {
-        this.db = db;
-    }
-
-
-    protected <T> Bean<T> toBean(long count, List<T> list) {
-        Bean<T> bean = new Bean<>();
-        bean.count = count;
-        bean.list = list;
-        return bean;
-    }
-
-    protected OBuilder oBuilder() {
-        IUser user = ContextHelper.getUser();
-        if (null == user) {
-            return OBuilder.build();
-        }
-        return OBuilder.build().eq("companyId", user.companyId);
-    }
-
-    protected long getUserId() {
-        IUser user = ContextHelper.getUser();
-        if (null == user) {
-            throw new BusinessException(ResponseEnum.UNLOGIN);
-        }
-        return user.id;
-    }
-
-
-    protected long getOid() {
-        IUser user = ContextHelper.getUser();
-        if (null == user) {
-            throw new BusinessException(ResponseEnum.UNLOGIN);
-        }
-        return ContextHelper.getOid();
-    }
-
-    protected void setupQuery(BasicQuery query) {
-        IUser user = ContextHelper.getUser();
-        if (null != user) {
-            ReflectUtil.setFieldValue(query, "companyId", user.companyId);
-        }
-        ReflectUtil.setFieldValue(query, "deleted", false);
-    }
-
-    /**
-     * 断言已登录
-     */
-    protected void assertLogin() {
-        if (null == ContextHelper.getUser()) {
-            throw new BusinessException(ResponseEnum.UNLOGIN);
-        }
-    }
-
-
-    protected void setAssociateId(long id) {
-        ContextHelper.setAssoId(id);
-    }
-
-    protected void setId(Object bean) {
-        setId(bean, "id");
-    }
-
-    protected long getUserDepartmentId() {
-        IUser user = ContextHelper.getUser();
-        if (CommUtil.isNotEmptyAndNull(user.deptIdList)) {
-            return user.deptIdList.get(0);
-        }
-        return 0L;
-    }
-
-
-    /**
-     * 雪花算法ID生成(默认截取4位往后长度,防止前端展示不全精度丢失问题)
-     *
-     * @param bean
-     * @param key
-     */
-    protected void setId(Object bean, String key) {
-        ReflectUtil.setFieldValue(bean, key, CommUtil.null2Long(String.valueOf(IdUtil.getSnowflakeNextId()).substring(4)));
-    }
-
-    /**
-     * 雪花算法ID生成(默认截取4位往后长度,防止前端展示不全精度丢失问题)
-     *
-     * @return
-     */
-    protected long genId() {
-        return CommUtil.null2Long(String.valueOf(IdUtil.getSnowflakeNextId()).substring(4));
-    }
-
-
-    protected List<DiffVo> diffLog(Object src, Object dest) {
-        return diffLog(src, dest, null);
-    }
-
-    /**
-     * 比较并获取差异字段
-     */
-    protected List<DiffVo> diffLog(Object src, Object dest, Set<String> includes, String... excludeFields) {
-        List<DiffVo> diffVos = new ArrayList<>();
-        if (CommUtil.isEmptyOrNull(src) && CommUtil.isEmptyOrNull(dest)) {
-            return diffVos;
-        }
-        if (CommUtil.isBasicType(src) || CommUtil.isBasicType(dest)) {
-            return diffVos;
-        }
-        List<String> excludes = Arrays.asList(excludeFields.clone());
-        Map<String, Object> map = new HashMap<>(16);
-        if (null == src) {
-            map.put("src", null);
-            map.put("dest", CommUtil.print(dest));
-            return diffVos;
-        }
-        if (null == dest) {
-            map.put("src", CommUtil.print(src));
-            map.put("dest", null);
-            return diffVos;
-        }
-        Field[] fields = src.getClass().getFields();
-        if (!CommUtil.isEmptyOrNull(fields)) {
-            for (Field field : fields) {
-                int modifier = field.getModifiers();
-                if (!Modifier.isPublic(modifier)) {
-                    continue;
-                }
-                String fieldName = field.getName();
-                if (CommUtil.isNotEmptyAndNull(includes) && !includes.contains(fieldName)) {
-                    continue;
-                }
-                //TODO 数组、集合数据结构处理
-                if (!CommUtil.isBasicType(field.getType()) || "id".equalsIgnoreCase(fieldName) || excludes.contains(fieldName)) {
-                    continue;
-                }
-                if (!BeanUtil.compare(src, dest, fieldName)) {
-                    String fieldCommentName = fieldName;
-                    if (field.isAnnotationPresent(DBF.class)) {
-                        fieldCommentName = field.getAnnotation(DBF.class).comment();
-                    }
-                    diffVos.add(DiffVo.builder().field(fieldName).name(fieldCommentName).src(CommUtil.logNull2String(ReflectUtil.getFieldValue(src, fieldName))).dest(CommUtil.logNull2String(ReflectUtil.getFieldValue(dest, fieldName))).build());
-//                    logs.add(ImmutableMap.of("field", fieldName, "name", fieldCommentName, "src", CommUtil.logNull2String(CommUtil.getFieldValue(src, fieldName)), "dest", CommUtil.logNull2String(CommUtil.getFieldValue(dest, fieldName))));
-                }
-            }
-            map.put("logs", diffVos);
-        }
-
-        ContextHelper.setRemark(CommUtil.print(map));
-        return diffVos;
-    }
-
-
-    /**
-     * 比较并获取差异字段
-     */
-    /**
-     * @param src
-     * @param dest
-     * @param field     字段key
-     * @param fieldName 字段名称
-     * @return
-     */
-    protected DiffVo diffLog(Object src, Object dest, String field, String fieldName) {
-        DiffVo diffVo = new DiffVo();
-        diffVo.name = fieldName;
-        diffVo.field = field;
-        if (CommUtil.isEmptyOrNull(src) && CommUtil.isEmptyOrNull(dest)) {
-            return diffVo;
-        }
-        if (CommUtil.isBasicType(src) || CommUtil.isBasicType(dest)) {
-            return diffVo;
-        }
-        if (null == src) {
-            diffVo.src = "";
-            diffVo.dest = CommUtil.print(dest);
-            return diffVo;
-        }
-        if (null == dest) {
-            diffVo.dest = "";
-            diffVo.src = CommUtil.print(src);
-            return diffVo;
-        }
-
-        if (!BeanUtil.compare(src, dest, field)) {
-            diffVo.src = CommUtil.logNull2String(ReflectUtil.getFieldValue(src, field));
-            diffVo.dest = CommUtil.logNull2String(ReflectUtil.getFieldValue(dest, field));
-        } else {
-            return null;
-        }
-        return diffVo;
-    }
-
-
-    //region 实体转换
-    protected SimpleVo getSimpleTagVo(Object entity) {
-        return BeanUtil.copy(SimpleVo.class, entity);
-    }
-
-
-    protected List<Long> getSimpleIdList(Collection<?> beanList) {
-        if (CommUtil.isEmptyOrNull(beanList)) {
-            return Collections.emptyList();
-        } else {
-            return beanList.stream().map(k -> CommUtil.null2Long(ReflectUtil.getFieldValue(k, "id"))).collect(Collectors.toList());
-        }
-    }
-
-    protected List<SimpleVo> getSimpleVoList(Collection<?> beanList) {
-        if (CommUtil.isEmptyOrNull(beanList)) {
-            return Collections.emptyList();
-        } else {
-            return beanList.stream().map(k -> new SimpleVo(CommUtil.null2Long(ReflectUtil.getFieldValue(k, "id")), CommUtil.null2String(CommUtil.getFieldAlternativeValue(k, "name", "title")))).collect(Collectors.toList());
-        }
-    }
-
-    protected List<SimpleAttachVo> getAttachmentVoList(List<Attachment> attachments) {
-        if (CommUtil.isEmptyOrNull(attachments)) {
-            return Collections.emptyList();
-        } else {
-            return attachments.stream().map(k -> new SimpleAttachVo(k.getId(), k.getName(), k.getName())).collect(Collectors.toList());
-        }
-    }
-
-
-    protected List<SimpleUserVo> getUserSimpleVoList(Collection<? extends Number> idList) {
-        if (CommUtil.isEmptyOrNull(idList)) {
-            return Collections.emptyList();
-        }
-        List<AdminUser> userList = db.selectList(AdminUser.class, oBuilder().in("id", idList.toArray()), "id", "name", "avatar");
-//        idList.forEach(id -> userList.add(getCacheUser((Long) id)));
-        if (CommUtil.isEmptyOrNull(userList)) {
-            return Collections.emptyList();
-        } else {
-            return userList.stream().filter(CommUtil.distinctByKey(AdminUser::getId)).map(k -> new SimpleUserVo(k.getId(), k.getUsername(), k.getAvatar())).collect(Collectors.toList());
-        }
-    }
-
-    protected List<SimpleUserVo> getUserSimpleVoPropertiesList(Collection<?> beanList) {
-        if (CommUtil.isEmptyOrNull(beanList)) {
-            return Collections.emptyList();
-        } else {
-            return beanList.stream().map(k -> new SimpleUserVo(CommUtil.null2Long(CommUtil.getFieldAlternativeValue(k, "id", "userId")), CommUtil.null2String(CommUtil.getFieldAlternativeValue(k, "name", "userName")), CommUtil.null2String(CommUtil.getFieldAlternativeValue(k, "avatar", "userAvatar")))).collect(Collectors.toList());
-        }
-    }
-
-    //endregion
-
-    /**
-     * 新增记录后的日志信息写入
-     *
-     * @param id
-     */
-    protected void afterAdd(long id) {
-        ContextHelper.setAssoId(id);
-    }
-
-    /**
-     * 删除记录后的日志信息写入
-     *
-     * @param id
-     */
-    protected void afterRemove(long id) {
-        ContextHelper.setAssoId(id);
-    }
-
-    /**
-     * 修改记录后的日志信息写入
-     */
-    protected void afterModify(Object src, Object dest) {
-        diffLog(src, dest, null);
-    }
-
-
-    //region 权限校验
-
-    /**
-     * 校验全局权限(非应用内权限)
-     *
-     * @param permissions 权限值
-     */
-    protected void validate(String... permissions) {
-        validate(getOid(), permissions);
-    }
-
-    protected boolean isReadPermission(String permission) {
-        return permission.endsWith(".list");
-    }
-
-
-    /**
-     * 校验全局权限(非应用内权限)
-     *
-     * @param permissions 权限值
-     */
-    protected void validate(long orgId, String... permissions) {
-    }
-
-    /**
-     * 校验应用权限
-     *
-     * @param appletId    应用ID
-     * @param permissions 权限码值
-     */
-    protected void validateApplet(long appletId, String... permissions) {
-        validateApplet(appletId, 0, permissions);
-    }
-
-    /**
-     * 校验应用权限
-     *
-     * @param appletId    应用ID
-     * @param permissions 权限码值
-     */
-    protected void validateApplet(long appletId, long modelId, String... permissions) {
-    }
-
-
-    /**
-     * 校验租户信息是否匹配
-     *
-     * @param bean 数据实体
-     */
-    protected void validateOrg(Object bean) {
-        assertLogin();
-        long beanOrgId = CommUtil.null2Long(ReflectUtil.getFieldValue(bean, "companyId"));
-        CommUtil.asserts(beanOrgId == ContextHelper.getUser().companyId, "租户权限不足");
-    }
-
-    /**
-     * 校验租户信息是否匹配
-     *
-     * @param orgId
-     * @param bean
-     */
-    protected void validateOrg(long orgId, Object bean) {
-        long beanOrgId = CommUtil.null2Long(ReflectUtil.getFieldValue(bean, "companyId"));
-        CommUtil.asserts(beanOrgId == orgId, "租户权限不足");
-    }
-
-
-}

+ 3 - 4
car-wash-service/src/main/java/com/kym/service/admin/FeedbackService.java

@@ -1,10 +1,9 @@
 package com.kym.service.admin;
 
 import com.kym.common.R;
-import com.kym.jdbc.Bean;
-
-import com.kym.entity.admin.Feedback.FeedbackInfo;
 import com.kym.entity.admin.Feedback.FeedbackBasicQuery;
+import com.kym.entity.admin.Feedback.FeedbackInfo;
+import com.kym.entity.common.PageBean;
 
 
 /**
@@ -16,7 +15,7 @@ public interface  FeedbackService {
     /**
      * 纠错反馈分页查询
      */
-     Bean<FeedbackInfo> list(FeedbackBasicQuery query);
+     PageBean<?> list(FeedbackBasicQuery query);
 
     /**
      * 查询纠错反馈详情

+ 9 - 37
car-wash-service/src/main/java/com/kym/service/admin/impl/FeedbackServiceImpl.java

@@ -1,21 +1,13 @@
 package com.kym.service.admin.impl;
 
 import com.kym.common.R;
-import com.kym.common.constant.ResponseEnum;
-import com.kym.common.utils.CommUtil;
-import com.kym.dao.admin.FeedbackDAO;
-import com.kym.entity.admin.Feedback;
 import com.kym.entity.admin.Feedback.FeedbackBasicQuery;
 import com.kym.entity.admin.Feedback.FeedbackInfo;
-import com.kym.jdbc.Bean;
-import com.kym.service.IService;
+import com.kym.entity.common.PageBean;
 import com.kym.service.admin.FeedbackService;
-import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-
 
 /**
  * 纠错反馈业务类
@@ -23,24 +15,21 @@ import java.util.Date;
  * @date 2024-09-22T20:40:35.300431885
  */
 @Service("feedbackService")
-public class FeedbackServiceImpl extends IService implements FeedbackService {
+public class FeedbackServiceImpl implements FeedbackService {
 
-    @Resource
-    private FeedbackDAO feedbackDAO;
 
     /**
      * 纠错反馈分页查询
      */
-    public Bean<FeedbackInfo> list(FeedbackBasicQuery query) {
-        setupQuery(query);
-        return feedbackDAO.selectPageBean(query);
+    public PageBean<FeedbackInfo> list(FeedbackBasicQuery query) {
+        return null;
     }
 
     /**
      * 查询纠错反馈详情
      */
     public FeedbackInfo detail(long id) {
-        return feedbackDAO.selectOneExist(FeedbackInfo.class, id);
+        return null;
     }
 
 
@@ -49,12 +38,7 @@ public class FeedbackServiceImpl extends IService implements FeedbackService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void status(long id, int status) {
-        Feedback old = feedbackDAO.selectOneExist(Feedback.class, id);
-        Feedback bean = new Feedback();
-//    bean.setId(id);
-        bean.setStatus(status);
-        feedbackDAO.updateSelective(bean, "status");
-        super.afterModify(old, bean);
+
     }
 
 
@@ -63,11 +47,7 @@ public class FeedbackServiceImpl extends IService implements FeedbackService {
      */
     @Transactional(rollbackFor = Exception.class)
     public long add(FeedbackInfo feedback) {
-        long ret = feedbackDAO.insert(feedback);
-        CommUtil.asserts(ret > 0, ResponseEnum.DB_ERROR);
-
-        super.afterAdd(ret);
-        return ret;
+        return 0L;
     }
 
     /**
@@ -75,9 +55,7 @@ public class FeedbackServiceImpl extends IService implements FeedbackService {
      */
     @Transactional(rollbackFor = Exception.class)
     public R<?> remove(long id) {
-        feedbackDAO.delete(Feedback.class, id);
-        super.afterRemove(id);
-        return R.success();
+        return null;
     }
 
     /**
@@ -85,13 +63,7 @@ public class FeedbackServiceImpl extends IService implements FeedbackService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void reply(FeedbackInfo feedback) {
-        FeedbackInfo oldBean = feedbackDAO.selectOneExist(FeedbackInfo.class, feedback.getId());
-        CommUtil.assertsNonNull(feedback.getReplyContent(),ResponseEnum.PARAMS_ERROR);
-        feedback.setReplyUserId(getUserId());
-        feedback.setReplyTime(new Date());
-        int ret = feedbackDAO.updateSelective(feedback,Feedback::getReplyContent,Feedback::getReplyTime,Feedback::getStatus,Feedback::getReplyContent);
-        CommUtil.asserts(ret > 0, ResponseEnum.DB_ERROR);
-        super.afterModify(oldBean, feedback);
+
     }
 
 

+ 0 - 1
pom.xml

@@ -21,7 +21,6 @@
         <module>car-wash-miniapp</module>
         <module>car-wash-service</module>
         <module>car-wash-mapper</module>
-        <module>car-wash-jdbc</module>
     </modules>
     <properties>
         <java.version>17</java.version>