package org.example.join.sql; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import org.example.join.domain.IFormat; import org.example.join.domain.ITable; import org.example.join.domain.SqlConstant; import org.example.join.domain.Table; import org.example.join.domain.TableJoin; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringJoiner; @SuppressWarnings("unchecked") public class SqlContext { private static final ThreadLocal> threadLocal = new ThreadLocal<>(); private static final String PARAM_NUMBER = "paramNumber"; private static final String PARAM_MAP = "paramMap"; private static final String TABLE_ALIAS_MAP = "tableAliasMap"; public static void init(Map paramMap) { Map map = new HashMap<>(); map.put(PARAM_NUMBER, 1); map.put(PARAM_MAP, paramMap); threadLocal.set(map); } public static void putValue(StringJoiner joiner, Object value) { if (value instanceof IFormat iFormat) { joiner.add(iFormat.toSql()); } else { String mapKey = getParamKey(); joiner.add(StringPool.HASH_LEFT_BRACE + mapKey + StringPool.RIGHT_BRACE); Map map = threadLocal.get(); ((Map) map.get(PARAM_MAP)).put(mapKey, value); } } public static void remove() { threadLocal.remove(); } public static String getTableAlias(Table table) { Map tableAliasMap = getTableAliasMap(); String tableAlias = table.getAlias(); String tableName = table.getName(); if (StrUtil.isBlank(tableAlias)) { tableAlias = tableAliasMap.get(tableName); if (StrUtil.isBlank(tableAlias)) { throw new IllegalArgumentException("未知连表:" + tableName); } } return tableAlias; } private static Map createTableAliasMap(Sql sql) { List queryTableList = sql.queryTableList; int number = 1; Map tableAliasMap = new HashMap<>(); for (ITable iTable : queryTableList) { Table table; if (iTable instanceof Table item) { table = item; } else if (iTable instanceof TableJoin item) { table = item.getTable(); } else { throw new IllegalArgumentException("未知ITable类型"); } if (ObjectUtil.isEmpty(table.getAlias())) { if (tableAliasMap.containsKey(table.getName())) { throw new IllegalArgumentException(table.getName() + "表已存在,再次连表请取别名"); } tableAliasMap.put(table.getName(), "t" + (number++)); } } return tableAliasMap; } public static String getTableDelFlag(Table table) { TableInfo tableInfo = TableInfoHelper.getTableInfo(table.getName()); if (!tableInfo.isWithLogicDelete()) { return null; } TableFieldInfo logicDeleteFieldInfo = tableInfo.getLogicDeleteFieldInfo(); return logicDeleteFieldInfo.getColumn(); } private static Map getTableAliasMap() { Map map = threadLocal.get(); return (Map) map.get(TABLE_ALIAS_MAP); } public static void setTableAliasMap(Sql sql) { Map map = threadLocal.get(); map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql)); } private static String getParamKey() { Map map = threadLocal.get(); int paramNumber = (int) map.get(PARAM_NUMBER); map.put(PARAM_NUMBER, paramNumber + 1); return SqlConstant.SQL_PARAM + paramNumber; } }