MyBatis 中 @Param 註解的四種使用場景,最後一種經常被人忽略!

江南一點雨發表於2019-07-23

有一些小夥伴覺得 MyBatis 只有方法中存在多個引數的時候,才需要新增 @Param 註解,其實這個理解是不準確的。即使 MyBatis 方法只有一個引數,也可能會用到 @Param 註解。

但是,在你總結出規律之前,你可能會覺得莫名其妙,有的時候一個引數明明不用新增 @Param 註解,有的時候,卻需要新增,不新增會報錯。

有的人會覺得這是 MyBatis 各個版本差異的鍋,不可否認,MyBatis 發展很快,不同版本之間的差異還挺明顯的,不過這個加不加 @Param 註解的問題,卻並不是版本的鍋!今天鬆哥就和大家來聊一聊這個問題,到底哪些情況下需要新增 @Param 註解。

首先,如下幾個需要新增 @Param 註解的場景,相信大家都已經有共識了:

  • 第一種:方法有多個引數,需要 @Param 註解

例如下面這樣:

@Mapper
public interface UserMapper {
    Integer insert(@Param("username") String username, @Param("address") String address);
}

對應的 XML 檔案如下:

<insert id="insert" parameterType="org.javaboy.helloboot.bean.User">
    insert into user (username,address) values (#{username},#{address});
</insert>

這是最常見的需要新增 @Param 註解的場景。

  • 第二種:方法引數要取別名,需要 @Param 註解

當需要給引數取一個別名的時候,我們也需要 @Param 註解,例如方法定義如下:

@Mapper
public interface UserMapper {
    User getUserByUsername(@Param("name") String username);
}

對應的 XML 定義如下:

<select id="getUserByUsername" parameterType="org.javaboy.helloboot.bean.User">
    select * from user where username=#{name};
</select>

老實說,這種需求不多,費事。

  • 第三種:XML 中的 SQL 使用了 $ ,那麼引數中也需要 @Param 註解

$ 會有注入漏洞的問題,但是有的時候你不得不使用 $ 符號,例如要傳入列名或者表名的時候,這個時候必須要新增 @Param 註解,例如:

@Mapper
public interface UserMapper {
    List<User> getAllUsers(@Param("order_by")String order_by);
}

對應的 XML 定義如下:

<select id="getAllUsers" resultType="org.javaboy.helloboot.bean.User">
    select * from user
    <if test="order_by!=null and order_by!=''">
        order by ${order_by} desc
    </if>
</select>

前面這三種,都很容易懂,相信很多小夥伴也都懂,除了這三種常見的場景之外,還有一個特殊的場景,經常被人忽略。

  • 第四種,那就是動態 SQL ,如果在動態 SQL 中使用了引數作為變數,那麼也需要 @Param 註解,即使你只有一個引數。

如果我們在動態 SQL 中用到了 引數作為判斷條件,那麼也是一定要加 @Param 註解的,例如如下方法:

@Mapper
public interface UserMapper {
    List<User> getUserById(@Param("id")Integer id);
}

定義出來的 SQL 如下:

<select id="getUserById" resultType="org.javaboy.helloboot.bean.User">
    select * from user
    <if test="id!=null">
        where id=#{id}
    </if>
</select>

這種情況,即使只有一個引數,也需要新增 @Param 註解,而這種情況卻經常被人忽略!

好了,不知道大家有沒有 GET 到呢?有問題歡迎留言討論。

關注公眾號【江南一點雨】,專注於 Spring Boot+微服務以及前後端分離等全棧技術,定期視訊教程分享,關注後回覆 Java ,領取鬆哥為你精心準備的 Java 乾貨!

MyBatis 中 @Param 註解的四種使用場景,最後一種經常被人忽略!

相關文章