Mybatis省略@Param注解原理分析
環(huán)境配置:
- jdk1.8
- mybatis3.4.1
- springboot2.0
起始原因:
編寫mybatis的Demo程序時(shí),mapper傳遞多參數(shù)時(shí),需要添加@param注解指定傳遞參數(shù)名稱,而在springboot整合的mybatis則可以省略@param注解。于是乎,開始探究原因。
涉及到的知識(shí)點(diǎn):
jdk8新增了-parameters參數(shù),開啟此參數(shù)可以將編譯后的class文件保留源碼中的參數(shù)名稱,而不是(arg0,arg1)。保留參數(shù)名稱方便判斷反射參數(shù)。此處便運(yùn)用在Mybatis中mapper接口傳參中。
1、新建mybatis的Demo項(xiàng)目
編寫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路線如下: 直接上圖
此時(shí)參數(shù)封裝的結(jié)構(gòu)為:
然后就不出意外的報(bào)錯(cuò)了
那么如何解決呢?
2、添加-parameters參數(shù)后的執(zhí)行結(jié)果如下
在pom文件添加插件并參加參數(shù),參數(shù)的意義: 讓編譯器在編譯代碼時(shí),保留參數(shù)的實(shí)際名稱。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
添加插件和參數(shù)后, 可以在idea查看編譯器添加參數(shù)的情況。
此時(shí)Mybatis封裝參數(shù)效果如下:
那么執(zhí)行結(jié)果如何呢?
沒有問題,只是數(shù)據(jù)庫沒有匹配的數(shù)據(jù)。
那么為什么springboot項(xiàng)目我們沒有配置過這類的參數(shù),但是也可以省略@param注解呢?
3、springboot項(xiàng)目為什么不用另外配置-parameters參數(shù)呢
新建一個(gè)springboot項(xiàng)目(2.0.3版本)
此時(shí)就看到了熟悉的關(guān)鍵字。為了確認(rèn)是否這個(gè)參數(shù),于是乎將這一段注釋掉。
想法得到驗(yàn)證。
springboot1.5.1版本沒有添加該參數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java計(jì)算任意位水仙花數(shù)示例(回文數(shù))
這篇文章主要介紹了java計(jì)算任意位水仙花數(shù)示例(回文數(shù)),需要的朋友可以參考下2014-05-05SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例
這篇文章主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09mybatis 查詢sql中in條件用法詳解(foreach)
這篇文章主要介紹了mybatis 查詢sql中in條件用法詳解(foreach),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java中將List拆分為多個(gè)小list集合的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中如何將List拆分為多個(gè)小list集合,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03基于ReentrantLock的實(shí)現(xiàn)原理講解
這篇文章主要介紹了ReentrantLock的實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09