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。
推薦閱讀:
- 關於mybatis的一級緩存和二級緩存的那些事兒
- Java Mybatis框架增刪查改與核心配置詳解流程與用法
- Mybatis結果集映射與生命周期詳細介紹
- 淺談MyBatis執行SQL的兩種方式
- mybatis的動態SQL和模糊查詢實例詳解