Java实现sql解析器 JSQLParser
前言
JSQLParser是基于JavaCC构建的sql语句解析器。它以可遍历的Java类层次结构来转换SQL。而且它不仅限于一个数据库,而且还支持 Oracle, SqlServer, MySQL, PostgreSQL等许多数据库。另外 自 5.0 版本起,JSQLParser 依赖于 Java 11。所以我们需要根据项目依赖环境选取对应的版本。
使用场景
在面对一些内网环境的项目,我们无法访问数据库的情况下,需要快速查一些客户需要的信息时,我们可以在项目中集成JSQLParser 只需要调用接口,就可以可前端配合将数据展示在页面上了。
各种RDBMS 不支持的语法
JSQLParser是一款与关系型数据库(RDBMS) 无关的解析器,专注于符合SQL:2016标准的查询以及“四大数据库”(Oracle,MS SQL Server, Postgres, Mysql/MariaDB)。需要编写可移植且符合标准的SQL。
1.不支持Oracel PL/SQL 块
DECLARE
num NUMBER;
BEGIN
num := 10;
dbms_output.put_line(‘The number is ‘ || num);
END;
- Oracle INSERT ALL…不受支持
- INSERT ALL
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;
1.添加依赖(如果我们项目中引入了 mybatis-plus 就不需要添加该依赖了)
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>5.1</version>
</dependency>
2.代码实现
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
CCJSqlParserManager ccjSqlParserManager = new CCJSqlParserManager();
Statement parse =null;
try{
parse = ccjSqlParserManager.parse(new StringReader(dto.getSql()));
} catch (Exception e) {
log.error(“SQL执行错误:{}”, e.getMessage());
// return e.getMessage();
}
try {
ExecutionSqlVO vo = new ExecutionSqlVO();
if (parse instanceof Select) {
List<Map<String, Object>> maps = SqlRunner.db().selectList(dto.getSql());
Map<String, Object> sqlData = new HashMap<>();
sqlData.put(“head”, CollUtil.isEmpty(maps)? Lists.newArrayList():maps.get(0).keySet());
sqlData.put(“data”, maps);
vo.setResult(sqlData);
vo.setType(Select.class.getSimpleName());
} else if (parse instanceof Update) {
Update updateSql = (Update) parse;
Expression where = updateSql.getWhere();
if (where == null) {
throw new ServiceException(“禁止执行没有条件的SQL”);
}
boolean update = SqlRunner.db().update(dto.getSql());
if(!update){
vo.setResult(“执行失败”);
}else {
vo.setResult(“执行成功”);
}
vo.setType(Update.class.getSimpleName());
return vo;
} else if (parse instanceof Insert) {
boolean insert = SqlRunner.db().insert(dto.getSql());
if(!insert){
vo.setResult(“执行失败”);
}else {
vo.setResult(“执行成功”);
}
vo.setType(Insert.class.getSimpleName());
} else if (parse instanceof Delete) {
Delete deleteSql = (Delete) parse;
Expression where = deleteSql.getWhere();
if (where == null) {
throw new ServiceException(“禁止执行没有条件的SQL”);
}
boolean delete = SqlRunner.db().delete(dto.getSql());
if(!delete){
vo.setResult(“执行失败”);
}else {
vo.setResult(“执行成功”);
}
vo.setType(Delete.class.getSimpleName());
} else if (parse instanceof CreateTable) {
jdbcTemplate.execute(dto.getSql());
vo.setResult(String.format(“执行成功”));
vo.setType(Delete.class.getSimpleName());
} else {
throw new ServiceException(“不支持的SQL类型”);
}
return vo;
} catch (Exception se) {
// return se.getMessage();
}
return null;
}
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » Java实现sql解析器 JSQLParser