依赖

名称: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语句相关推荐

  1. Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

    昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...

  2. Druid拦截sql语句,实现在添加一个查询条件

    Druid拦截sql语句,实现在添加一个查询条件 这里就不详细描述原理了. 首先需要重写一下FilterEventAdapter里的connection_prepareStatement方法,然后对s ...

  3. java sql绑定_在JAVA 源程序中编写SQL语句时使用ORACLE 绑定变量

    在Java中,结合使用setXXX 系列方法,可以为不同数据类型的绑定变量进行赋值,从而大大优化了SQL 语句的性能. 没有使用绑定变量是使用Oracle数据库的应用系统性能问题主要原因和可伸缩性的主 ...

  4. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  5. java sql范围查询语句,java类中写sql语句,查询条件包含换行

    java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...

  6. java mysql查询字段换行,java类中写sql语句,查询条件包含换行

    java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...

  7. 使用Druid解析SQL实现血缘关系计算,获取sql执行语句、表名、字段等信息

    项目中使用的MybatisPlus,要做一个基于Elastic的日志查看功能,需要统计sql相关信息. 定义一个ExecuteSqlPrintInnerInterceptor,继承 InnerInte ...

  8. java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式

    在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...

  9. c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?

    最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...

最新文章

  1. 【译】Why Decentralized AI Matters Part III: Technologies
  2. LiveVideoStack 2022迎春招聘
  3. C++等级考试知识点总结
  4. nginx php iconv,Nginx +PHP部署一
  5. 一元线性回归Python实现
  6. OpenProj打开不了或者提示Failed to load Java VM Library的错误的解决方案
  7. matlab生成范德蒙矩阵
  8. 中期答辩记录与总结反思
  9. 独立游戏开发入门的 6 个步骤
  10. csdn博客文章设置为隐私模式发布之后看不到的问题
  11. 怎么打印加密的PDF文件?
  12. 【Introduction to Artificial Intelligence and Data Analytics】(TBC)
  13. 情境领导者-第二章、领导风格
  14. Android OpenGL ES 画球体
  15. 第一章 openEuler 安装指南
  16. 如何实现内网映射到公网?
  17. 【lssvm预测模型】基于蝙蝠算法改进的最小二乘支持向量机lssvm预测
  18. 系统架构设计——秒杀系统架构设计
  19. 可替换商业软件的开源免费软件集总
  20. 腾讯云TcaplusDB|“老人节”请多给老人多一些关爱

热门文章

  1. CDR2023新版本安装下载教程
  2. Linux 命令(256)—— stty 命令
  3. 线性表,线性表和链表的区别
  4. Android电池健康,Android电池的健康状况如何确定?
  5. 简易两位二进制乘法器设计
  6. 【人工智能行业大师访谈6】吴恩达采访 Andrej Karpathy
  7. 深度学习讲座笔记:Deep Learning for Computer Vision - Andrej Karpathy at Bay Area Deep Learning School
  8. 语音识别芯片模块LD3320到底甩了新唐ISD9160几条街
  9. arch linux简体中文,Arch Linux Archive (简体中文)
  10. linux下%3e和%3e%3e的区别,华为Nova3e和Nova2s哪个好?华为Nova2s与3e区别对比