在一次正常的發(fā)布后,線上出現(xiàn)了這么一條錯(cuò)誤信息:
這是mybatis參數(shù)綁定的時(shí)候找不到參數(shù)了柒爵,可是在開發(fā)環(huán)境明明是正常的呀刀崖,查詢了相關(guān)資料后發(fā)現(xiàn)這種情況需要使用@Param指定參數(shù)的別名餐茵。
默認(rèn)情況下康栈,Mybatis會讀取方法上的參數(shù)名稱,但是當(dāng)代碼經(jīng)過編譯后俘枫,參數(shù)名稱往往會丟失腥沽。比如:
java會把參數(shù)名編譯成var1、var2...之類的名稱鸠蚪,所有在開發(fā)環(huán)境能正常運(yùn)行的代碼今阳,編譯后在線上運(yùn)行就會出問題了师溅。
下面列舉幾種情況必須使用@Param指定參數(shù)別名的情況
1. 方法有多個(gè)參數(shù)的,如:
int insert(@Param("staffName") String staffName, @Param("age") String age);
<insert id="insert" useGeneratedKeys="true">
INSERT INTO user(staff_name, age)value(#{staffName}, #{age})
</insert>
2. xml中使用了$盾舌,如:
List<User> select(@Param("order") String order);
<select id="select" resultType="java.lang.Integer">
select * from user ORDER BY ${order} desc
</select>
(使用)
3. 使用動(dòng)態(tài)SQL,如:
List<User> select(@Param("id") String id);
<select id="select" resultType="java.lang.Integer">
select * from user
<where>
<if test="id!=null">
and staff_name = #{id}
</if>
</where>
</select>
所以妖谴,這也就解釋了為什么有些接口能夠正常運(yùn)行窿锉,那就是方法只有一個(gè)參數(shù)的時(shí)候,但是為了風(fēng)格的統(tǒng)一膝舅,建議還是對每一個(gè)參數(shù)都加上@Param