Java使用Druid解析SQL语句
依赖
名称:com.alibaba.druid
版本:1.1.16
SQL语句解析
以SQLServer为例,解析插入语句和更新语句,并提取对应的数据
/*** @Author li.dongquan* @Description: SQLServer解析* @Date 2020/10/16*/
public class SqlServerParser {/*** 解析sql语句** @param statement* @return*/public void parse(String statement) {// 使用druid解析语句// 第一个参数为SQL语句// 第二个参数为解析的数据库类型List<SQLStatement> statementList = SQLUtils.parseStatements(statement, JdbcConstants.SQL_SERVER);// 单语句解析,只有一条数据if (!statement.isEmpty()) {SQLStatement sqlStatement = statementList.get(0);// 插入语句解析if (sqlStatement instanceof SQLServerInsertStatement) {// 转换SQLServerInsertStatement insertStatement = (SQLServerInsertStatement) sqlStatement;// 获取列名List<SQLExpr> columns = insertStatement.getColumns();List<String> columnsName = new ArrayList<>(columns.size());for (SQLExpr column : columns) {columnsName.add(((SQLIdentifierExpr) column).getName());}System.out.println(columnsName);// 获取值List<SQLInsertStatement.ValuesClause> valuesList = insertStatement.getValuesList();List<List<Object>> dataList = new ArrayList<>();for (SQLInsertStatement.ValuesClause valuesClause : valuesList) {List<SQLExpr> values = valuesClause.getValues();List<Object> data = new ArrayList<>(columnsName.size());for (SQLExpr value : values) {data.add(getValue(value));}dataList.add(data);}System.out.println(dataList);// 获取表名System.out.println(insertStatement.getTableName().getSimpleName());} else if (sqlStatement instanceof SQLServerUpdateStatement) {// 更新语句解析SQLServerUpdateStatement updateStatement = (SQLServerUpdateStatement) sqlStatement;// 获取更新的值和内容List<SQLUpdateSetItem> items = updateStatement.getItems();Map<String, Object> updateMap = new HashMap<>(items.size());for (SQLUpdateSetItem item : items) {updateMap.put(((SQLIdentifierExpr) item.getColumn()).getName(), getValue(item.getValue()));}System.out.println(updateMap);// 获取条件,条件比较复杂,需根据实际情况自行提取SQLBinaryOpExpr where = (SQLBinaryOpExpr) updateStatement.getWhere();System.out.println(where);// 获取表名System.out.println(updateStatement.getTableName().getSimpleName());}}return null;}private static Object getValue(SQLExpr value) {// TODO 判断更多的种类if (value instanceof SQLIntegerExpr) {// 值是数字return ((SQLIntegerExpr) value).getNumber();} else if (value instanceof SQLCharExpr) {// 值是字符串return ((SQLCharExpr) value).getText();}return null;}public static void main(String[] args) throws Exception {SqlServerParser sqlServerParser = new SqlServerParser();sqlServerParser.parse("update test set status='P' where id=20");sqlServerParser.parse("insert into test (id,status,name,ce,acc) values (29,'P','lll','sxsx','Arferwg')");}
}
函数解析
SQLUtils.parseStatements(statement, JdbcConstants.SQL_SERVER);
第一个参数为SQL语句
第二个参数为解析的数据库类型,druid支持多种输数据库类型,只需修改数据库类型即可解析不同的SQL语句
sqlStatement instanceof SQLServerInsertStatement
如果是其他数据库强制转换类型也需要发生改变,例如MYSQL,则使用MySqlInsertStatement
Java使用Druid解析SQL语句相关推荐
- Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?
昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...
- Druid拦截sql语句,实现在添加一个查询条件
Druid拦截sql语句,实现在添加一个查询条件 这里就不详细描述原理了. 首先需要重写一下FilterEventAdapter里的connection_prepareStatement方法,然后对s ...
- java sql绑定_在JAVA 源程序中编写SQL语句时使用ORACLE 绑定变量
在Java中,结合使用setXXX 系列方法,可以为不同数据类型的绑定变量进行赋值,从而大大优化了SQL 语句的性能. 没有使用绑定变量是使用Oracle数据库的应用系统性能问题主要原因和可伸缩性的主 ...
- java数据库编程——执行SQL 语句
[0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...
- java sql范围查询语句,java类中写sql语句,查询条件包含换行
java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...
- java mysql查询字段换行,java类中写sql语句,查询条件包含换行
java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...
- 使用Druid解析SQL实现血缘关系计算,获取sql执行语句、表名、字段等信息
项目中使用的MybatisPlus,要做一个基于Elastic的日志查看功能,需要统计sql相关信息. 定义一个ExecuteSqlPrintInnerInterceptor,继承 InnerInte ...
- java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式
在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...
- c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...
最新文章
- 【译】Why Decentralized AI Matters Part III: Technologies
- LiveVideoStack 2022迎春招聘
- C++等级考试知识点总结
- nginx php iconv,Nginx +PHP部署一
- 一元线性回归Python实现
- OpenProj打开不了或者提示Failed to load Java VM Library的错误的解决方案
- matlab生成范德蒙矩阵
- 中期答辩记录与总结反思
- 独立游戏开发入门的 6 个步骤
- csdn博客文章设置为隐私模式发布之后看不到的问题
- 怎么打印加密的PDF文件?
- 【Introduction to Artificial Intelligence and Data Analytics】(TBC)
- 情境领导者-第二章、领导风格
- Android OpenGL ES 画球体
- 第一章 openEuler 安装指南
- 如何实现内网映射到公网?
- 【lssvm预测模型】基于蝙蝠算法改进的最小二乘支持向量机lssvm预测
- 系统架构设计——秒杀系统架构设计
- 可替换商业软件的开源免费软件集总
- 腾讯云TcaplusDB|“老人节”请多给老人多一些关爱
热门文章
- CDR2023新版本安装下载教程
- Linux 命令(256)—— stty 命令
- 线性表,线性表和链表的区别
- Android电池健康,Android电池的健康状况如何确定?
- 简易两位二进制乘法器设计
- 【人工智能行业大师访谈6】吴恩达采访 Andrej Karpathy
- 深度学习讲座笔记:Deep Learning for Computer Vision - Andrej Karpathy at Bay Area Deep Learning School
- 语音识别芯片模块LD3320到底甩了新唐ISD9160几条街
- arch linux简体中文,Arch Linux Archive (简体中文)
- linux下%3e和%3e%3e的区别,华为Nova3e和Nova2s哪个好?华为Nova2s与3e区别对比