Skip to content

Commit 49f6db2

Browse files
committed
修改代码
1 parent 4858310 commit 49f6db2

File tree

3 files changed

+50
-14
lines changed

3 files changed

+50
-14
lines changed

README.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,28 @@
1-
基于jsqlparser 进行sql语句解析,得到字段间的血缘关系
1+
基于jsqlparser 进行sql语句解析,得到字段间的血缘关系
2+
==
3+
4+
工具说明:
5+
-
6+
1、本工具只解析select语句
7+
2、支持子查询
8+
3、支持常用数据库的常用函数,如concat、case when、nvl、isnull、cast、ifnull等等
9+
4、工具可能对某些sql无法解析,有待完善
10+
11+
12+
注意事项
13+
-
14+
1、在调用方法前请确保sql的准确性,本工具只做了简单的判断
15+
2、当多表查询时,请给表和字段附上相应别名,如若没有,可能会对结果产生影响
16+
17+
事例
18+
-
19+
参考测试类 test()
20+
21+
参考网址
22+
-
23+
https://github.com/JSQLParser/JSqlParser
24+
https://gitee.com/zzyijia/jsqlparser
25+
26+
27+
28+

src/main/java/com/luop/SelectParseHelper.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,22 @@
99
import java.util.Set;
1010

1111
/**
12-
* SQL解析帮助类
13-
* 约束:
14-
* 仅支持SELECT语句的解析
15-
* 查询字段不可以为*
16-
* 表必须要使用别名,查询字段必须使用表的别名(例:select t.id,t.address from userinfo t)
17-
* 说明:
18-
* 该方法的使用场景:控制用户不要越权访问表或者表的字段
19-
* 出于上述使用场景,SQL解析时只关心where之前的部分,包括子查询语句。解析结果返回所有查询涉及到的表和查询的字段。
20-
* SQL解析利用开源的JSQLParser来实现,参考网址:https://github.com/JSQLParser/JSqlParser
12+
* SQL解析利用开源的JSQLParser来实现,参考网址:https://github.com/JSQLParser/JSqlParser
2113
*
22-
* @author "朱云山"
14+
* @Author: luoping
15+
* @Date: 2019/11/5 09:50
16+
* @Description:
2317
*
2418
*/
2519
class SelectParseHelper {
2620
/**
27-
* 获取SQL语句中用到的所有表和查询字段名称(名称均为大写)
28-
*
21+
* 获取血缘关系结果
2922
* @param sqltxt 要解析的SQL语句
3023
* @return
3124
* @throws Exception
3225
*/
33-
public static Map<String,Set<String>> getTableAndColumns(String sqltxt) throws Exception{
26+
static Map<String,Set<String>> getBloodRelationResult(String sqltxt) throws Exception{
27+
//第三方插件解析sql
3428
Statement stmt = CCJSqlParserUtil.parse(sqltxt); //报错 说明sql语句错误
3529
Select selectStatement=(Select)stmt;
3630

src/test/java/com/luop/SqlAnalysisApplicationTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,26 @@
33
import org.junit.jupiter.api.Test;
44
import org.springframework.boot.test.context.SpringBootTest;
55

6+
import java.util.Map;
7+
import java.util.Set;
8+
69
@SpringBootTest
710
class SqlAnalysisApplicationTests {
811

912
@Test
1013
void contextLoads() {
1114
}
1215

16+
@Test
17+
void test(){
18+
String sql = "select u.name userName,u.id,d.name depName,d.id depId " +
19+
"from user u left join department d on u.depId = d.id where u.id = 1";
20+
try {
21+
Map<String, Set<String>> map = SelectParseHelper.getBloodRelationResult(sql);
22+
System.out.println(map); //{depId=[department.id], userName=[user.name], userId=[user.id], depName=[department.name]}
23+
} catch (Exception e) {
24+
e.printStackTrace();
25+
}
26+
}
27+
1328
}

0 commit comments

Comments
 (0)