关于如何在MyBatis中使用OGNL的详细说明

电脑杂谈  发布时间:2020-06-18 23:31:39  来源:网络整理

ognl 调用方法_ognl表达式 调用方法_c#方法调用方法

如果我们搜索与OGNL相关的内容,通常的结果都与Struts相关. 您一定不会找到与MyBatis相关的. 尽管它与Struts中的用法相似,但很难以另一种方式理解它.

MyBatis常用的OGNL表达式

以上只是适用于MyBatis的OGNL表达式. 有关完整的表达,请单击此处.

我可以在MyBatis的哪里使用OGNL?

如果您对MyBatis参数进行了深入研究,您可能会印象深刻,因为本文提到了OGNL和一些特殊用法.

如果您还没有读过它,建议您花些时间阅读. 上面的博客不是很容易理解,但是理解后会很有用.

在MyBatis中可以在两个地方使用OGNL:

在MyBatis中处理上述两个地方时,它们都是由OGNL处理的.

c#方法调用方法_ognl 调用方法_ognl表达式 调用方法

以下使用示例说明这两种情况的用法.

1. 在动态SQL表达式中

示例1,类似于MySQL的查询:

<select id="xxx" ...>
 select id,name,... from country
 <where>
 <if test="name != null and name != ''">
  name like concat('%', #{name}, '%')
 </if>
 </where>
</select>

以上代码中的test值将使用OGNL来计算结果.

示例2: 类似于查询的常规

<select id="xxx" ...>
 select id,name,... from country
 <bind name="nameLike" value="'%' + name + '%'"/>
 <where>
 <if test="name != null and name != ''">
  name like #{nameLike}
 </if>
 </where>
</select>

此处的值将使用OGNL计算.

c#方法调用方法_ognl表达式 调用方法_ognl 调用方法

注意: 可以通过#{}或$ {}获得对

在通用映射器中支持UUID主键. Universal Mapper中的实现是使用标记. 此标记调用静态方法. 近似方法如下:

<bind name="username_bind" 
 value='@java.util.UUID@randomUUID().toString().replace("-", "")' />

尽管此方法可以自动调用静态方法,但是它无法写回相应的属性值,因此在使用它时需要小心.

2. 在$ {param}

的参数中

在上面的示例中,使用以下方法最简单

<select id="xxx" ...>
 select id,name,... from country
 <where>
 <if test="name != null and name != ''">
  name like '${'%' + name + '%'}'
 </if>
 </where>
</select>

c#方法调用方法_ognl 调用方法_ognl表达式 调用方法

请注意,此处写入的是$ {'%'+名称+'%'},而不是%$ {name}%. 两种方法的结果相同,但是过程不同.

在MyBatis中处理$ {}时,只需使用OGNL计算结果值ognl 调用方法,然后在SQL中替换相应的$ {xxx}. OGNL仅处理$ {expression here}.

此处的表达式可以是OGNL支持的所有表达式. 编写起来可能非常复杂. 您可以调用静态方法以返回值,也可以调用静态属性值.

示例: 使用OGNL实现单表拆分功能

以上是使用OGNL的简单方法. 这是OGNL实现表划分的示例.

子表函数是常规Mapper中的新函数,它允许您在运行时指定表名,并通过指定的表名对表进行操作. 此功能是使用OGNL实现的.

首先,并非所有表都需要此功能,所以定义了一个接口. 当参数(接口方法仅具有实体类的一个参数)对象继承接口时,将允许使用动态表名.

public interface IDynamicTableName {
 /**
 * 获取动态表名 - 只要有返回值,不是null和'',就会用返回值作为表名
 *
 * @return
 */
 String getDynamicTableName();
}

c#方法调用方法_ognl表达式 调用方法_ognl 调用方法

然后在以XML编写表名称时使用它:

<if test="@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter) 
  and dynamicTableName != null 
  and dynamicTableName != ''">
 ${dynamicTableName}
</if>
<if test="@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(_parameter) 
  or dynamicTableName == null 
  or dynamicTableName == ''">
 defaultTableName
</if>

由于我需要确定_parameter是否继承IDynamicTableName接口,因此不再能够实现简单的编写,因此使用了静态方法. 两种方法如下:

/**
 * 判断参数是否支持动态表名
 *
 * @param parameter
 * @return true支持,false不支持
 */
public static boolean isDynamicParameter(Object parameter) {
 if (parameter != null && parameter instanceof IDynamicTableName) {
 return true;
 }
 return false;
}
/**
 * 判断参数是否b支持动态表名
 *
 * @param parameter
 * @return true不支持,false支持
 */
public static boolean isNotDynamicParameter(Object parameter) {
 return !isDynamicParameter(parameter);
}

根据判断的结果,选择要使用的表名.

还要注意,XML判断中有一个dynamicTableName. 该参数根据getDynamicTableName方法获得. MyBatis使用与属性对应的getter方法获取值,而不是字段.

最后

如果您真的想了解MyBatis中OGNL的用法ognl 调用方法,请再写一些示例进行测试和播放. 动手测试是学习的好方法.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-250282-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...