@Test
void changeTable() throws JSQLParserException {
String xxx = " AUTO_INCREMENT ";
CreateTable createTable = (CreateTable) CCJSqlParserUtil.parse(" CREATE TABLE `t_student` (\n" +
" `student_id` int(10) unsigned NOT NULL COMMENT '学生id',\n" +
" `student_name` varchar(60) DEFAULT NULL,\n" +
" `student_password` varchar(60) DEFAULT NULL,\n" +
" `student_id_card` varchar(255) DEFAULT NULL,\n" +
" `sex` int(10) DEFAULT '0',\n" +
" `is_deleted` tinyint(1) DEFAULT NULL,\n" +
" `gmt_create` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n" +
" `gmt_modified` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n" +
" PRIMARY KEY (`student_id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 ");
Index index = createTable.getIndexes().get(0);
System.out.println("indexName : "+index.getColumnsNames().get(0));
String indexName = index.getColumnsNames().get(0);
ColumnDefinition df1 = createTable.getColumnDefinitions().stream()
.peek(df12 -> System.out.println(df12.getColumnName()))
.filter(df -> df.getColumnName().equalsIgnoreCase(indexName))
.findFirst().get();
System.out.println(df1.getColumnSpecs());
System.out.println(df1.getColumnName());
System.out.println(df1.getColDataType());
ArrayList spec = new ArrayList<String>();
for (String param: df1.getColumnSpecs()) {
spec.add(param);
if (param.equalsIgnoreCase("null")) {
spec.add(" auto_increment ");
df1.setColumnSpecs(spec);
System.out.println("--------------------------------------------------------");
System.out.println(createTable);
JSqlParse的总体代码量不大,结构也很简单,其项目整体结构图如下:包含表达式相关的类和接口,可以简单看做sql解析后的组成对象之一。如果需要对sql进行一些更改变换,基本都会涉及到这个包。JSqlParse最核心的包,这个包里的类实现了sql的解析,进而我们才可以对解析后的sql(“java类”)做各种自定义处理。虽然这个包是最核心的包,但如果纯粹从使用角度上来说可以不必太在意它,除非我们想深入了解sql解析的过程。
npm i
npm run dev
// 构建支持浏览器环境的代码文件,浏览器端直接引用构建出来的 browser/sql-parser.min.js 文件即可,browser/demo.html 为调用示例
yarn browser
npm run browser
解析结果如下:
"type": "create_table",
"name": "tbl1",
"columns": [
"type": "column",
"name": "id",
最近遇到一个问题,应用层提供的SQL语句中有这样的语句,在MySQL中执行肯定是没问题的,但是后台数据库切换到了HBase,使用apache phoenix 提供的JDBC驱动访问时却报错了,按照phoenix官方的文档,CAST函数是支持,但现实就是报错过不了,应该是我使用的phoenix版本问题,应该是个BUG,暂时无法通过升级版本解决。解决方案也不复杂就是用phoenix的Native函数函数来代替,将替换为。那么问题来了,如果让应用层来替换这事很方便,但是我们希望数据存储对应用层是透明的,应用层不需
intercept:在拦截时,需要执行的业务逻辑
plugin:是否代理Executor、ParameterHandler、ResultSetHandler、StatementHandler对象中的某个或某些,
如果代理,则返回相应对象的代理对象,否则返回原对象。根据类上Intercepts注解决定是否返回代理对象。
setProp
JSqlParser是一个Java库,用于解析SQL语句并生成一个抽象语法树(AST,Abstract Syntax Tree),使得开发者能够在运行时对SQL语句进行解析、修改和分析。它支持多种SQL方言,包括但不限于MySQL、PostgreSQL、Oracle、SQL Server等。
/ 修改姓名 ColDataType varchar = new ColDataType("VARCHAR");AlterExpression . ColumnDataType name = new AlterExpression . ColumnDataType("name" , false , varchar , Collections . singletonList("COMMENT '道号'"));
JSqlParser是一个强大的Java库,用于解析和操作SQL语句。本文将深入探讨JSqlParser的使用方法和功能特性,详细介绍如何利用JSqlParser解析、修改和生成SQL语句。我们将讨论JSqlParser的基本用法、支持的SQL语法和常见应用场景,以及如何结合JSqlParser实现自定义的SQL操作和查询优化。
源码地址 https://github.com/JSQLParser/JSqlParser源码分析ColDataType 列数据类型有2个属性:
String dataType 标识数据类型
List argumentsStringList 类型参数
例如 `user_num` VARCHAR(50) NOT NULL COMMENT '用户编号'
中的 VARCHAR(50) NOT NUL