XQL 文件管理器

XQL File Manager 是 rabbit-sql 提供的 SQL 资源管理与解析组件,用于在 保持原生 SQL 语义不变 的前提下,为 SQL 文件提供可编程能力。

XQL 文件管理器是在 标准 SQL 文件之上进行无侵入扩展 的解析组件。

它通过约定格式的注释语法,为普通 SQL 增强以下能力:

它的目标是:

让 SQL 文件具备结构化、可复用、可扩展的工程能力。

所有扩展均基于注释实现,因此:

✅ 不破坏标准 SQL

✅ 主流 SQL IDE 仍可正常语法高亮、补全与校验

✅ 可作为增强型 SQL 解析器使用

整体架构模型

XQL File
   ↓
XQLFileManager(扫描阶段)
   ├── SQL Object
   ├── Templates
   ├── Metadata
   ↓
Runtime Invocation(执行阶段)
   ↓
Dynamic SQL Engine
   ↓
Final SQL

核心配置

核心配置文件支持 YAMLproperties 两种格式,推荐使用:xql-file-manager.yml

配置文件支持以下增强能力:

constants:
  base: &basePath pgsql

files:
   foo: !path [ *basePath, foo.xql ]
   bar: bar.xql
   remote: http://127.0.0.1:8080/share/cyx.xql?token=${env.TOKEN}

pipes:
#  upper: org.example.Upper

charset: UTF-8
named-param-prefix: ':'

常量(constants)

特性:

文件(files)

注册需要解析的 SQL 文件。

支持文件类型:

支持协议:

管道(pipes)

注册动态 SQL 中使用的自定义管道操作符。

值必须为实现类的 完整限定类名

编码(charset)

指定 XQL 文件解析编码,默认:UTF-8

命名参数前缀

named-param-prefix: ':'

用于定义全局预编译命名参数前缀。

XQL 文件规范

文件描述

文件顶部可定义说明注释块。

当注释中包含 @@@ 区域时,其内容将作为文件描述信息:

/*
 Created by IntelliJ IDEA.
 User: 
 Date: 
 Time: 
 @@@
 一些描述写在这里。
 @@@
 Typing "xql" keyword to get suggestions,
 e.g: "xql:new" will be create a sql fragment.
*/

文件主体

一个 XQL 文件由 多个 SQL 对象 组成。

SQL 对象之间通过 ; 分隔,这是解析阶段的核心边界。

SQL 对象生命周期

每个 SQL 对象存在两个完全独立的阶段:

  1. 文件扫描阶段:
    • 解析元数据
    • 提取模板
    • 合并内联模板
    • 构建 SQL 结构模型
  2. SQL 调用阶段:
    • 执行动态 SQL 脚本
    • 生成最终可执行 SQL

SQL 对象结构

/*[queryGuests]*/
/*#查询访客#*/
-- @cache 30m
-- @rules admin,guest
-- #check :age > 30 throw '年龄不能大于30岁'
-- #var id = 14
-- #var users = 'a,xxx,c' | split(',')
select * from test.guest where
-- //TEMPLATE-BEGIN:myCnd
id = :id 
and name in (
    -- #for item of :users; last as isLast
        -- #if !:isLast  
        :item,
        -- #else
        :item
        -- #fi
    -- #done
    )
-- //TEMPLATE-END
;

一个 SQL 对象由以下部分组成:

部分 说明
名称 /*[name]*/
描述 /*#desc#*/(可选)
元数据 -- @key value
函数体 SQL + 动态脚本 + 模板

模版片段

模板用于 SQL 复用,通过 ${} 引用。

模板分为:

独立模版

定义方式:

/*{where}*/
where id = :id ${order};

使用:

select * from users ${where};

模板可递归引用其他模板。

内联模版

用于在 单个 SQL 对象内部 定义复用片段。

特点:

定义:

-- //TEMPLATE-BEGIN:myCnd
...
-- //TEMPLATE-END

示例:

/*[queryList]*/
select * from guest where
-- //TEMPLATE-BEGIN:myInLineCnd
-- #if :id != blank
id = :id
-- #fi
-- //TEMPLATE-END
;

引用:

/*[queryCount]*/
select count(*) from guest where ${myInLineCnd};

元数据

元数据用于为 SQL 提供附加描述信息。

定义格式:

-- @name value

示例:

/*[queryUsers]*/
-- @cache 30m
-- @rules admin,guest
select * from users;

特点:

例如:

QueryCacheManager 可根据 metadata 决定缓存策略。

多语句块

当 SQL 包含 PLSQL / DDL 时可能出现多个 ;

可通过追加行注释避免解析歧义:

/*[myPlsql]*/
begin; --
  select 1; -- 一些描述
  select 2; --
end;

动态 SQL

动态 SQL 通过行注释 -- 中嵌入脚本实现。

解析过程与 SQL 本身完全解耦。

详细说明请参考:

👉 动态 SQL 文档

设计理念

XQL 的目标不是替代 SQL,而是增强 SQL。

XQL 更接近“可编程 SQL 文件”,而不是 ORM。