解析Java源码文件中所有sql操作(下)

接着上篇解析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 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 PARAM_TABLE_NAME_MAP = new HashMap<>();

至此,这就是Java文件的解析,由于时间问题,没有怎么去深入处理。而且单纯靠正则表达式,感觉应该有更好更高端的方法来做文字解析的。

你可能感兴趣的:(学习杂烩)