上篇博文讲述了如何创建Connection对象的,这篇将会讲述mybatis是如何处理注解字符串信息的,可能有不相同的地方,但其思想大体一致。
GenericTokenParser.java
这个类很简单就是处理字符串并返回
package com.framework.betterorm.parsing;
import java.util.ArrayList;
import java.util.List;
/**
* 通用标记解析器
* */
class GenericTokenParser {
/**
* 开始标志
*/
private final String openToken;
/**
* 结束标记
*/
private final String closeToken;
GenericTokenParser(String openToken, String closeToken) {
this.openToken = openToken;
this.closeToken = closeToken;
}
String parser(String text) {
List<String> argList = new ArrayList<>();
if (text == null || text.isEmpty()) {
return "";
}
//从第0位开始,查找开始标记的下标
int start = text.indexOf(openToken, 0);
if (start == -1) {
return text;
}
char[] src = text.toCharArray();
//offset用来记录builder变量读取到哪了
int offset = 0;
//builer是最终返回的字符串
final StringBuilder builder = new StringBuilder();
while (start > -1) {
if (start > 0 && src[start - 1] == '\\') {
//开始是转义的,则去掉转义字符
builder.append(src, offset, start - offset - 1).append(openToken);
offset = start + openToken.length();
} else {
//将开始标记前的字符串都添加到builder
builder.append(src, offset, start - offset).append("?");
//计算新的offset
offset = start + closeToken.length();
//寻找结束标记
int end = text.indexOf(closeToken, offset);
while (end > -1) {
if (end > offset && src[end - 1] == '\\') {
//此结束标记是转义的
offset = end + closeToken.length();
end = text.indexOf(closeToken, offset);
} else {
offset = end + closeToken.length();
break;
}
}
if (end == -1) {
//找不到结束标记了
builder.append(src, start, src.length - start);
offset = src.length;
} else {
offset = end + closeToken.length();
}
start = text.indexOf(openToken, offset);
}
}
// 最后一次未找到开始标记, 则将 offset 后的字符串添加到 builder 中
if (offset < src.length) {
builder.append(src, offset, src.length - offset);
}
return builder.toString();
}
List<String> getParameter(String text){
List<String> argList = new ArrayList<>();
if (text == null || text.isEmpty()) {
return null;
}
//从第0位开始,查找开始标记的下标
int start = text.indexOf(openToken, 0);
if (start == -1) {
return null;
}
char[] src = text.toCharArray();
//offset用来记录builder变量读取到哪了
int offset = 0;
final StringBuilder builder = new StringBuilder();
while (start > -1) {
if (start > 0 && src[start - 1] == '\\') {
//开始是转义的,则去掉转义字符
offset = start + openToken.length();
} else {
//计算新的offset
offset = start + closeToken.length()+1;
int end=text.indexOf(closeToken,offset);
char[] tem=new char[end-offset];
for(int i= offset,j=0;i<end;i++,j++){
tem[j]=src[i];
}
argList.add(String.valueOf(tem));
start = text.indexOf(openToken, offset);
}
}
return argList;
}
}
定义一个操作类,为防止进行实例化,构造函数变为私有的
PropertyParser.java
package com.framework.betterorm.parsing;
import java.util.List;
/**
* 属性解析器
*/
public class PropertyParser {
private PropertyParser() {
// Prevent Instantiation
}
private static GenericTokenParser parser = new GenericTokenParser("#{", "}");
public static String parse(String string) {
return parser.parser(string);
}
public static List<String> getParameter(String string){
return parser.getParameter(string);
}
public static void main(String[] args) {
List<String> stringList=getParameter("select * from user where username=#{userName}");
for (String s:stringList){
System.out.println(s);
}
}
}