blinkfox/fenix

动态sql语句xml 标签感觉有点过度设计

melin opened this issue · 3 comments

melin commented

image

太多标签,增加使用难度。是否直接使用类似freemarker 组装sql,更加直接简单易用。

image

@melin 动态 SQL 的本质就是 if/elsefor 循环的逻辑,MyBatis 就是把这些做成了单独的 XML 标签,但是在实际项目中,复杂动态的 SQL 会写大量的 if/else 的相关代码,是过程式的编程方式,可读性和可复用性是比较差的。

而 Fenix 中的 XML 标签本质上是对 if/elsefor 这些过程式编程的进一步的封装,是具有 SQL 声明式的语义化的 XML 标签,可读写更强。你对比下你示例中的写法,是不是不能一眼看出来写的啥,而且很多地方都充斥着过程式的、扰乱视觉的 if/else 代码。

你想想,如果你要写一个 in 查询,你需要写一个 for 循环,手动处理前后括号、最后的逗号等,而通过 Fenix 只需要一个 <in /> 标签即可,只需关注核心的查询字段和参数值即可。针对 between ... and 的区间范围查询,你还得用 4 个 if/else 分支判断左区间参数和右区间参数的都为空、都不为空、谁为空、谁不为空的情况,而 Fenix 中的 <between /> 标签是具有这些边界处理和自动退化处理能力的。所以,在多条件复杂查询场景,用模版引擎的过程式编程写法,SQL 本身的可读性、易理解性、可复用性大大降低了。

另外,Fenix 中也支持你这种模板化的逻辑控制标签写法的,如果你的 SQL 确实不是字段的动态性的话,就可以使用这种写法,一般建议能用声明式、语义化的写法就使用声明式的写法。

melin commented

语义化增加使用成本,以及理解成本,特别是复杂sql。如果强调语义化标签,直接使用api可能更好。
image

@melin 你这一堆 Java 代码我反而看不懂你写的啥,而语义化标签就是增加 SQL 片段的直观可理解性,看标签名称就懂是啥意思了。