一、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>
...
