mybatis 中的 ${value} 替代符


 

  以前使用ibatis/mybatis時曾經碰到過這個問題,在動態SQL中,如果只有一個字符類的參數,在影射文件中是這樣配置的:

<select id="getOrderList" resultType="Order" parameterType="String">
   select order_id orderId
          order_no orderNo,
           order_name orderName
      from demo_order t
     where t.order_id = #{value}
</select>

    或者傳入直接執行的SQL:

<select id="getOrderListSQL" resultType="order" parameterType="String">
   #{value}
</select>

 這時候都會碰到一個問題,為什么是${value}呢?以前也曾試過用其他符號代替,比如調用方法的參數:getOrderList(String orderId)時使用#{orderId},getOrderListSQL(String querySQL)時使用#{querySQL},最終會得到一個異常,看來這是行不通的。想不通就看看源碼吧,源碼是這樣處理的(TextSqlNode.java的57行),一看就明白了,看 if 判斷處理中context.getBindings().put的方法,原來它在處理的時候使用了"value"做為替代符的緩存的key,所以在ONGL查找中是查找"value"的值的。

public String handleToken(String content) {
      Object parameter = context.getBindings().get("_parameter");
      if (parameter == null) {
        context.getBindings().put("value", null);
      } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
        context.getBindings().put("value", parameter);
      }
      Object value = OgnlCache.getValue(content, context.getBindings());
      return (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null"
}

 

    當然mybatis給我們提供了變通的方法,如果我們想這樣使用:

<select id="getOrderList" resultType="Order" parameterType="String">
   select order_id orderId
          order_no orderNo,
           order_name orderName
      from demo_order t
     where t.order_id = #{orderId}
</select>
<select id="getOrderListSQL" resultType="order" parameterType="String"> #{querySQL} </select>

    只需要在方法調用的時候加入@param注解,表明想要傳入的替代符的名稱,這樣就實現了參數變量的自由使用。

getOrderList(@Param("orderId") String orderId);
getOrderListSQL(@Param("querySQL") String querySQL);

 

   理解有限,歡迎指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM