ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

05-EA01到EA05五张元数据表

05-EA01到EA05五张元数据表 05-EA01到EA05五张表描述任意SQLbrowise 元数据引擎的地基是五张表——EA01存SQL定义、EA02存表、EA03存字段、EA05存条件。一条SQL的全部要素查什么、从哪查、怎么过滤拆开存在这五张表里运行时按 sqlId 组装。这篇逐字段拆解五张表的物理设计和元数据对象模型。文章目录05-EA01到EA05五张表描述任意SQL一、五张表的分工二、EA01SQL主定义三、EA02FROM表定义四、EA03SELECT字段定义五、EA05WHERE条件定义六、一张完整的元数据拼出什么SQL一、五张表的分工EA01SQL主定义 一条SQL一行 ├── EA02FROM表 一条SQL N个表 ├── EA03SELECT字段一条SQL N个字段 └── EA05WHERE条件 一条SQL N个条件 EA04在browise中保留编号但已并入EA05——wiserise时代EA04存表间关联browise简化对应源码位置browise-metadata/src/main/java/com/browise/ea/core/metadata/类大小对应表装载SQLEaSqlMeta.java-EA01SELECT * FROM EA01EaTableMeta.java-EA02SELECT * FROM EA02 WHERE EAE001?EaFieldMeta.java-EA03SELECT * FROM EA03 WHERE EAE001? ORDER BY ...EaConditionMeta.java-EA05SELECT * FROM EA05 WHERE EAE001?启动时MetadataLoader.loadAll()8.5KB把五张表全量装进EaMetadataCacheConcurrentHashMap按 sqlCode 索引。二、EA01SQL主定义EAE001SQL编号 主键如SYS_USER_sEAE002 名称 展示用标题 EAE003 主表 默认FROM的表 EAE004SQL模式0综合1查询2更新3删除4插入 EAE800 原始SQLrawSql模式时使用 EAE801 是否rawSql0/1EAE004 模式字段的六种值决定了这条元数据被哪个API执行值模式执行入口0综合executeUpdate按_t参数分发_t2更新/4新增/3删除1查询query / count2更新executeUpdate3删除executeUpdate4插入insert5存储过程预留rawSql 模式EAE8011是逃生舱口复杂统计SQL没法拆成字段/条件时整条SQL存 EAE800SqlBuilder 只做#{param}→?占位符替换和分页包装第11篇专述。EaSqlMeta.java 对应字段publicclassEaSqlMeta{privateStringsqlCode;// EAE001privateStringtitle;// EAE002privateStringmainTable;// EAE003privateStringsqlMode;// EAE004privateStringrawSql;// EAE800privatebooleanhasRawSql;// EAE801}三、EA02FROM表定义EAE001SQL编号 外键→EA01 EAE005 表名 如SYS_USEREAE006 表别名 如u一条SQL查多个表时EA02有多行。SqlBuilder拼FROM时多行 →FROM SYS_USER u, SYS_UNIT d WHERE ...隐式JOIN关联条件在EA05里拼单行 →FROM SYS_USER零行rawSql → 不走这条路EaTableMeta.java 就三个字段——最简单的一张元数据表。四、EA03SELECT字段定义这是五张表里字段最多的一张也是describe()的数据源EAE001SQL编号 EAE006 表别名 关联EA02——字段属于哪个表 EAE007 字段名 数据库列名如PSN_NAMEEAE008 字段别名 查询结果的列名如psnNameEAE009 数据类型1字符2日期3数字4日期时间 EAE997 码值 关联AA10字典类别如SEXEAE998 是否码值0/1EAE700 是否可见 列表是否显示 eae991 显示类型 前端控件映射 required/regexRule/maskRule/encrypted/masked...EAE009 数据类型不只是展示信息——它直接影响SqlBuilder拼列表达式的方式Oracle方言// SqlBuilder.appendColumns 的核心分支case2:// 日期exprto_char(alias.column,yyyymmdd);break;case4:// 日期时间exprto_char(alias.column,yyyy-mm-dd hh24:mi:ss);break;default:// 字符/数字直接拼expralias.column;同一份元数据MySQL方言走DATE_FORMAT()、达梦走自己的函数——类型元数据是方言分支的依据。eae991 显示类型 → 前端控件的映射在 EaEngine.mapDisplayType()privateStringmapDisplayType(Stringeae991){if(eae991null)returntext;switch(eae991){case2:returndate;case3:returnnumber;case4:returndatetime;default:returntext;}}describe() 把它连同 codeName/encrypted/masked/pattern 全部输出给前端——CommonQuery就是靠这份JSON自动渲染表单和列表的。五、EA05WHERE条件定义最复杂的一张——它同时描述查询参数和过滤条件EAE001SQL编号 EAE006 表别名 EAE007 列名 EAE012 运算符0102like0304050607...EAE013 条件类型1固定值0动态参数 EAE014 参数名/值 动态参数名(如psnName)固定字面值 EAE015 连接符AND/OREAE016 左括号0/1EAE017 右括号0/1条件类型 EAE013 是SqlBuilder条件拼接的总开关第08篇展开1固定值→ 拼SQL时始终生效如AND u.STATUS 1只查在职0动态参数→ 运行时看参数Map——null/空串/null跳过有值才拼AND u.PSN_NAME LIKE %||?||%括号字段支持条件分组EAE0161的条件前拼(EAE0171的条件后拼)——实现(A OR B) AND C这种嵌套逻辑。EaConditionMeta.java 的 getOperatorSymbol() 把 EAE012 翻译成SQL符号getJoinOperator() 返回 AND/OR。六、一张完整的元数据拼出什么SQL配置示例——“查询在职用户按姓名模糊、按机构筛选”EA01: EAE001SYS_USER_s, EAE003SYS_USER, EAE0041 EA02: EAE001SYS_USER_s, EAE005SYS_USER, EAE006u EA03: 三行 u.PSN_ID → psnId (类型3) u.PSN_NAME → psnName (类型1, 码值无) u.PSN_SEX → psnSex (类型1, 码值SEX) EA05: 三行 u.STATUS 1 固定值 u.PSN_NAME like ? 动态(psnName) u.UNIT_ID ? 动态(unitId)运行时eaEngine.query(SYS_USER_s, {psnName:张, minRow:1, maxRow:20})拼出SELECTu.PSN_ID,u.PSN_NAME,u.PSN_SEXFROMSYS_USER uWHERE11ANDu.STATUS1ANDu.PSN_NAMELIKE%||?||%-- 参数: 张ORDERBYu.PSN_ID-- 外层再包 ROWNUM 三层分页第10篇unitId 没传——那一行动态条件被跳过。这就是五张表描述任意SQL的完整闭环。✅ 亮点逐字段拆五张元数据表的物理设计用一条在职用户模糊查询的完整示例串起EA01→02→03→05的协作点出EAE013固定/动态是条件拼接总开关、EAE009类型是方言分支依据。适合设计元数据驱动引擎的参考。扩展方向第06篇拆EaEngine调度、第07-08篇拆SqlBuilder六法与条件拼接细节。
返回列表