MyBatis不用@Param傳遞多個參數

背景

假設我們要保存一個小狗的信息到數據庫中

通常的做法

我們在使用mybatis 接口和xml對應的時候,常常是這樣寫的:

  • 接口
public interface DogDao {
    void save(@Param("dogName") String dogName, @Param("age")int age);
}
  • xml
 <insert id="save">
        INSERT INTO dog
        values (null, #{dogName}, #{age});
 </insert>

因爲mybatis在執行的之後動態生成實現類,而在java中使用反射會將方法中的參數名稱擦除,所以如果在xml中要接收到規定參數名稱的參數,通過註解標識是簡單又可行的方法,一方面可以自定義方法參數的綁定,另外一方面在xml中也可以起有意義的名稱與@Param中的value對應。

如果不加@Param註解,也想用xml接收響應的參數

public interface DogDao {
    void save(Integer id, String dogName, int age);
}

由於在反射和jdk動態代理會將方法名稱抹除,所以在解析參數的時候不能像上面的xml#{dogName}這樣接收,會將參數的名稱序列化成以下方式,param1…paramn
在這裏插入圖片描述
所以在xml中我們要用以下方式來接收:

 <insert id="save">
        INSERT INTO dog
        values (null, #{param2}, #{param2});
 </insert>

不想用@Param修飾,但是希望在xml中用方法中的原參數名稱接收

我們在jdk不能使用反射獲取參數名稱,但是在jdk1.8之後提供了Parameter這個反射類,可以配置-parameter這個參數到javac編譯器上,可以用來獲取方法參數上的名稱,但是javac編譯器默認是關閉的,所以我們在編譯代碼的時候應該打開它,我們用maven插件的方式開啓
在:pom文件中加入以下插件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.8.0</version>
   <configuration>
       <compilerArgument>-parameters</compilerArgument>
       <encoding>UTF-8</encoding>
   </configuration>
</plugin>

這樣,javac編譯器就能將方法的參數在反射編譯的時候一同傳遞了,我們也不用藉助註解就能達到在xml中獲取方法中的實際參數的名稱,除了加入編譯插件,還要加入mybatis的配置開啓:

<settings>
	 <setting name="useActualParamName" value="false"/>
</settings>

官方文檔是這樣對這個配置說明的:
允許使用方法簽名中的名稱作爲語句參數名稱。 爲了使用該特性,你的項目必須採用 Java 8 編譯,並且加上 -parameters 選項。(新增於 3.4.1)

java 代碼:

public interface DogDao {
    void save(Integer id, String dogName, int age);
}

xml代碼:

 <insert id="save">
        INSERT INTO dog
        values (null, #{dogName}, #{age});
 </insert>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章