Mybatis${}、#{}及使用#{}時指定jdbcType


一、Mybatis 的Mapper.xml語句中parameterType向SQL語句傳參有兩種方式:#{}和${}

我們經常使用的是#{},一般解說是因為這種方式可以防止SQL注入,簡單的說#{}這種方式SQL語句是經過預編譯的,它是把#{}中間的參數轉義成字符串,舉個例子:

  select * from student where student_name = #{name} 

預編譯后,會動態解析成一個參數標記符?:

  select * from student where student_name = ?

而使用${}在動態解析時候,會傳入參數字符串

  select * from student where student_name = 'lyrics'

#{}方式能夠很大程度防止sql注入,$方式無法防止Sql注入。$方式一般用於傳入數據庫對象,例如傳入表名或自己拼字符串.,一般能用#的就別用$。

舉個例子:
  select * from ${prefix}ACT_HI_PROCINST where PROC_INST_ID_ = #{processInstanceId}
  hotfolder_name LIKE '%${searchValue}%'

二、MyBatis 使用${}插入空值時,需要指定JdbcType 

  mybatis insert空值報空值異常,但是在pl/sql不會提示錯誤,主要原因是mybatis無法進行轉換,在執行SQL時MyBatis會自動通過對象中的屬性給SQL中參數賦值,它會自動將Java類型轉換成數據庫的類型。而一旦傳入的是null它就無法准確判斷這個類型應該是什么,就有可能將類型轉換錯誤,從而報錯。要解決這個問題,需要針對這些可能為空的字段,手動指定其轉換時用到的類型。一般情況下,我們沒有必要按個字段去識別/判斷它是否可以為空,而是將所有的字段都當做可以為空,全部手動設置轉換類型。

<insert id="save"
  parameterType="com.tarena.entity.Cost">
  insert into cost values(
  cost_seq.nextval,
  #{name,jdbcType=VARCHAR},
  #{base_duration,jdbcType=INTEGER},
  #{base_cost,jdbcType=DOUBLE},
  ...
  )
</insert>

寫成這樣就可以了,而不必寫成大量
<if test="name != null">
  #{name}
</if>
...
 


免責聲明!

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



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