Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BEP 54: 注解内的 SQL 片段 支持 条件模板 #54

Open
troyzhxu opened this issue Jun 16, 2022 · 5 comments
Open

BEP 54: 注解内的 SQL 片段 支持 条件模板 #54

troyzhxu opened this issue Jun 16, 2022 · 5 comments
Labels

Comments

@troyzhxu
Copy link
Owner

troyzhxu commented Jun 16, 2022

目的(BeanSearcher Enhancement Proposal)

弥补 拼接参数 的不足:

  • 复杂情况下用法不太优雅
  • 存在注入风险,需要用户自己控制

参考:https://bs.zhxu.cn/guide/latest/params.html#%E6%8B%BC%E6%8E%A5%E5%8F%82%E6%95%B0

特性(用法)

当逻辑表达式 expression真值 时才 连接 yyy

@SearchBean(
    tables="xxx x <#[expression]> join yyy y on y.x_id = x.id </#>"       // 方式 1
    tables="xxx x <[expression]> join yyy y on y.x_id = x.id </>"         // 方式 2
    tables="xxx x #[expression] join yyy y on y.x_id = x.id #"            // 方式 3
    tables="xxx x #[expression] join yyy y on y.x_id = x.id [#]"          // 方式 4
    tables="xxx x <#[expression] join yyy y on y.x_id = x.id #>"          // 方式 5
    tables="xxx x <# expression ? join yyy y on y.x_id = x.id #>"         // 方式 6
)

方式 1、2、3、4、5、6,大家觉得 哪种 方式 更好一点呢?

表达式 expression 组成 与 真值 判断

  • 检索参数(形如 :name,参与逻辑计算)
  • 实体属性名(判断规则:是否在 select 列表 或 where 条件中存在)
  • 关系运算符:== != < > <= >=
  • 布尔运算符:或 |&!

例如:

  • :useYyy - 当检索参数中有 useYyy 且值 非空 非null 非 0 时 为真
  • :type == 1 - 当检索参数中有 type 且值 等于 1"1" 时为真
  • :foo == 'bar' - 当检索参数中有 foo 且值 等于 bar 时为真
  • :foo > :bar - 当检索参数中有 foobar 且值 foo 大于 bar 时为真
  • yId - 当 select 列表 或 where 条件中有 yId 为真
  • yId | yName - 当 select 列表 或 where 条件中有 yIdyName 时 为真
  • :useYyy & (yId | yName) - 当检索参数中有 useYyy 且值 非空 非null 非 0 且 当 select 列表 或 where 条件中有 yIdyName 时为真

欢迎讨论

大家觉得 哪种 方式 更简单 更可读一点呢(或者你是否有更好的语法),说说你的理由吧 ^_^

@troyzhxu troyzhxu changed the title 注解内新增 模板 支持 注解内新增支持 条件模板 Jun 16, 2022
@troyzhxu troyzhxu changed the title 注解内新增支持 条件模板 BEP: 注解内新增支持 条件模板 Jun 16, 2022
@troyzhxu troyzhxu changed the title BEP: 注解内新增支持 条件模板 BEP: 注解内的 SQL 片段 支持 条件模板 Jun 16, 2022
@troyzhxu troyzhxu changed the title BEP: 注解内的 SQL 片段 支持 条件模板 BEP 54: 注解内的 SQL 片段 支持 条件模板 Jun 17, 2022
@aabbccddeeffgghhee
Copy link

方式5,相对简单且有明确的开始结束符,易理解

@duanguangchen
Copy link

可以参考mybatis里的各种动态标签,方便理解和替换

@troyzhxu
Copy link
Owner Author

troyzhxu commented Jun 21, 2022

@duanguangchen 这个也是从 mybatis 的 <if> 标签演变来的,你可以把自己希望的用法方式,用类似的实例代码表达出来,让我们都参考一下。

@tanzx
Copy link

tanzx commented Oct 7, 2024

请问这个功能有没有release出来?我有一点小想法。从JDK 15开始,支持文本块,方便在java代码里写复杂文本。类似下面这样。

@SearchBean(
    tables=
        """
        xxx x 
            <if test="expression">
             join yyy y on y.x_id = x.id 
            </if>
        """
)

这样写感觉贴近mybatis的写法,感觉贴近通常的开发。条件表达式在xml部分,不跟SQL片段混在一起。条件表达式可以用OGNL,或者用SpEL。xml部分目前有if标记,如果以后有需要,可以拓展其他标记。
以上是一点小想法,仅仅用于参考一下。

@troyzhxu
Copy link
Owner Author

为了降低学习成本,靠近其它框架的写法,并使得写法尽量简洁,最终采纳以下的标签方式:

<if [expression]> content </if>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants