mybatis 根據in條件查詢時,數據只查第一個的問題(字符串被截斷......)


先說說我遇到的問題吧:

表student有如下數據,

我想查出來stu_id in (1,2,3)的數據

mybatis代碼如下:

<SELECT id="queryMediaSourceInfo" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM  t_student WHERE stu_id IN (#{platformType})
</SELECT>

參數為1,2,3

則結果卻只查詢出了stu_id為1的學員信息。。

解決方案:將代碼改為

<SELECT id="queryMediaSourceInfo" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM  t_student WHERE stu_id IN (${platformType})
</SELECT>

  將#{} 改為${}..

原因就是#{}與${}的區別:

#{}編譯玩自動加雙引號“” 也就是變成in (“1,2,3”)

${} 編譯完是這樣的  in (1,2,3) 也就是說你傳入的是什么就顯示什么。。。

好了問題解決了。。。

所以這個問題很隱蔽,不知道這兩個區別就不容易找錯,,,,郁悶了。。。

下面是我找的區別:供以后參考

http://blog.csdn.net/u013552450/article/details/72528498

1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那么解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
  
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時的值為order by user_id,  如果傳入的值是id,則解析成的sql為order by id.
  
3. #方式能夠很大程度防止sql注入。
  
4.$方式無法防止Sql注入。

5.$方式一般用於傳入數據庫對象,例如傳入表名.
  
6.一般能用#的就別用$.

MyBatis排序時使用order by 動態參數時需要注意,用$而不是#

字符串替換
默認情況下,使用#{}格式的語法會導致MyBatis創建預處理語句屬性並以它為背景設置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}
這里MyBatis不會修改或轉義字符串。

重要:接受從用戶輸出的內容並提供給語句中不變的字符串,這樣做是不安全的。這會導致潛在的SQL注入攻擊,因此你不應該允許用戶輸入這些字段,或者通常自行轉義並檢查。

mybatis本身的說明:

String Substitution

By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:

ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.

NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore
you should either disallow user input in these fields, or always perform your own escapes and checks.

從上文可以看出:

1. 使用#{}格式的語法在mybatis中使用Preparement語句來安全的設置值,執行sql類似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

這樣做的好處是:更安全,更迅速,通常也是首選做法。

而且#{}格式的sql能夠預編譯,能再內存中保存sql語法,不用重新組裝sql語法。

2. 不過有時你只是想直接在 SQL 語句中插入一個不改變的字符串。比如,像 ORDER BY,你可以這樣來使用:

ORDER BY ${columnName}

此時MyBatis 不會修改或轉義字符串。

這種方式類似於:

Statement st = conn.createStatement();
       
      ResultSet rs = st.executeQuery(sql);

 


免責聲明!

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



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