SQL解析利器JSqlParser 每日播报
(相关资料图)
JSqlParser是一个与RDBMS无关的SQL语句解析器,支持多种方言,例如Oracle、SQL Server、MySQL、MariaDB、PostgreSQL、H2等。
JSqlParser将SQL语句转换为Java类的可遍历层次结构,还可以用于通过API从Java代码创建SQL语句。现在普遍使用的mybatis-plus以及分页插件PageHelper都是借助JSqlParser实现SQL解析的。
JSqlParser源码主要包括以下几类对象:
expression:SQL构建相关类,比如Function、EqualsTo、AndExpression、InExpression等表达式用于构建SQL。parser:SQL解析相关类,比如CCJSqlParserUtil、CCJSqlParserManager、抽象语法树对象等。schema:主要存放数据库schema相关的类 ,比如Database、Table、Column等。statement:封装了数据库操作对象,create、insert、delete、select、drop、alter、truncate等。util:各种工具类、不同DB版本、SQL标准等处理类,如SelectUtils、DatabaseType等。解析SQL
对于下列SQL语句:
转换为Java对象层次结构为:
解析SQL代码实例:
public static void parseSQL() { //Select语句样本 String sql1 = "select t1.f1,t1.f2,t2.id,count(*) from table1 t1 left join table2 t2 right join (select * from table3) t3 where t1.id="10" or (t1.id between 1 and 3 and t1.id>"12") group by t.f1 order by t.f1 desc,tf2 asc limit 1,20"; //Insert语句样本 String sql2 = "insert into table(f1,f2) values (1,2)"; //Create语句样本 String sql3 = "CREATE TABLE `sys_user` (\n" + " `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT "编号",\n" + " `name` varchar(200) DEFAULT "" COMMENT "名称",\n" + " `age` tinyint(4) DEFAULT NULL COMMENT "年龄",\n" + " `create_by` varchar(64) DEFAULT "" COMMENT "创建者",\n" + " `create_time` datetime DEFAULT NULL COMMENT "创建时间",\n" + " `update_by` varchar(64) DEFAULT "" COMMENT "更新者",\n" + " `update_time` datetime DEFAULT NULL COMMENT "更新时间",\n" + " `remark` varchar(500) DEFAULT NULL COMMENT "备注",\n" + " PRIMARY KEY (`id`)\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="用户表";"; try { //处理Select语句 Select select = (Select) CCJSqlParserUtil.parse(sql1); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List<String> tableList = tablesNamesFinder.getTableList(select); // 获取到查询sql中的所有表名 System.out.println("表名:" + tableList); //处理Insert语句 Insert insert = (Insert) CCJSqlParserUtil.parse(sql2); System.out.println("插入的表" + insert.getTable()); System.out.println("插入的列" + insert.getColumns()); System.out.println("插入的值" + insert.getItemsList()); //处理Create Table语句 Statement statement = CCJSqlParserUtil.parse(sql3); if (statement instanceof CreateTable) { CreateTable createTable = ((CreateTable) statement); Table table = createTable.getTable(); //通过columnDefinition进而可以获取列名、数据类型等 List<ColumnDefinition> columnDefinitions = createTable.getColumnDefinitions(); System.out.println(table); System.out.println(columnDefinitions); } } catch (Exception e) { e.printStackTrace(); }}
输出如下:
表名:[table1, table2, table3]插入的表table插入的列[f1, f2]插入的值(1, 2)`sys_user`[`id` bigint (20) NOT NULL AUTO_INCREMENT COMMENT "编号", `username` varchar (200) DEFAULT "" COMMENT "名称", `age` tinyint (4) DEFAULT NULL COMMENT "年龄", `create_by` varchar (64) DEFAULT "" COMMENT "创建者", `create_time` datetime DEFAULT NULL COMMENT "创建时间", `update_by` varchar (64) DEFAULT "" COMMENT "更新者", `update_time` datetime DEFAULT NULL COMMENT "更新时间", `remark` varchar (500) DEFAULT NULL COMMENT "备注"]
创建SQL
/** * 创建SQL查询语句 * * @throws JSQLParserException */public static void createSQL() throws JSQLParserException { // 单表全量 Table table = new Table("sys_user"); //查询所有列 Select select = SelectUtils.buildSelectFromTable(table); // SELECT * FROM sys_user System.out.println(select); // 指定列查询 Select buildSelectFromTableAndExpressions = SelectUtils.buildSelectFromTableAndExpressions(new Table("test"), new Column("col1"), new Column("col2")); // SELECT col1, col2 FROM sys_user System.out.println(buildSelectFromTableAndExpressions); // WHERE = EqualsTo equalsTo = new EqualsTo(); // 等于表达式 // 设置表达式左边值 equalsTo.setLeftExpression(new Column(table, "user_id")); // 设置表达式右边值 equalsTo.setRightExpression(new StringValue("123456")); // 转换为更细化的Select对象 PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); plainSelect.setWhere(equalsTo); // SELECT * FROM sys_user WHERE sys_user.user_id = "123456" System.out.println(plainSelect); // WHERE != <> NotEqualsTo notEqualsTo = new NotEqualsTo(); notEqualsTo.setLeftExpression(new Column(table, "user_id")); // 设置表达式左边值 notEqualsTo.setRightExpression(new StringValue("123456"));// 设置表达式右边值 PlainSelect plainSelectNot = (PlainSelect) select.getSelectBody(); plainSelectNot.setWhere(notEqualsTo); System.out.println(plainSelectNot);// SELECT * FROM sys_user WHERE sys_user.user_id <> "123456" // 其他运算符, 参考上面代码添加表达式即可 GreaterThan gt = new GreaterThan(); // ">" GreaterThanEquals geq = new GreaterThanEquals(); // ">=" MinorThan mt = new MinorThan(); // "<" MinorThanEquals leq = new MinorThanEquals();// "<=" IsNullExpression isNull = new IsNullExpression(); // "is null" isNull.setNot(true);// "is not null" LikeExpression nlike = new LikeExpression(); nlike.setNot(true); // "not like" Between bt = new Between(); bt.setNot(true);// "not between" // WHERE LIKE LikeExpression likeExpression = new LikeExpression(); // 创建Like表达式对象 likeExpression.setLeftExpression(new Column("username")); // 表达式左边 likeExpression.setRightExpression(new StringValue("张%")); // 右边表达式 PlainSelect plainSelectLike = (PlainSelect) select.getSelectBody(); plainSelectLike.setWhere(likeExpression); System.out.println(plainSelectLike); // SELECT * FROM sys_user WHERE username LIKE "张%" // WHERE IN Set<String> deptIds = Sets.newLinkedHashSet(); // 创建IN范围的元素集合 deptIds.add("0001"); deptIds.add("0002"); ItemsList itemsList = new ExpressionList(deptIds.stream().map(StringValue::new).collect(Collectors.toList())); // 把集合转变为JSQLParser需要的元素列表 InExpression inExpression = new InExpression(new Column("dept_id "), itemsList); // 创建IN表达式对象,传入列名及IN范围列表 PlainSelect plainSelectIn = (PlainSelect) select.getSelectBody(); plainSelectIn.setWhere(inExpression); System.out.println(plainSelectIn); // SELECT * FROM sys_user WHERE dept_id IN ("0001", "0002") // WHERE BETWEEN AND Between between = new Between(); between.setBetweenExpressionStart(new LongValue(18)); // 设置起点值 between.setBetweenExpressionEnd(new LongValue(30)); // 设置终点值 between.setLeftExpression(new Column("age")); // 设置左边的表达式,一般为列 PlainSelect plainSelectBetween = (PlainSelect) select.getSelectBody(); plainSelectBetween.setWhere(between); System.out.println(plainSelectBetween); // SELECT * FROM sys_user WHERE age BETWEEN 18 AND 30 // WHERE AND 多个条件结合,都需要成立 AndExpression andExpression = new AndExpression(); // AND 表达式 andExpression.setLeftExpression(equalsTo); // AND 左边表达式 andExpression.setRightExpression(between); // AND 右边表达式 PlainSelect plainSelectAnd = (PlainSelect) select.getSelectBody(); plainSelectAnd.setWhere(andExpression); System.out.println(plainSelectAnd); // SELECT * FROM sys_user WHERE sys_user.user_id = "123456" AND age BETWEEN 18 AND 30 // WHERE OR 多个条件满足一个条件成立返回 OrExpression orExpression = new OrExpression();// OR 表达式 orExpression.setLeftExpression(equalsTo); // OR 左边表达式 orExpression.setRightExpression(between); // OR 右边表达式 PlainSelect plainSelectOr = (PlainSelect) select.getSelectBody(); plainSelectOr.setWhere(orExpression); System.out.println(plainSelectOr); // SELECT * FROM sys_user WHERE sys_user.user_id = "123456" OR age BETWEEN 18 AND 30 // ORDER BY 排序 OrderByElement orderByElement = new OrderByElement(); // 创建排序对象 orderByElement.isAsc(); // 设置升序排列 从小到大 orderByElement.setExpression(new Column("col01")); // 设置排序字段 PlainSelect plainSelectOrderBy = (PlainSelect) select.getSelectBody(); plainSelectOrderBy.addOrderByElements(orderByElement); // SELECT * FROM sys_user WHERE sys_user.user_id = "123456" OR age BETWEEN 18 AND 30 ORDER BY col01 System.out.println(plainSelectOrderBy); }
输出如下:
SELECT * FROM sys_userSELECT col1, col2 FROM sys_userSELECT * FROM sys_user WHERE sys_user.user_id = "123456"SELECT * FROM sys_user WHERE sys_user.user_id <> "123456"SELECT * FROM sys_user WHERE username LIKE "张%"SELECT * FROM sys_user WHERE dept_id IN ("0001", "0002")SELECT * FROM sys_user WHERE age BETWEEN 18 AND 30SELECT * FROM sys_user WHERE sys_user.user_id = "123456" AND age BETWEEN 18 AND 30SELECT * FROM sys_user WHERE sys_user.user_id = "123456" OR age BETWEEN 18 AND 30SELECT * FROM sys_user WHERE sys_user.user_id = "123456" OR age BETWEEN 18 AND 30 ORDER BY col01
标签:
-
2023-05-03 07:02:37
SQL解析利器JSqlParser 每日播报<
JSqlParser是一个与RDBMS无关的SQL语句解析器,支持多种方言,例如Oracle、SQLServer、MySQL、MariaDB、
-
2023-05-03 05:51:39
【时快讯】与虎牙四美联袂直播,小超梦被迫试玩无畏契约?直言:给得太多<
电竞游戏一直是年轻人追逐的梦想,在这个虚拟的世界里,我们可以成为不同的英雄,挑战各种不同的敌人,享受
-
2023-05-03 04:02:39
降声一片的车市,特斯拉却突然宣布涨价,意欲何为? 环球速递<
2023年国内车市,可谓是“降”字光头。选是特斯拉在1月宣布价格下调。准确的说,是大幅的下调,让特斯拉售
-
2023-05-03 00:52:10
rc管是什么管子_rc管是什么管<
1、SC管、MT、TC管、KBG,JDG都是什么管sc:焊接钢管tc:电线管薄钢管pc:硬质塑料管ct:电缆桥架cp:金
-
2023-05-03 01:03:15
热门看点:云南隆阳5.2级地震导致乡镇卫生院受损<
云南隆阳5 2级地震导致乡镇卫生院受损---总台记者从多方证实,云南省隆阳区5 2级地震及后续余震,已导致瓦
-
2023-05-03 07:02:37
SQL解析利器JSqlParser 每日播报
JSqlParser是一个与RDBMS无关的SQL语句解析器,支持多种方言,例如Oracle、SQLServer、MySQL、MariaDB、
-
2023-05-03 05:51:39
【时快讯】与虎牙四美联袂直播,小超梦被迫试玩无畏契约?直言:给得太多
电竞游戏一直是年轻人追逐的梦想,在这个虚拟的世界里,我们可以成为不同的英雄,挑战各种不同的敌人,享受
-
2023-05-03 04:02:39
降声一片的车市,特斯拉却突然宣布涨价,意欲何为? 环球速递
2023年国内车市,可谓是“降”字光头。选是特斯拉在1月宣布价格下调。准确的说,是大幅的下调,让特斯拉售
-
2023-05-03 00:52:10
rc管是什么管子_rc管是什么管
1、SC管、MT、TC管、KBG,JDG都是什么管sc:焊接钢管tc:电线管薄钢管pc:硬质塑料管ct:电缆桥架cp:金
-
2023-05-03 01:03:15
热门看点:云南隆阳5.2级地震导致乡镇卫生院受损
云南隆阳5 2级地震导致乡镇卫生院受损---总台记者从多方证实,云南省隆阳区5 2级地震及后续余震,已导致瓦
-
2023-05-02 22:21:48
有一种叫云南的生活|万人篝火狂欢、万人捉神鱼、千对双胞大巡游……普洱“五一”精彩纷呈_新动态
编者按3月7日,全国人大代表、云南省委书记王宁通过人民网致信网友,欢迎大家来体验“有一种叫云南的生活”
-
2023-05-02 20:54:43
我国建起世界最大全民医疗保障网 “天价药”平均降价超50% 热讯
截至2022年底,我国参保覆盖面稳定在95%以上。经过多年努力,我国已经建起世界最大的全民医疗保障网。在这
-
2023-05-02 20:10:19
社区干部“五一”躲民宿喝酒划拳 被纪委监委检查组抓现行
“社区办公楼连个人影都没有,大门还紧锁着,值班人员都去哪儿了?”4月29日,“五一”假期第一天,江苏省
-
2023-05-02 19:09:35
快来了解下!下周2只新债上市(5月8日至5月12日)-焦点速讯
快来了解下!下周2只新债上市(5月8日至5月12日),下周,共有2只新债上市,为海能实业可转债海能转债、蓝晓
-
2023-05-02 17:49:57
韩美所谓“延伸威慑”刺激地区局势紧张|世界速读
据央视新闻报导,连日来韩美首脑会晤、韩美加强对朝遏制等消息引发韩国和国际舆论的担忧和批评。 首尔
-
2023-05-02 17:02:31
八哥网电影网-8910电影网
1、去搜搜搜索了一下,貌似8910影视是个高清在线电影网站咯。2、不知道对不对。3、麻烦采纳,谢谢!。本文到
-
2023-05-02 17:05:57
我的电脑任务栏怎么还原出来_我的电脑任务栏怎么还原
1、解决方案:首先确认任务栏的工具栏是否有多余的项,只勾选语言栏与快速启动栏即可。2、如图:右键点击任
-
2023-05-02 15:50:01
戚薇和袁成杰分手原因_是因为什么-全球热讯
解答:1、齐炜和袁成杰曾经在城市音乐组合中搭档爱,但后来武汉的两个日夜向不同的方向发展,所以武汉的两
-
2023-05-02 15:26:40
【世界时快讯】X-S20相机性能曝光:或搭载2倍处理速度的X-Processor 5
【ITBEAR科技资讯】5月2日消息,据最新爆料,富士将在5月24日的XSummitBKK2023和5月27日的FUJIKINABangkok2
-
2023-05-02 14:46:16
【天天快播报】火影:6位大筒木实力该如何排名?一式虽然强,但也排不了第一
如果说辉夜是大筒木血统纯正一脉里最强的,那如果算上混血的话那舍人绝对就是最强的了,虽然舍人有一部分地
-
2023-05-02 13:44:33
陈梓志:5.2黄金触低回升后探高回落,原油承压或下行,日内如何操作?
陈梓志:5 2黄金触低回升后探高回落,原油承压或下行,日内如何操作?陈梓志:5 2黄金触低回升后冲高回落,
-
2023-05-02 12:33:59
鞋带上的折痕黑印怎么去掉(鞋带上的黑印怎么去掉,怎么办)_世界短讯
1、先用洗衣液浸泡一段时间,如果有漂白水的话,再漂白10分钟左右。2、漂白浸泡完成之后,将鞋带每一根都单
-
2023-05-02 11:51:14
高斯传媒战略投资赫拉健康,助力本土母婴品牌快速崛起! 环球动态
4月7日,珠中地区院线媒体运营商——“高斯传媒gauss”与珠海本土新势力母婴企业“赫拉健康hera”正式签署
-
2023-05-02 10:48:57
聚焦:欧洲杯点球大战规则_欧洲杯点球大战介绍
解答:1、规则:游戏加载后,点击玩游戏-然后点击玩-然后选择队伍-然后点击继续两次-最后关闭页面右上角的
-
2023-05-02 10:15:48
摩根大通收购美国第一共和银行
中新社旧金山5月1日电美国加利福尼亚州金融保护和创新局当地时间5月1日宣布,总部位于旧金山的美国第一共和
-
2023-05-02 09:11:26
请注意!邵阳将有暴雨、降温
未来一周,邵阳市前期多晴,后期多雨累计雨量较多气温前高后低体感前期闷热、后期凉爽具体预报2日:多云间
-
2023-05-02 08:35:58
2023年承德市体育消费季启动仪式成功举行 天天简讯
4月30日,由承德市体育局主办的2023年承德体育消费季启动仪式、承德市体育旅游招商对接会和“北斗乐跑进承
-
2023-05-02 07:17:48
再踏征程的意思(征程的意思)|当前报道
1、开启新的征程意思是指事情在前一个阶段已经取得了成功,还要继续努力,快速而信心十足向另一个目标前进
-
2023-05-02 06:09:31
美国银行业危机持续 美联储激进加息难辞其咎
美国银行业危机持续美联储激进加息难辞其咎,债券,美国,银行业,货币政策,美联储加息
-
2023-05-02 04:13:53
世界即时:2023年5月2日山东省氯化石蜡价格最新行情预测
中国报告大厅2023年5月2日山东省氯化石蜡价格最新走势监测显示:山东义众鑫新材料有限公司报价机构,今日氯
-
2023-05-02 01:15:35
谁的青春不热血歌曲 谁的青春不热血|每日资讯
今天来聊聊关于谁的青春不热血歌曲,谁的青春不热血的文章,现在就为大家来简单介绍下谁的青春不热血歌曲,
-
2023-05-01 22:50:36
keep up with the joneses什么意思_keep up with什么意思 天天要闻
1、keepupwith跟上双语对照词典结果:keepupwith[英][ki:pʌpwið][美][kip
-
2023-05-01 21:29:55
我是谁歌词是什么意思_我是谁歌词
1、MagicPower-我是谁我是谁我是谁作词:廷廷(MagicPower)作曲:廷廷(MagicPower)我是谁你是否常常这样问自己
-
2023-05-01 20:17:55
“五一”上海人从众,警方守护景区商圈平安有序_全球观察
今年“五一”市民出游热情高涨,各旅游景点、城市商圈游客如织、人潮涌动。上海警方结合假期客流的实际情况
-
2023-05-01 19:07:29
“五一”建设不减速!广州白云站年内具备开通条件
五一期间,广州白云站综合交通枢纽施工现场塔吊林立,机器轰鸣,一期工程正在进行装饰装修首件制作,二期工
-
特写:风吹稻香忆袁老——袁隆平逝世一周年的墓前追思
2022-05-23 16:13:29 -
北京5月21日区域核酸筛查初筛10管混采阳性
2022-05-23 16:13:29 -
北京两地由高风险降为中风险 一地降为低风险地区
2022-05-23 16:13:29 -
5月21日15时至22日15时,北京新增本土新冠肺炎病毒感染者94例
2022-05-23 16:13:29 -
108岁病人顺利出院,瑞金医院卢湾分院已收治10位百岁老人
2022-05-23 16:13:29 -
生态花园助力乡村振兴 重庆小山村展现“乡土美学”
2022-05-23 16:13:29 -
上海金山政务服务场所逐步恢复服务
2022-05-23 16:13:29