package com.vci.ubcs.starter.util; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.enums.SqlKeyword; import com.baomidou.mybatisplus.core.enums.SqlLike; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.vci.ubcs.starter.web.util.VciDateUtil; import javafx.scene.input.DataFormat; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import java.util.Locale; import java.util.Map; /** * UBCSSqlKeyword,高级查询不传的时候默认是_equal * map转wrapper时用到的比对转换 * @author ludc * @date 2023/06/06 10:01 */ public class UBCSSqlKeyword { private static final String SQL_REGEX = "'|%|--|insert|delete|select|count|group|union|drop|truncate|alter|grant|execute|exec|xp_cmdshell|call|declare|sql"; private static final String EQUAL = "_equal"; private static final String NOT_EQUAL = "_notequal"; private static final String LIKE = "_like"; private static final String LIKE_LEFT = "_likeleft"; private static final String LIKE_RIGHT = "_likeright"; private static final String NOT_LIKE = "_notlike"; private static final String GE = "_ge"; private static final String LE = "_le"; private static final String GT = "_gt"; private static final String LT = "_lt"; private static final String DATE_GE = "_datege"; private static final String DATE_GT = "_dategt"; private static final String DATE_EQUAL = "_dateequal"; private static final String DATE_LT = "_datelt"; private static final String DATE_LE = "_datele"; private static final String IS_NULL = "_null"; private static final String NOT_NULL = "_notnull"; private static final String IGNORE = "_ignore"; public UBCSSqlKeyword() { } private static String likeValueSqlwhere(String field, Object value, SqlLike operation){ String sqlwhere=""; switch(operation) { case LEFT: return sqlwhere = field +" "+SqlKeyword.LIKE.getSqlSegment() +" '%" + value.toString() + "' "; case RIGHT: sqlwhere=field+" "+SqlKeyword.LIKE.getSqlSegment() +" '"+value.toString()+"%' "; case DEFAULT: return sqlwhere=field+" "+SqlKeyword.LIKE.getSqlSegment() +" '%"+value.toString()+"%' "; } return sqlwhere; } private static String sqlKeywordValueSqlwhere(String field, Object value, SqlKeyword operation){ String sqlwhere=""; switch(operation) { case IN://"IN"), return sqlwhere=field+" "+SqlKeyword.IN.getSqlSegment() +"('"+value.toString()+"')"; case NOT_IN://"NOT IN"), sqlwhere=field+" "+SqlKeyword.NOT_IN.getSqlSegment() +"('"+value.toString()+"')"; //case LIKE://"LIKE"), case NOT_LIKE://"NOT LIKE"), return sqlwhere=field+" "+SqlKeyword.NOT_LIKE.getSqlSegment() +" '%"+value+"%' "; case EQ://"="), return sqlwhere=field+" "+SqlKeyword.EQ.getSqlSegment() +" '"+value.toString()+"' "; case NE://"<>"), return sqlwhere=field+ " "+SqlKeyword.NE.getSqlSegment() +" '"+value.toString()+"' "; case GT://">"), return sqlwhere=field+ " "+SqlKeyword.GT.getSqlSegment() +" '"+value.toString()+"' "; case GE://">="), return sqlwhere=field+ " "+SqlKeyword.GE.getSqlSegment() +" '"+value.toString()+"' "; case LT://"<"), return sqlwhere=field+ " "+SqlKeyword.LT.getSqlSegment() +" '"+value.toString()+"' "; case LE://"<="), return sqlwhere=field+" "+ SqlKeyword.LE.getSqlSegment() +" '"+value.toString()+"' "; case IS_NULL://"IS NULL"), return sqlwhere=field+" IS NULL "; case IS_NOT_NULL://"IS NOT NULL"), return sqlwhere=field+" IS NOT NULL "; } return sqlwhere; } private static String dateValueSqlwhere(String field, Object value, SqlKeyword operation){ String sqlwhere=""; switch(operation) { case EQ://"="), return sqlwhere=field+" "+SqlKeyword.EQ.getSqlSegment() +" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; case NE://"<>"), return sqlwhere=field+ " "+SqlKeyword.NE.getSqlSegment() +" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; case GT://">"), return sqlwhere=field+ " "+SqlKeyword.GT.getSqlSegment() +" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; case GE://">="), return sqlwhere=field+ " "+SqlKeyword.GE.getSqlSegment() +" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; case LT://"<"), return sqlwhere=field+ " "+SqlKeyword.LT.getSqlSegment()+" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; case LE://"<="), return sqlwhere=field+" "+ SqlKeyword.LE.getSqlSegment() +" to_date('"+value.toString()+"','yyyy-MM-dd HH:mm:ss') "; } return sqlwhere; } public static String buildSqlwhere(Map query) { StringBuffer sb=new StringBuffer(); if (!Func.isEmpty(query)) { query.forEach((k, v) -> { if (!Func.hasEmpty(new Object[]{k, v})) { sb.append(" and "); if (k.endsWith(LIKE)) { sb.append(likeValueSqlwhere(getColumn(k,LIKE),v,SqlLike.DEFAULT)); } else if (k.endsWith(NOT_EQUAL)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,NOT_EQUAL), v,SqlKeyword.NE)); } else if (k.endsWith(LIKE_LEFT)) { sb.append(likeValueSqlwhere(getColumn(k,LIKE_LEFT),v,SqlLike.LEFT)); } else if (k.endsWith(LIKE_RIGHT)) { sb.append(likeValueSqlwhere(getColumn(k,LIKE_RIGHT),v,SqlLike.RIGHT)); } else if (k.endsWith(NOT_LIKE)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,NOT_LIKE), v,SqlKeyword.NOT_LIKE)); } else if (k.endsWith(GE)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,GE), v,SqlKeyword.GE)); } else if (k.endsWith(LE)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,LE), v,SqlKeyword.LE)); } else if (k.endsWith(GT)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,GT), v,SqlKeyword.GT)); } else if (k.endsWith(LT)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,LT), v,SqlKeyword.LT)); } else if (k.endsWith(DATE_GE)) { sb.append(dateValueSqlwhere(getColumn(k,DATE_GE),v,SqlKeyword.GE)); } else if (k.endsWith(DATE_GT)) { sb.append(dateValueSqlwhere(getColumn(k,DATE_GT),v,SqlKeyword.GT)); } else if (k.endsWith(DATE_EQUAL)) { sb.append(dateValueSqlwhere(getColumn(k,DATE_EQUAL),v,SqlKeyword.EQ)); } else if (k.endsWith(DATE_LE)) { sb.append(dateValueSqlwhere(getColumn(k,DATE_LE),v,SqlKeyword.LE)); } else if (k.endsWith(DATE_LT)) { sb.append(dateValueSqlwhere(getColumn(k,DATE_LT),v,SqlKeyword.LT)); } else if (k.endsWith(IS_NULL)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,IS_NULL), v,SqlKeyword.IS_NULL)); } else if (k.endsWith(NOT_NULL)) { sb.append(sqlKeywordValueSqlwhere(getColumn(k,NOT_NULL), v,SqlKeyword.IS_NOT_NULL)); } else { sb.append(sqlKeywordValueSqlwhere(getColumn(k,EQUAL), v,SqlKeyword.EQ)); } } }); } return sb.toString(); } public static void buildCondition(Map query, QueryWrapper qw) { if (!Func.isEmpty(query)) { query.forEach((k, v) -> { if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) { if (k.endsWith("_like")) { qw.like(getColumn(k, "_like"), v); } else if (k.endsWith("_notequal")) { qw.ne(getColumn(k, "_notequal"), v); } else if (k.endsWith("_likeleft")) { qw.likeLeft(getColumn(k, "_likeleft"), v); } else if (k.endsWith("_likeright")) { qw.likeRight(getColumn(k, "_likeright"), v); } else if (k.endsWith("_notlike")) { qw.notLike(getColumn(k, "_notlike"), v); } else if (k.endsWith("_ge")) { qw.ge(getColumn(k, "_ge"), v); } else if (k.endsWith("_le")) { qw.le(getColumn(k, "_le"), v); } else if (k.endsWith("_gt")) { qw.gt(getColumn(k, "_gt"), v); } else if (k.endsWith("_lt")) { qw.lt(getColumn(k, "_lt"), v); } else if (k.endsWith("_datege")) { qw.ge(getColumn(k, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dategt")) { qw.gt(getColumn(k, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dateequal")) { qw.eq(getColumn(k, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datele")) { qw.le(getColumn(k, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datelt")) { qw.lt(getColumn(k, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_null")) { qw.isNull(getColumn(k, "_null")); } else if (k.endsWith("_notnull")) { qw.isNotNull(getColumn(k, "_notnull")); } else { qw.eq(getColumn(k, "_equal"), v); } } }); } } public static void buildConditionByAs(Map query, MPJLambdaWrapper qw, String tableAlias){ buildConditionMPJ(query,qw,tableAlias); } public static void buildCondition(Map query, MPJLambdaWrapper qw) { buildConditionMPJ(query,qw,null); } private static void buildConditionMPJ(Map query, MPJLambdaWrapper qw, String tableAlias){ if (!Func.isEmpty(query)) { query.forEach((k, v) -> { if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) { if (k.endsWith("_like")) { qw.like(tableAlias+"."+getColumn(k, "_like"), v); } else if (k.endsWith("_notequal")) { qw.ne(tableAlias+"."+getColumn(k, "_notequal"), v); } else if (k.endsWith("_likeleft")) { qw.likeLeft(tableAlias+"."+getColumn(k, "_likeleft"), v); } else if (k.endsWith("_likeright")) { qw.likeRight(tableAlias+"."+getColumn(k, "_likeright"), v); } else if (k.endsWith("_notlike")) { qw.notLike(tableAlias+"."+getColumn(k, "_notlike"), v); } else if (k.endsWith("_ge")) { qw.ge(tableAlias+"."+getColumn(k, "_ge"), v); } else if (k.endsWith("_le")) { qw.le(tableAlias+"."+getColumn(k, "_le"), v); } else if (k.endsWith("_gt")) { qw.gt(tableAlias+"."+getColumn(k, "_gt"), v); } else if (k.endsWith("_lt")) { qw.lt(tableAlias+"."+getColumn(k, "_lt"), v); } else if (k.endsWith("_datege")) { qw.ge(tableAlias+"."+getColumn(k, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dategt")) { qw.gt(tableAlias+"."+getColumn(k, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dateequal")) { qw.eq(tableAlias+"."+getColumn(k, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datele")) { qw.le(tableAlias+"."+getColumn(k, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datelt")) { qw.lt(tableAlias+"."+getColumn(k, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_null")) { qw.isNull(tableAlias+"."+getColumn(k, "_null")); } else if (k.endsWith("_notnull")) { qw.isNotNull(tableAlias+"."+getColumn(k, "_notnull")); } else { qw.eq(tableAlias+"."+getColumn(k, "_equal"), v); } } }); } } public static void buildConditionByMapString(Map query, MPJLambdaWrapper qw) { if (!Func.isEmpty(query)) { query.forEach((k, v) -> { if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) { if (k.endsWith("_like")) { qw.like(getColumn(k, "_like"), v); } else if (k.endsWith("_notequal")) { qw.ne(getColumn(k, "_notequal"), v); } else if (k.endsWith("_likeleft")) { qw.likeLeft(getColumn(k, "_likeleft"), v); } else if (k.endsWith("_likeright")) { qw.likeRight(getColumn(k, "_likeright"), v); } else if (k.endsWith("_notlike")) { qw.notLike(getColumn(k, "_notlike"), v); } else if (k.endsWith("_ge")) { qw.ge(getColumn(k, "_ge"), v); } else if (k.endsWith("_le")) { qw.le(getColumn(k, "_le"), v); } else if (k.endsWith("_gt")) { qw.gt(getColumn(k, "_gt"), v); } else if (k.endsWith("_lt")) { qw.lt(getColumn(k, "_lt"), v); } else if (k.endsWith("_datege")) { qw.ge(getColumn(k, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dategt")) { qw.gt(getColumn(k, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dateequal")) { qw.eq(getColumn(k, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datele")) { qw.le(getColumn(k, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datelt")) { qw.lt(getColumn(k, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_null")) { qw.isNull(getColumn(k, "_null")); } else if (k.endsWith("_notnull")) { qw.isNotNull(getColumn(k, "_notnull")); } else { qw.eq(getColumn(k, "_equal"), v); } } }); } } public static void buildConditionByMapString(Map query, QueryWrapper qw) { if (!Func.isEmpty(query)) { query.forEach((k, v) -> { if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) { if (k.endsWith("_like")) { qw.like(getColumn(k, "_like"), v); } else if (k.endsWith("_notequal")) { qw.ne(getColumn(k, "_notequal"), v); } else if (k.endsWith("_likeleft")) { qw.likeLeft(getColumn(k, "_likeleft"), v); } else if (k.endsWith("_likeright")) { qw.likeRight(getColumn(k, "_likeright"), v); } else if (k.endsWith("_notlike")) { qw.notLike(getColumn(k, "_notlike"), v); } else if (k.endsWith("_ge")) { qw.ge(getColumn(k, "_ge"), v); } else if (k.endsWith("_le")) { qw.le(getColumn(k, "_le"), v); } else if (k.endsWith("_gt")) { qw.gt(getColumn(k, "_gt"), v); } else if (k.endsWith("_lt")) { qw.lt(getColumn(k, "_lt"), v); } else if (k.endsWith("_datege")) { qw.ge(getColumn(k, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dategt")) { qw.gt(getColumn(k, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_dateequal")) { qw.eq(getColumn(k, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datele")) { qw.le(getColumn(k, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_datelt")) { qw.lt(getColumn(k, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss")); } else if (k.endsWith("_null")) { qw.isNull(getColumn(k, "_null")); } else if (k.endsWith("_notnull")) { qw.isNotNull(getColumn(k, "_notnull")); } else { qw.eq(getColumn(k, "_equal"), v); } } }); } } /** * 获取列名,没有转下划线映射 * @param column * @param keyword * @return */ public static String getColumn(String column, String keyword) { //没有转下划线映射 return StringUtil.removeSuffix(column, keyword).toLowerCase(Locale.ROOT).trim(); } public static String filter(String param) { return param == null ? null : param.replaceAll("(?i)'|%|--|insert|delete|select|count|group|union|drop|truncate|alter|grant|execute|exec|xp_cmdshell|call|declare|sql", ""); } }