| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- 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表达式构造
- * <p>
- * mysql\oracle\postgresql\sqlserver\db2\h2\sqlite\人大金仓\达梦\
- * </p>
- */
- public interface SQLExpress<T> {
- T toSQL();
- default String getComma() {
- return "\"";
- }
- boolean strict = false;
- 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(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);
- }
- }
- }
- }
- }
- }
|