| 類別 | 表達式 | 說明 |
|---|---|---|
| 邏輯運算 | e1 or e2 / e1 and e2 | 邏輯或/與 |
e1 == e2 / e1 eq e2 | 等於 | |
e1 != e2 / e1 neq e2 | 不等於 | |
e1 lt e2 | 小於 (<) | |
e1 lte e2 | 小於等於 (<=) | |
e1 gt e2 / e1 gte e2 | 大於 (>) / 大於等於 (>=) | |
| 集合操作 | e1 in e2 | 包含於 |
e1 not in e2 | 不包含於 | |
e1[ e2 ] | 按索引/鍵取值 (List/Map/數組) | |
| 算術運算 | e1 + e2 | 加/字符串拼接 |
e1 - e2 / e1 * e2 / e1 / e2 / e1 % e2 | 減/乘/除/模 | |
| 方法/屬性訪問 | e.method(args) | 調用對象方法 |
e.property | 獲取對象屬性 (走 getter) | |
| 靜態調用 | @class@method(args) | 調用類靜態方法 |
@class@field | 獲取類靜態字段 | |
!e / not e | 邏輯非 |
<select id="selectByName" resultType="Country">
SELECT * FROM country
<where>
<if test="name != null and name != ''">
name LIKE CONCAT('%', #{name}, '%')
</if>
</where>
</select>
`test` 內容由 OGNL 計算,結果為 boolean 決定 SQL 片段是否生效。
<bind> 變量綁定(推薦防注入)
<select id="selectByName" resultType="Country">
SELECT * FROM country
<bind name="nameLike" value="'%' + name + '%'"/>
<where>
<if test="name != null and name != ''">
name LIKE #{nameLike}
</if>
</where>
</select>
value 為 OGNL 表達式,結果綁定為 `nameLike` 變量,後續用 `#{nameLike}` 安全引用。
<bind name="uuid" value='@java.util.UUID@randomUUID().toString().replace("-", "")' />
<insert id="insert">
INSERT INTO t_user (id, name) VALUES (#{uuid}, #{name})
</insert>
⚠️ **注意**:`
<if test="name != null and name != ''">
name LIKE '${'%' + name + '%'}'
</if>
**關鍵區別**:
public interface IDynamicTableName {
String getDynamicTableName(); // 返回動態表名,null/空則用默認表
}
public class OrderQuery implements IDynamicTableName {
private String dynamicTableName;
// getter/setter
@Override
public String getDynamicTableName() { return dynamicTableName; }
}
public class OGNLUtil {
public static boolean isDynamicParameter(Object parameter) {
return parameter instanceof IDynamicTableName;
}
public static boolean isNotDynamicParameter(Object parameter) {
return !isDynamicParameter(parameter);
}
}
<select id="selectOrders" resultType="Order">
SELECT * FROM
<if test="@tk.mybatis.mapper.util.OGNLUtil@isDynamicParameter(_parameter)
and dynamicTableName != null and dynamicTableName != ''">
${dynamicTableName} <!-- 直接拼接表名,無法用 #{} -->
</if>
<if test="@tk.mybatis.mapper.util.OGNLUtil@isNotDynamicParameter(_parameter)
or dynamicTableName == null or dynamicTableName == ''">
default_order_table
</if>
<where>
<!-- 其他條件 -->
</where>
</select>
關鍵點**: