Mybatis动态语句中使用ognl语句

Mybatis如何写动态语句?

其实就是OGNL 表达式。OGNL 表达式可以灵活的组装 SQL 语句。

  // mysql 的动态语句
    @Select({
            "<script>",
            "SELECT * ",
            "FROM operation_log",
            "where",
            "DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(operation_time) ",
            "and company_id = #{companyId}",
            "<if test='ids.size() &lt; 0'>",
            "and user_code in ",
            "<foreach item='id' index='index' collection='ids' open='(' separator=',' close=')'>",
            "#{id}",
            "</foreach>",
            "</if>",
            "</script>"
    })
    List<OperationLogPO> list(@Param("companyId") Long companyId, @Param("ids") List<String> ids);

案例:查出表中最近7天的结果。

where DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(operation_time) 

通过查找资料,发现其中的> < = 等等符号,必须经过转译。

以下是xml转译方法(注意markdown会将转译字符读出来,其中的转义字符没有空格)

<& l t ;小于
>& gt;大于
&& amp;
& apos;单引号
"& quot;双引号

ognl的基础知识

OGNL 全称 Object-Graph Navigation Language,是 Java 中的一个开源的表达式语言,用于访问对象数据.

<if test="age != null">
  AND age = #{age}
</if>

if 标签的 test 属性就是个典型的 OGNL 表达式。age != null表示当 age 不为 null 的时候 if 成立,则动态的向 SQL 中插入标签内的 SQL 代码段。

3.2 常见的 OGNL 表达式

常见的 OGNL 表达式
在 MyBatis 中常见的 OGNL 表达式如下:

e1 or e2 //或关系
e1 and e2 //与关系
e1 == e2 或者 e1 eq e2 // 相等
e1 != e2 或者 e1 neq e2 //不等
e1 lt e2 ;e1 < e2;e1 gt e2;e1 > e2;e1 lte e2;e1 <= e2;e1 gte e2;e1 >= e2 //比较关系
e1 + e2;e1 - e2;e1 * e2;e1 / e2;e1 % e2 //运算关系
!e 或者 not e //非,取反
e.method(args) //调用对象方法
e.property //访问属性值
e1[e2] //访问数组、链表(e2 为序号)或者 Map(e2 为键值)

其中 1~4 以及 9~10 都是特别常用的几种情况,而其它的情况不利于 SQL 的维护,因此并不常见。

参考案例:

  • mybatis-plus: xml中大于小于等操作,ognl表达式test:https://blog.csdn.net/yubin1285570923/article/details/118501440
  • OGNL表达式:https://m.imooc.com/wiki/mybatis-ognl

如果您觉得上面的内容对您有帮助欢迎点赞、评论、转发!
更多内容请查阅作者博客:https://jiaruiblog.com
或者star作者github: https://github.com/Jarrettluo?tab=repositories

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值