123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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.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<Map<String, Object>> 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<String, Object> paramMap) {
- Map<String, Object> 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<String, Object> map = threadLocal.get();
- ((Map<String, Object>) map.get(PARAM_MAP)).put(mapKey, value);
- }
- }
- public static void remove() {
- threadLocal.remove();
- }
- public static String getTableAlias(Table table) {
- Map<String, String> 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<String, String> createTableAliasMap(Sql<?> sql) {
- List<ITable> queryTableList = sql.queryTableList;
- int number = 1;
- Map<String, String> 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<String, String> getTableAliasMap() {
- Map<String, Object> map = threadLocal.get();
- return (Map<String, String>) map.get(TABLE_ALIAS_MAP);
- }
- public static void setTableAliasMap(Sql<?> sql) {
- Map<String, Object> map = threadLocal.get();
- map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql));
- }
- private static String getParamKey() {
- Map<String, Object> map = threadLocal.get();
- int paramNumber = (int) map.get(PARAM_NUMBER);
- map.put(PARAM_NUMBER, paramNumber + 1);
- return SqlConstant.SQL_PARAM + paramNumber;
- }
- }
|