背景
假設我們要保存一個小狗的信息到數據庫中
通常的做法
我們在使用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>