fwq
2024-09-27 9436a044624dfc8ab027a5345d9814d29a0f74f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package com.hx.mybatisTool;
 
import com.hx.util.StringUtils;
 
import java.util.List;
import java.util.Map;
 
/**
 * Sql工具类
 * @author fwq
 */
public class SqlStringTool {
 
    /**基础key*/
    private static final String BASE_KEY = "k";
    /**AND符号*/
    private static final String AND_STR = " AND ";
    /**左边括号拼接*/
    private static final String LEFT_STR = "#{m.";
    /**右边括号拼接*/
    private static final String RIGHT_STR = "}";
    /**逗号分隔*/
    private static final String SIGN_STR = ",";
    /**IN左符号*/
    private static final String IN_LEFT = " IN ( ";
    /**IN右符号*/
    private static final String IN_RIGHT = " ) ";
 
    /**
     * 递归key,直到不重复,这个递归是针对同一个sqlMap,防止同方法多个查询时存在key覆盖问题。
     * PS:建议查询完上一次,清理sqlMap后再传递进来,减少递归的操作
     */
    private static String getKey(String key, Map<String, Object> sqlMap) {
        if (sqlMap.get(key) != null) {
            getKey(BASE_KEY + key, sqlMap);
        }
        return key;
    }
 
    /**
     * 拼接sql语句
     * @param sql         StringBuilder的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,List集合
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuilder sql, String tableColumn, List<String> dataList, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.size() < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.size(); i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList.get(i));
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
 
    /**
     * 拼接sql语句
     * @param sql         StringBuffer的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,List集合
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuffer sql, String tableColumn, List<String> dataList, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.size() < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.size(); i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList.get(i));
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
    /**
     * 拼接sql语句
     * @param sql         StringBuilder的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,String数组
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuilder sql, String tableColumn, String[] dataList, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.length < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.length; i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList[i]);
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
    /**
     * 拼接sql语句
     * @param sql         StringBuffer的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,String数组
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuffer sql, String tableColumn, String[] dataList, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.length < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.length; i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList[i]);
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
    /**
     * 拼接sql语句
     * @param sql         StringBuilder的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,Map数组对象
     * @param dataListKey Map数组对象中要循环值对应的key
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuilder sql, String tableColumn, List<Map<String, Object>> dataList, String dataListKey, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.size() < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.size(); i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList.get(i).get(dataListKey));
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
    /**
     * 拼接sql语句
     * @param sql         StringBuffer的sql语句
     * @param tableColumn 含别名表字段,例如:user AS u 根据id查询时传递u.id
     * @param dataList    要循环的数值,Map数组对象
     * @param dataListKey Map数组对象中要循环值对应的key
     * @param sqlMap      sql语句对应的参数Map
     */
    public static void handleList(StringBuffer sql, String tableColumn, List<Map<String, Object>> dataList, String dataListKey, Map<String, Object> sqlMap) {
        if (sql == null || StringUtils.isEmpty(tableColumn) || dataList == null || dataList.size() < 1) {
            return;
        }
        String key = null;
        sql.append(AND_STR).append(tableColumn).append(IN_LEFT);
        for (int i = 0; i < dataList.size(); i++) {
            key = getKey(BASE_KEY + i, sqlMap);
            sql.append(LEFT_STR).append(key).append(RIGHT_STR).append(SIGN_STR);
            sqlMap.put(key, dataList.get(i).get(dataListKey));
        }
        sql.deleteCharAt(sql.length() - 1).append(IN_RIGHT);
    }
 
 
}