mybatis-generatorが生成するクエリカスタマイズのために、生成されたクエリ上のパラメータを置換する方法を調べたので記載しておきます。
目次
サンプルプログラム
Java言語の場合、標準ライブラリのPatternクラスで正規表現パターンを作成し、Matcherで検索や置換が行えます。該当箇所を纏めて置換する場合はMatcher#replaceAll()が手っ取り早いが、個々に条件判断して置換する場合は、Matcher#appendReplacement(), Matcher#appendTail()が便利です。
次の例では入力の文字列中の”#{xxx}”部分を”func(#{xxx})”に置き換えるサンプルです。
appendReplacement(), appendTail()の引数はStringBufferになっていますが、Java9以降ではStringBuilderが使えるそうです。
package example.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexReplaceExample1 {
public static void main(String[] args) {
String instr = "insert into table1(col1, col2) values(#{abc}, #{xyz})";
System.out.println("in : " + instr);
Pattern p = Pattern.compile("\\#\\{(.*?)\\}");
Matcher m = p.matcher(instr);
StringBuffer sb = new StringBuffer(); // 置換後文字列を格納
while (m.find()) {
String all = m.group(0);
String part = m.group(1);
System.out.println("[0]=" + all + ", [1]=" + part);
String replace = "func(" + all + ")"; // 置換の例
m.appendReplacement(sb, replace);
}
m.appendTail(sb);
System.out.println("out: " + sb.toString());
}
}実行結果は次の通りです。
in : insert into table1(col1, col2) values(#{abc}, #{xyz})
[0]=#{abc}, [1]=abc
[0]=#{xyz}, [1]=xyz
out: insert into table1(col1, col2) values(func(#{abc}), func(#{xyz}))