1. 程式人生 > >Mybatis 傳引數的問題

Mybatis 傳引數的問題

mybatis3的使用者指南里關於字串替換的解釋是:

字串替換
  預設情況下,使用#{}格式的語法會導致 MyBatis 建立預處理語句屬性並以它為背景設
置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在 SQL 語
句中插入一個不改變的字串。比如,像 ORDER BY,你可以這樣來使用:
  ORDER BY ${columnName}
  這裡 MyBatis 不會修改或轉義字串。
  重要:接受從使用者輸出的內容並提供給語句中不變的字串,這樣做是不安全的。這會
導致潛在的 SQL 注入攻擊,因此你不應該允許使用者輸入這些欄位,或者通常自行轉義並檢
查。

我在使用的Maper xml對映時

  <select id="selectCartIdBymobileNo" parameterType="String" resultType="java.util.HashMap">
  SELECT CAR.MOBILE_NO,CAR.WORK_RECORD_ID FROM T_CAR_SOURE_INFO CAR WHERE CAR.MOBILE_NO IN (${mobileNos})
  </select>

使用Java呼叫如下:

    String mobileNos = "'1303423****',''1303413****'";

    SqlSession session = SqlMap.getSqlSessionFactory().openSession();
  try{
  List<Map<String,Object>> resultList =  session.selectList("selectCartIdBymobileNo", mobileNos);

   }finally{

     session.close();

   }

執行時報錯   mybatis There is no getter for property named 'mobileNos' in 'class java.lang.String'

將 $ 換成 # 雖然不報錯了,但是查詢不出資料。

最後把 改成 ${value} 居然解決了這個問題。

現在分析認為,預設是使用#{} 這個沒什麼說的了,但是使用${} 時,因為框架支援了OGNL 所以會按照OGNL解析此語句,使用value為什麼能夠解決這個問題,本人現在還不明白,只是在網上搜了下,看到有人這樣說。如有明白的,麻煩告知。

相關推薦

Mybatis 引數的問題

mybatis3的使用者指南里關於字串替換的解釋是: 字串替換   預設情況下,使用#{}格式的語法會導致 MyBatis 建立預處理語句屬性並以它為背景設 置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在 SQL 語 句中插入一個不改變的字串。比如,像 ORDER BY,你可以這

mybatis多個引數(不使用@param註解情況下),3.4.2版本之後出現#{0}-#{n}引數繫結異常

解決方案:        在mybatis配置檔案中宣告setting屬性的useActualParamName 引數值為false                   **

mybatis學習之路----#{}, ${}兩種引數方式的區別--附原始碼解讀

點滴記載,點滴進步,願自己更上一層樓。 首先下個結論, ${} 會將傳入的引數完全拼接到sql語句中,也就是相當於一個拼接符號。 也就是,最後的處理方式就相當於  String sql = select * from user where id=${value}....

MyBatis 向Sql語句中動態引數·動態SQL拼接

在動態傳遞引數的時候,需要用到OGNL表示式,不懂的童鞋可以下去百度,這裡製作一個簡要的介紹 在向XML檔案傳遞引數的時候,需要用到sqlSession.selectList("Message.que

SpringMVC頁面向Controller提交陣列+Mybatis多個引數+MySQL一次寫入多條記錄

DAO層定義:int insertRole2Authorities(@Param("roleId")int roleId, @Param("authorities")List<Integer&g

mybatis多個引數(不使用@param註解情況下),3.4.2版本之後使用#{0}-#{n}引起的引數繫結異常,以及settings屬性中useActualParamName的作用。

解決方案: mybatis的xml配置檔案中宣告settings屬性的useActualParamName引數值為false <setting name="useActualParamName" value="false" /> 程式碼展示

Mybatis多個引數

三種方法 第一種: DAO層方法 Public User selectUser(String name,String area); 對應的Mapper.xml <select id="selectUser" resultMap="Bas

MyBatis多個引數的常用方法

MyBatis傳多個引數的時候有很多種方法,這裡記錄一下自己常用的方法。 1、@Param註解。 Mapper.java介面: int get***ByContentIdAndClassId(@Param("contentId")String contentId, @P

mybatis入門使用2:引數

package com.lls.test; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import

Mybatis單個String和列舉型別的引數應該注意的問題

一 .Mybatis傳遞單個String,應該用_parameter 而不應該用它本身的變數名<select id="getJobByCode" parameterType="java.lang.String" resultMap="BaseResultMap">

【轉】Mybatis多個參數(三種解決方案)

三種 方案 var nbsp myba rom name bsp 什麽 轉自: http://www.2cto.com/database/201409/338155.html 據我目前接觸到的傳多個參數的方案有三種。 第一種方案: DAO層的函數方法 Public

推薦的MyBatis參方式List、數組等

word www rom open 方式 item log 詳細 batis MyBatis 推薦的傳參方式 如果要詳細的學習 MyBatis,推薦看這個教程:https://www.w3cschool.cn/mybatis/ 1. 單個參數 //接口方法 int getA

Mybatis參方式

con 多個 str parameter {0} 適合 表達 and 屬性。 傳遞多個參數的四種方式: 順序傳參:public User selectUser(String name,int deptId); <select id="selectUser" resu

Mybatis-

影響 多參數 數據 對數 collect 動態sql 類名 sql 包含 單參數傳遞 在mapper文件使用動態SQL時,傳入參數的名稱任意。不影響參數傳入的結果 多參數傳遞 默認傳遞方式 自動將傳入的參數進行排序,並用arg1…argeN或者param1…

Wpf Page間跳轉引數 And Window To Page

  這段時間用到Wpf,頁面間的跳轉網上有不少的示例,但是有些已經不能用了,尤其是頁面間的傳參問題更是一大堆,但正確的解決方案卻沒有幾個,或者說寫的不清楚,讓人走了很多彎路,檢視官方文件後發現了正確的姿勢,現記錄如下 Page頁間的跳轉      private void Button_Click(

python執行sql語句時所引數含有單引號

  在編寫自己的程式時,需要實現將資料匯入資料庫,並且是帶引數的傳遞。 執行語句如下:   sql_str = "INSERT INTO teacher(t_name, t_info, t_phone, t_email) VALUES\   

坑:微信小程式wx.request和wx.uploadFile中引數的區別

微信小程式中通過元件<form>提交表單的時候,在js中通過e.detail.value得到所提交表單的json格式資料。一般提交表單我們都是通過wx.request請求,提交表單資料,通過引數data傳資料, wx.request({ url: 'test.php', //僅為示例,

struts2自學中“小越坑------之 前臺向後臺引數

前臺程式碼: 前臺效果: 後臺程式碼: 有上程式碼可看到,LoginAction類繼承和實現com.opensymphony.xwork2.ActionSupport, 並在LoginAction中宣告兩個私有String型別變數username和passwo

C/C++生成的exe檔案如何引數到main中

Main函式引數argc,argv說明:   C/C++語言中的main函式,經常帶有引數argc,argv,如下:    int main(int argc, char** argv) int main(int argc, char

C++ exe引數只顯示第一個字元解決方案--C++學習

vs2010新建的工程預設是UNICODE格式的; 你寫程式碼的時候按照UNICODE的格式編碼應該就不會出現上面的問題的。 或者你把工程設定成Use Multi-Byte Character Set,方法如下: Project/工程 -> Properties在彈出對話方塊中選擇