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动态解析器
*
* 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 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 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;
}
/**
* 聚合函数查询
* 注意:聚合函数的查询需要使用子查询
*
* @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