SqlContext.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package org.example.join.sql;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
  5. import com.baomidou.mybatisplus.core.metadata.TableInfo;
  6. import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
  7. import com.baomidou.mybatisplus.core.toolkit.StringPool;
  8. import org.example.join.domain.IFormat;
  9. import org.example.join.domain.ITable;
  10. import org.example.join.domain.SqlConstant;
  11. import org.example.join.domain.Table;
  12. import org.example.join.domain.TableJoin;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.StringJoiner;
  17. @SuppressWarnings("unchecked")
  18. public class SqlContext {
  19. private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
  20. private static final String PARAM_NUMBER = "paramNumber";
  21. private static final String PARAM_MAP = "paramMap";
  22. private static final String TABLE_ALIAS_MAP = "tableAliasMap";
  23. public static void init(Map<String, Object> paramMap) {
  24. Map<String, Object> map = new HashMap<>();
  25. map.put(PARAM_NUMBER, 1);
  26. map.put(PARAM_MAP, paramMap);
  27. threadLocal.set(map);
  28. }
  29. public static void putValue(StringJoiner joiner, Object value) {
  30. if (value instanceof IFormat iFormat) {
  31. joiner.add(iFormat.toSql());
  32. } else {
  33. String mapKey = getParamKey();
  34. joiner.add(StringPool.HASH_LEFT_BRACE + mapKey + StringPool.RIGHT_BRACE);
  35. Map<String, Object> map = threadLocal.get();
  36. ((Map<String, Object>) map.get(PARAM_MAP)).put(mapKey, value);
  37. }
  38. }
  39. public static void remove() {
  40. threadLocal.remove();
  41. }
  42. public static String getTableAlias(Table table) {
  43. Map<String, String> tableAliasMap = getTableAliasMap();
  44. String tableAlias = table.getAlias();
  45. String tableName = table.getName();
  46. if (StrUtil.isBlank(tableAlias)) {
  47. tableAlias = tableAliasMap.get(tableName);
  48. if (StrUtil.isBlank(tableAlias)) {
  49. throw new IllegalArgumentException("未知连表:" + tableName);
  50. }
  51. }
  52. return tableAlias;
  53. }
  54. private static Map<String, String> createTableAliasMap(Sql<?> sql) {
  55. List<ITable> queryTableList = sql.queryTableList;
  56. int number = 1;
  57. Map<String, String> tableAliasMap = new HashMap<>();
  58. for (ITable iTable : queryTableList) {
  59. Table table;
  60. if (iTable instanceof Table item) {
  61. table = item;
  62. } else if (iTable instanceof TableJoin item) {
  63. table = item.getTable();
  64. } else {
  65. throw new IllegalArgumentException("未知ITable类型");
  66. }
  67. if (ObjectUtil.isEmpty(table.getAlias())) {
  68. if (tableAliasMap.containsKey(table.getName())) {
  69. throw new IllegalArgumentException(table.getName() + "表已存在,再次连表请取别名");
  70. }
  71. tableAliasMap.put(table.getName(), "t" + (number++));
  72. }
  73. }
  74. return tableAliasMap;
  75. }
  76. public static String getTableDelFlag(Table table) {
  77. TableInfo tableInfo = TableInfoHelper.getTableInfo(table.getName());
  78. if (!tableInfo.isWithLogicDelete()) {
  79. return null;
  80. }
  81. TableFieldInfo logicDeleteFieldInfo = tableInfo.getLogicDeleteFieldInfo();
  82. return logicDeleteFieldInfo.getColumn();
  83. }
  84. private static Map<String, String> getTableAliasMap() {
  85. Map<String, Object> map = threadLocal.get();
  86. return (Map<String, String>) map.get(TABLE_ALIAS_MAP);
  87. }
  88. public static void setTableAliasMap(Sql<?> sql) {
  89. Map<String, Object> map = threadLocal.get();
  90. map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql));
  91. }
  92. private static String getParamKey() {
  93. Map<String, Object> map = threadLocal.get();
  94. int paramNumber = (int) map.get(PARAM_NUMBER);
  95. map.put(PARAM_NUMBER, paramNumber + 1);
  96. return SqlConstant.SQL_PARAM + paramNumber;
  97. }
  98. }