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 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 dataList, Map 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 dataList, Map 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 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 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> dataList, String dataListKey, Map 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> dataList, String dataListKey, Map 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); } }