package com.kym.jdbc.express; import com.kym.DbUtil; import com.kym.jdbc.OBuilder; import com.kym.jdbc.annotations.DBF; import com.kym.jdbc.annotations.Entity; import com.kym.jdbc.template.JdbcHelper; 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表达式构造 *

* mysql\oracle\postgresql\sqlserver\db2\h2\sqlite\人大金仓\达梦\ *

*/ public interface SQLExpress { T toSQL(); default String getComma() { return "\""; } boolean strict = false; default void appendValue(StringBuilder sbr, Type type, Object value, List parameters) { sbr.append("?").append(","); parameters.add(value); } default void appendValue(StringBuilder sbr, Object value, List 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(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 val, String tbAlias, List 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 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); } } } } } }