Mybatis省略@Param註解原理分析

環境配置:

  • jdk1.8
  • mybatis3.4.1
  • springboot2.0

起始原因:

編寫mybatis的Demo程序時,mapper傳遞多參數時,需要添加@param註解指定傳遞參數名稱,而在springboot整合的mybatis則可以省略@param註解。於是乎,開始探究原因。

涉及到的知識點:

jdk8新增瞭-parameters參數,開啟此參數可以將編譯後的class文件保留源碼中的參數名稱,而不是(arg0,arg1)。保留參數名稱方便判斷反射參數。此處便運用在Mybatis中mapper接口傳參中。

1、新建mybatis的Demo項目

編寫UserMapper.java,這裡省略@Param註解。

public interface UserMapper {
    User getUser(String username, String password);
}

編寫測試類

public class MyBatisTest {
    @Test
    public void testCrud() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User admin = mapper.getUser("admin", "123456");
        System.out.println(admin);
    }
}

Debug路線如下: 直接上圖

此時參數封裝的結構為:

然後就不出意外的報錯瞭

那麼如何解決呢?

2、添加-parameters參數後的執行結果如下

在pom文件添加插件並參加參數,參數的意義: 讓編譯器在編譯代碼時,保留參數的實際名稱。

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

添加插件和參數後, 可以在idea查看編譯器添加參數的情況。

此時Mybatis封裝參數效果如下:

那麼執行結果如何呢?

沒有問題,隻是數據庫沒有匹配的數據。

那麼為什麼springboot項目我們沒有配置過這類的參數,但是也可以省略@param註解呢?

3、springboot項目為什麼不用另外配置-parameters參數呢

新建一個springboot項目(2.0.3版本)

此時就看到瞭熟悉的關鍵字。為瞭確認是否這個參數,於是乎將這一段註釋掉。

想法得到驗證。

springboot1.5.1版本沒有添加該參數。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: