readyStatement.toString ()을 사용하여 PreparedStatement에서 SQL을 추출했습니다. 제 경우에는 toString ()이 다음과 같이 String을 반환합니다.
org.hsqldb.jdbc.JDBCPreparedStatement@7098b907[sql=[INSERT INTO
TABLE_NAME(COLUMN_NAME, COLUMN_NAME, COLUMN_NAME) VALUES(?, ?, ?)],
parameters=[[value], [value], [value]]]
이제 정규식을 사용하여 쿼리와 값을 추출하고 맵에 넣는 메소드 (Java 8)를 만들었습니다.
private Map<String, String> extractSql(PreparedStatement preparedStatement) {
Map<String, String> extractedParameters = new HashMap<>();
Pattern pattern = Pattern.compile(".*\\[sql=\\[(.*)],\\sparameters=\\[(.*)]].*");
Matcher matcher = pattern.matcher(preparedStatement.toString());
while (matcher.find()) {
extractedParameters.put("query", matcher.group(1));
extractedParameters.put("values", Stream.of(matcher.group(2).split(","))
.map(line -> line.replaceAll("(\\[|])", ""))
.collect(Collectors.joining(", ")));
}
return extractedParameters;
}
이 메소드는 키-값 쌍이있는 맵을 반환합니다.
"query" -> "INSERT INTO TABLE_NAME(COLUMN_NAME, COLUMN_NAME, COLUMN_NAME) VALUES(?, ?, ?)"
"values" -> "value, value, value"
이제 값을 목록으로 사용하려면 간단히 다음을 사용할 수 있습니다.
List<String> values = Stream.of(yourExtractedParametersMap.get("values").split(","))
.collect(Collectors.toList());
readyStatement.toString ()이 제 경우와 다른 경우 정규 표현식을 "조정"하는 것입니다.