QueryUtils.java
package com.github.mygreen.sqlmapper.core.util;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.util.StringUtils;
/**
* クエリ組み立て時のヘルパークラス
*
*
* @author T.TSUCHIE
*
*/
public class QueryUtils {
/**
* {@link String}の配列に変換して返します。
* @param list 要素が文字列のリスト
* @return {@link String}の配列
*/
public static String[] toArray(List<String> list) {
return list.toArray(new String[list.size()]);
}
/**
* 指定したインデックスのSQLパラメータソースを取得します。
* <p>インスタンスが存在しなければ、新しく作成します。</p>
* @param paramSources 取得対象のSQLパラメータソース。
* @param index インデックス
* @return SQLパラメータソース。
*/
public static MapSqlParameterSource get(MapSqlParameterSource[] paramSources, int index) {
MapSqlParameterSource paramSource = paramSources[index];
if(paramSource == null) {
paramSource = new MapSqlParameterSource();
paramSources[index] = paramSource;
}
return paramSource;
}
/**
* 指定したインデックスのSQLパラメータソースを取得します。
* <p>インスタンスが存在しなければ、新しく作成します。</p>
* @param batchParams 取得対象のSQLパラメータソース。
* @param index インデックス
* @return SQLパラメータソース。
*/
public static List<Object> get(List<Object>[] batchParams, int index) {
List<Object> params = batchParams[index];
if(params == null) {
params = new ArrayList<>();
batchParams[index] = params;
}
return params;
}
/**
* JdbcItemplate用のバッチ実行用のパラメータの形式に変換する。
* @param batchParams 変換対象のパラメータ
* @return {@literal List<Object[]>} の形式に変換したパラメータ。
*/
public static List<Object[]> convertBatchArgs(List<Object>[] batchParams) {
List<Object[]> batchArgs = new ArrayList<>();
for(List<Object> params : batchParams) {
int size = params.size();
Object[] args = new Object[size];
for(int i=0; i < size; i++) {
args[i] = params.get(i);
}
batchArgs.add(args);
}
return batchArgs;
}
/**
* 指定した回数文字を繰り返す。
* @param str 繰り返す文字。(nullや空文字の場合は空文字を返す)
* @param separator 区切り文字 (nullや空文字の場合は区切り文字は追加しない)
* @param repeat 繰り返し数。(0以下の場合は空文字を返す)
* @return 指定した文字を繰り返した結果。
*/
public static String repeat(final String str, final String separator, final int repeat) {
if(!StringUtils.hasLength(str)) {
return "";
}
if(repeat <= 0) {
return "";
}
StringBuilder result = new StringBuilder();
for(int i=0; i < repeat; i++) {
if(result.length() > 0 && StringUtils.hasLength(separator)) {
result.append(separator);
}
result.append(str);
}
return result.toString();
}
/**
* LIKE演算子の値に対するエスケープを行う。
* <ul>
* <li>{@literal %} {@literal =>} {@literal \%}</li>
* <li>{@literal _} {@literal =>} {@literal \_}</li>
* </ul>
* @param str エスケープ対象の文字列
* @param escape エスケープ文字
* @return エスケープ後の文字列
*/
public static String escapeLike(final String str, final char escape) {
if(!StringUtils.hasLength(str)) {
return "";
}
int length = str.length();
StringBuilder sb = new StringBuilder(length);
for(int i=0; i < length; i++) {
char c = str.charAt(i);
if(c == '%' || c == '_') {
sb.append(escape).append(c);
} else {
sb.append(c);
}
}
return sb.toString();
}
}