接着上篇解析Xml文件的文章,讲下Java文件的处理思路。
2.2 对于Java文件
2.2.1 针对jdbc的操作
jdbc是在源码上直接写sql语句,类似于下图:
public class JdbcDemo {
private static final String SQL_SELECT = ""
+ " SELECT *"
+ " FROM table"
+ " WHERE a = b";
private static final String SQL_ADD = ""
+ " INSERT INTO table "
+ " VALUES(?, ?)";
}
其实这种跟上篇2.1解析xml文件的思路很类型,select操作用开始结束索引算法,update、insert、delete操作用正则表达式来匹配,就可以得到表名了。
2.2.2 对于注解类型的
比如在mapper接口类上使用@Select注解
@Select("select * from table where a = b;")
List<String> findById();
可以先用正则表达式,匹配出@Select括号里面的字符串,再使用开始结束索引算法来解析。
String JAVA_SEL_ANNOTATION = "@Select[(][\"](.*?)[\"][)]";
其他注解比如@Update、@Delete,应该思路也是差不多的。
2.2.3 对于使用SQL()方法的
private final static String TABLE_NAME = "table";
public static String getById() {
return new SQL()
.SELECT("pam1, pam2")
.FROM(TABLE_NAME)
.WHERE("a = b")
.toString();
}
如法炮制,先用正则表达式匹配出.FROM括号里面的字符串,比如tableStr
String JAVA_SQL_FUN_SELETE = ".FROM[(](\\w*\\.*\\w*)[)]";
但这里有点特殊,拿到的字符串tableStr可能不是真正的表名,而是用变量TABLE_NAME表示。通过判断该字符串是不是双引号开始,如果是,表示是真正的表名,如果不是,还得重新解析一下整个文件,获取该变量TABLE_NAME对应的参数值。
此时,又要根据tableStr,去匹配真正的表名,正则表达式需要拼接一下:
// 需要解析的字符串
String TABLE_NAME = "table";
// 左前缀
String JAVA_SQL_TABLE_NAME_LEFT = "String( )*";
// 右前缀
String JAVA_SQL_TABLE_NAME_RIGHT = "( )*=( )*\\\"(\\w*\\.*\\w*)\\\"";
// 拼接正则表达式
String parrernStr = JAVA_SQL_TABLE_NAME_LEFT + tableStr + JAVA_SQL_TABLE_NAME_RIGHT;
然后通过matcher.groud(4).trim()来拿到真正的表名。
另外,由于一个java文件里可能会多出用到这个TABLE_NAME变量,所以可以用一个map来维护变量名与表名的映射,避免重复扫描。
private static final Map<String, String> PARAM_TABLE_NAME_MAP = new HashMap<>();
至此,这就是Java文件的解析,由于时间问题,没有怎么去深入处理。而且单纯靠正则表达式,感觉应该有更好更高端的方法来做文字解析的。