mybatis-generatorが生成するクエリカスタマイズのために、生成されたクエリ上のパラメータを置換する方法を調べたので記載しておきます。
サンプルプログラム
Java言語の場合、標準ライブラリのPatternクラスで正規表現パターンを作成し、Matcherで検索や置換が行えます。該当箇所を纏めて置換する場合はMatcher#replaceAll()が手っ取り早いが、個々に条件判断して置換する場合は、Matcher#appendReplacement(), Matcher#appendTail()が便利です。
次の例では入力の文字列中の”#{xxx}”部分を”func(#{xxx})”に置き換えるサンプルです。
appendReplacement(), appendTail()の引数はStringBufferになっていますが、Java9以降ではStringBuilderが使えるそうです。
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 | 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()); } } |
1 2 3 4 | 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})) |