mybatis 使用ognl

@Ognl@isNotEmpty() for String,Array,Collection,Map Test

now, test empty string test. must use:

<if test="userId != null && ''.equals(userId)">
and user_id = #{userId}
</if>

but, OGNL support Calling Static Methods.
http://www.opensymphony.com/ognl/html/LanguageGuide/staticMethods.html

so, we can use this for test empty String,Array,Collection,Map.
look like this:

<if test="@Ognl@isNotEmpty(userId)">
        and user_id = #{userId}
</if>




source code:

public class Ognl {

/**
* test for Map,Collection,String,Array isEmpty
* @param o
* @return
*/
public static boolean isEmpty(Object o) throws IllegalArgumentException {
if(o == null) return true;

if(o instanceof String) {
if(((String)o).length() == 0){
return true;
}
} else if(o instanceof Collection) {
if(((Collection)o).isEmpty()){
return true;
}
} else if(o.getClass().isArray()) {
if(Array.getLength(o) == 0){
return true;
}
} else if(o instanceof Map) {
if(((Map)o).isEmpty()){
return true;
}
}else {
return false;
}

return false;
}

/**
* test for Map,Collection,String,Array isNotEmpty
* @param c
* @return
*/
public static boolean isNotEmpty(Object o) {
return !isEmpty(o);
}
}


and will put this class to "default package".

 

要把ognl.java文件放到default package下,否则会报错。。。

错误:ibatis Method "isNotEmpty" failed for object Ognl [java.lang.ClassNotFoundException: java.lang.Ognl]

### MyBatisOGNL 使用方法 #### 动态 SQL 条件判断与逻辑运算 OGNL (Object-Graph Navigation Language) 是一种功能强大且灵活的语言,允许开发者通过简洁的方式访问和修改对象图中的数据。在 MyBatis 框架内,OGNL 主要应用于动态 SQL 场景下,帮助构建更加复杂多变的查询语句[^1]。 对于常见的 OGNL 表达式的应用如下: - **基本属性访问** 当需要引用传入参数的对象字段时可以直接书写该字段名作为表达式。例如,在 `User` 类中有名为 `name` 的字符串成员变量,则可以通过 `${name}` 或者 `#{name}` 形式来引用它。 ```xml <select id="selectUsersByName" parameterType="java.lang.String" resultType="com.example.User"> SELECT * FROM users WHERE name LIKE #{value} </select> ``` 此处假设调用此映射器接口的方法传递了一个简单的 String 参数给定为 value;如果希望更精确地控制占位符名称可以显式指定如 `parameterMap` 属性所定义那样。 - **集合遍历** 针对列表类型的输入参数,利用 foreach 循环结构配合 OGNL 实现批量处理操作非常方便实用。下面是一个向数据库插入多个记录的例子: ```xml <insert id="batchInsert" parameterType="list"> INSERT INTO items (id, description) VALUES <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.description}) </foreach> </insert> ``` 这里使用了 `<foreach>` 标签并指定了迭代项称为 "item", 同时设置了分隔符逗号用于区分不同组的数据条目。 - **条件分支** 借助于三元运算符可以在 XML 文件里轻松完成简单业务逻辑的选择执行路径。比如根据某个标志位决定是否附加额外过滤条件: ```xml <if test="active == true"> AND status = 'ACTIVE' </if> ``` 这段代码片段表示仅当 active 成员被设为布尔真值的时候才会追加 AND 子句到最终生成的实际 SQL 文本之中去[^3]。 #### 解决常见问题 有时会遇到一些棘手的问题,以下是几个解决方案建议: - 如果发现某些情况下无法正常解析 OGNL 表达式,请确认上下文中确实存在对应命名空间下的实体类实例,并且其内部各层次级联关系均已被正确初始化。 - 当涉及比较大小写敏感度较高的字符型字段匹配时,考虑采用函数辅助转换统一格式后再做对比分析,像 MySQL 提供有 UPPER() 和 LOWER() 方法可供选用。 - 对于较为复杂的嵌套结构体之间的关联参照,尝试引入中间变量简化表述难度,提高可读性和易维护程度的同时也降低了出错几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值