Java中解析前端传的Sql语句

使用Durid解析

  • 首先将传递来的sql抽象成AST语法树,之后将表名和字段名存储到list集合中。
  • 根据字段名和表名去数据库系统表中查询出对应字段的注释和字段类型。
//mySqlstatementParser为sql语句
	MySqlStatementParser mySqlStatementParser = new MySqlStatementParser(sqlStr);
//使用parpser解析生成的AST,这里sqlStatement是AST,AST为抽象语法树
	SQLStatement sqlStatement = mySqlStatementParser.parseStatement();
	MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
	sqlStatement.accept(visitor);
	Collection<TableStat.Column> columns = visitor.getColumns();

//list是存储表名和字段名的集合
	List<FieldVo> list = new ArrayList<>();
       //通过循环将表名和字段名解析出,并存储到list集合中
       columns.stream().forEach(row->{
           if (row.isSelect()){
               FieldVo fieldVo = new FieldVo();
               fieldVo.setTableName(row.getTable());
               fieldVo.setFieldName(row.getName());
               list.add(fieldVo);
           }
       });
//查询字段类型和字段中文名,
     List<FieldVo> FindAllType = iXxglFieldDefineService.getTableAndField(list);

  • 以pgsql为例到系统表中查询字段类型和字段中文名
<!--查询语句-->
<select id="getTableAndField" resultType="com.xxgl.hjjxxgl.entity.FieldVo" parameterType="java.util.List">
        select cl.relname as tableName ,
        attr.attname as fieldName,
        col_description ( attr.attrelid, attr.attnum ) AS comment,
        concat_ws ( '', ty.typname, SUBSTRING ( format_type ( attr.atttypid, attr.atttypmod ) FROM '\(.*\)' ) ) AS fieldType
        from pg_class cl,
        pg_attribute attr,
        pg_type ty
        where attr.attrelid = cl.oid
        and   attr.atttypid = ty.oid and
        <foreach collection="list" index="index" item="item" open="(" separator="or" close=")">
            ( cl.relname = #{item.tableName} and attr.attname = #{item.fieldName})
        </foreach>
    </select>
  • 解析查询语句中的字段别名(由于获取字段的别名和前面两个不同,这里重新定义了一个list2)
//获取字段别名
     List<FieldVo> list2 = new ArrayList<>();
     List<SQLStatement> stmtList = SQLUtils.parseStatements(String.valueOf(sqlStatement), DbType.mysql);
     SQLStatement stmt = stmtList.get(0);
     List<SQLSelectItem> list1= ((MySqlSelectQueryBlock)((SQLSelect)((SQLSelectStatement)stmt).getSelect()).getQuery()).getSelectList();
        for(SQLSelectItem item : list1){
            FieldVo fieldZo = new FieldVo();
            fieldZo.setJavaName(item.getAlias());
            list2.add(fieldZo);
        }
  • 两个list集合的内容进行合并,最终返回{tableName:表名, fieldName:字段名,comment:字段中文名;fieldType:字段类型}
//合并两个list的内容
      Integer len = FindAllType.size() <= list2.size()?FindAllType.size():list2.size();
      for (int i=0;i<len;i++){
          FieldVo a = FindAllType.get(i);
          FieldVo a1 = list2.get(i);
          a.setJavaName(a1.getJavaName());
      }
	return FindAllType;
  • 补充
  • 将数据中的字段类型转换为Java基本数据类型
//将对应的数据库类型转为Java类型
        FindAllType.forEach(t->{
            t.setJavaType(FieldTypeEnum.getJavaByField(t.getFieldType()));
        });

  • 定义枚举值,将Java类型和字段类型进行匹配
package com.xxgl.hjjxxgl.enums;

public enum FieldTypeEnum {
    INT("int2","Integer"),
    INTS("int4","Long"),
    CAHRS("bpchar","String"),
    CAHR("char","String"),
    DATE("date","Date"),
    VARCHAR("varchar","String"),
    TEXT("text","String");

    private String fieldType;
    private String javaType;

    private FieldTypeEnum(String fieldType, String javaType){
        this.fieldType = fieldType;
        this.javaType = javaType;
    }

    public static String getJavaByField(String fieldType){
        for(FieldTypeEnum typeEnum : FieldTypeEnum.values()){
            if(fieldType != null && fieldType.startsWith(typeEnum.fieldType)){
                return typeEnum.javaType;
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
达内java培训目录 课程 课程内容 课程目标 第一阶段(以Tetris项目贯穿) Java语言基础 算法基础、常用数据结构、企业编程规范。 掌握常见的数据结构和实用算法;培养良好的企业级编程习惯。 Java面向对象 面向对象特性:封装、继承、多态等,面向对象程序设计,基础设计模式等。 掌握面向对象的基本原则以及在编程实践的意义;掌握Java面向对象编程基本实现原理。 实训项目一:Tetris项目开发 第二阶段(以T-DMS V1项目贯穿) JDK核心API 语言核心包、异常处理、常用工具包、集合框架。 熟练掌握JDK核心API编程技术;理解API设计原则;具备熟练的阅读API文档的能力;为后续的课程学习打下坚实的语言基础。 JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;初步具备面向对象设计和编程的能力;掌握基本的JVM优化策略。 实训项目二:T-DMS V1项目开发 第三阶段(以T-DMS V2项目贯穿) SQL语言 SQL语句基础和提高、SQL语句调优。 熟练的掌握SQL语句;掌握一定的数据库查询技巧及SQL语句优化技巧。 Oracle数据库 Oracle体系结构及系统管理、Oracle数据库高级编程、数据库设计基础。 掌握Oracle体系结构及核心编程技术 XML XML语法、XML解析(SAX、DOM)、Dom4j组件、Digester组件。 熟练掌握XML语法规则;理解DOM模型;熟悉Java对XML的各种解析方式。 实训项目三:T-DMS V2项目开发 第四阶段(以T-NetCTOSS电信计费系统贯穿) HTML/CSS TML基本文档结构、掌握CSS基础语法、关于HTML文档块、链接、列表、表格、表单等 掌握HTML基本原理;掌握CSS各种选择器及常见样式设置;熟练使用HTML常用元素。 JavaScript核心 JavaScript语言基础(数据类型、函数、对象、闭包)、Java DOM编程、事件模型、JavaScript面向对象编程。 深入理解JavaScript语言原理;熟练的使用JavaScript对HTML DOM进行编程;熟练掌握JavaScript对象对象封装技巧,为后续的JavaScript学习打下坚实的基础。 Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计模式。 透彻理解Servlet核心原理;熟练掌握Servlet API;透彻理解JSP引擎工作原理;透彻理解标记库原理;熟悉常见的Java Web设计模式;为后续的Java Web开发打下坚实的理论基础。 Ajax Ajax基础、XHR对象、Ajax设计模式、JSON技术。 掌握Ajax的基本通信原理;掌握基于XML和JSON的Ajax数据规则。 Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上和下载、防止重复提交等)。 熟练掌握Struts2核心要件,特别是Interceptor和Result;掌握基于模板技术的Struts2 UI组件;掌握基于Ognl的数据共享方式、掌握Struts2各种定制及扩展方式;熟练掌握基于Struts2的Web开发技巧。 实训项目四:T-NetCTOSS电信计费系统项目开发 第五阶段(以"航空订票"真SS实电项信目计为费贯系穿统项贯目穿) 企业应用开发部署环境 Linux高级命令集脚本编程、远程登录、Ant、单元测试技术、Maven构建技术、SVN应用技术。 熟练掌握基于Linux系统的操作技能;可以熟练的完成应用的部署工作;可以熟练的使用开发部署工具。 Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上和下载、防止重复提交等)。 熟练掌握Struts2核心要件,特别是Interceptor和Result;掌握基于模板技术的Struts2 UI组件;掌握基于Ognl的数据共享方式、掌握Struts2各种定制及扩展方式;熟练掌握基于Struts2的Web开发技巧。 持久层框架技术 ORM概念、Hibernate核心API、Hibernate实体映射技术、Hibernate关系映射技巧、HQL查询、OSCache及Hibernate缓存技术; 掌握JQuery核心API;了解JQuery基本设计原则;了解多种JQuery插件;掌握DWR的基本原理及应用技巧。 Spring技术 Spring Ioc基础、Ioc注入技巧、对象高级装配(自动装配、模板装配、组件扫描特性、FactoryBean、对象生命周期)、Spring AOP原理、AspectJ、Spring JDBC支持、Spring事务及安全管理;Spring整合Hibernate、Spring整合Struts,SpringMVC技术。 深入理解Ioc和AOP的基本原理和实现方式;熟练掌握SpringIoc及AOP实现方式;熟练掌握Spring事务管理;熟练掌握Spring与其他组件的整合技术。• 实训项目五:企业级应用"航空订票"系统开发 1.开班前 5天训练营将完成"捕鱼达人"游戏项目 2.开班 2周内,贯穿着 Java 语言基础及 Java 面向对象的学习,学员将完成专业版的俄罗斯方块项目 3. 开班一个半月内,贯穿 JavaSE及数据库的学习将完成 T-DMS 数据 采集系统项目 • 整个系统由 DMS 采集端、DMS 服务器端和 NetCTOSS 服务器端三部分组成。 • DMS 采集端的主要任务是采集、解析、匹配和保存并发送登录数据。 • DMS采集端程序采集、解析获得数据后,将处理好的数据发送到DMS 服务器端。 • DMS 服务器端接收到日志数据,将日志数据备份保存为文件数据,并存入数据库。 4.开班3个月内,贯穿Web前端技术和Servlet/JSP的学习,将完成T-NetCTOSS项目: NetCTOSS系统的主要任务是提供对于数据的计费查询和管理功能。 5.开班4个月内,学员将完成"航空订票"真实项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Youngk-01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值