淺談Mybatis獲取參數(shù)值的方式
Mybatis獲取參數(shù)值的兩種方式:${},#{}
- ${}本質(zhì):字符串拼接,注意:?jiǎn)我?hào)要加上
- #{}:本質(zhì):占位符賦值
一、 Mybatis獲取參數(shù)值的各種情況
1.mapper接口方法的參數(shù)為單個(gè)字面量的類(lèi)型
/** * 根據(jù)用戶名來(lái)查詢(xún)信息 * @return */ User getUsername(String username);
既然傳入的參數(shù)有多個(gè),那么肯定也是可以傳入多個(gè)參數(shù)的,接下來(lái)我們來(lái)看一下獲取參數(shù)的第二種情況
2.mapper接口方法的參數(shù)有多個(gè)
/** * 通過(guò)用戶名和密碼進(jìn)行驗(yàn)證登錄 */ User checkLogin(String username,String password);
@Test public void testCheckLogin() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(true); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.checkLogin("李四", "123859"); System.out.println(user); }
下面這個(gè)是報(bào)錯(cuò)信息
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]
Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]
Mybatis檢測(cè)到我們的參數(shù)有多個(gè)的時(shí)候,它會(huì)自動(dòng)把參數(shù)放到Map集合中
如果想要獲得數(shù)據(jù),就應(yīng)該通過(guò)下面的方法
這里有一個(gè)注意點(diǎn):
剛剛的報(bào)錯(cuò)信息Available parameters are [arg1, arg0, param1, param2]
這就說(shuō)明了,arg1,param1它們是存儲(chǔ)在一起的,所以我們其實(shí)是可以混合使用者兩個(gè)的
使用${}來(lái)獲取參數(shù)值的使用方式是一樣的,這里就不演示了,大家可以自己試試,不過(guò)再次強(qiáng)調(diào):${}本質(zhì)是字符串拼接,我們使用的時(shí)候記得加上單引號(hào)
總結(jié):第二中方式就是通過(guò)mybatis自定義的key來(lái)訪問(wèn)數(shù)據(jù),下面的第三種方式我們可以自定義key來(lái)訪問(wèn)
3.手動(dòng)把參數(shù)放在map集合中
如果mapper接口中的方法的參數(shù)有多個(gè)的時(shí)候,我們可以手動(dòng)把參數(shù)放在map集合中存儲(chǔ)
mapper接口中定義的方法 User checkLoginByMap(Map<String,Object> map);
測(cè)試程序
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(true); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); Map<String, Object> map = new HashMap<>(); map.put("username","張三"); map.put("password","123456"); User user=mapper.checkLoginByMap(map); System.out.println(user);
總結(jié):第三種方式:我們可以自定義key來(lái)訪問(wèn),技巧:mapper接口的方法參數(shù)是map集合,我們?cè)跍y(cè)試程序的時(shí)候,存儲(chǔ)數(shù)據(jù)的時(shí)候,可以指定存儲(chǔ)的key的值
還有一種獲取參數(shù)值的形式就是,前端通過(guò)表單把完整數(shù)據(jù)傳給后端,我們可以獲取數(shù)據(jù),并且把數(shù)據(jù)存到對(duì)應(yīng)的實(shí)體類(lèi)中, 這個(gè)時(shí)候,當(dāng)我們調(diào)用service方法,那么傳輸過(guò)來(lái)的數(shù)據(jù)應(yīng)該就是實(shí)體類(lèi)對(duì)象。實(shí)體類(lèi)對(duì)象是屬性名=值這樣來(lái)存儲(chǔ)數(shù)據(jù),map集合是key=value的形式來(lái)存儲(chǔ)數(shù)據(jù),這兩種方式存儲(chǔ)數(shù)據(jù)其實(shí)是很像的
4.mapper接口方法的參數(shù)是實(shí)體類(lèi)型的參數(shù)
/** * 添加用戶信息 */ int insertUser(User user);
@Test public void testInsertUser() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(true); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user=new User(); user.setId(15); user.setUsername("錢(qián)七"); user.setPassword("5613"); int i = mapper.insertUser(user); System.out.println(i); }
總結(jié):通過(guò)#{}或${}以屬性的方式來(lái)訪問(wèn)屬性值,再次強(qiáng)調(diào)${}的單引號(hào)問(wèn)題,需要注意。如果我們#{}括號(hào)里面的值不是屬性名那么就會(huì)報(bào)錯(cuò)
5.通過(guò)@Param注解命名參數(shù)(比較常用)
使用@Param注解來(lái)命名參數(shù),此時(shí)Mybatis會(huì)把這些參數(shù)放在一個(gè)map集合中,以?xún)煞N方式來(lái)進(jìn)行存儲(chǔ)
①@Param注解的值為鍵,參數(shù)為值
②以param1,param2…作為鍵,以參數(shù)為值
我們只需要通過(guò)#{}和${} 以鍵的形式來(lái)訪問(wèn)值就可以了
測(cè)試
username,@Param("password") String password);--> <select id="checkLoginByParam" resultType="com.atguigu.mybatis.pojo.User"> select * from t_user where username=#{param1} and password= #{password}; </select>
注意點(diǎn):這個(gè)時(shí)候,存儲(chǔ)的key,value形式有兩種,一種形式的key是我們職工時(shí)候通過(guò)注解來(lái)命名的參數(shù)的名字,還有一種就是以param1,param2……作為key,所以這兩種形式都可以用來(lái)取數(shù)據(jù),不可以用arg0,arg1的形式來(lái)獲取數(shù)據(jù),要和情況2區(qū)分開(kāi)
二、總結(jié)
上面講的五種情況,可以歸結(jié)為兩種情況,一種是參數(shù)類(lèi)型為實(shí)體類(lèi)型,第二種類(lèi)型是通過(guò)@Param注解來(lái)命名參數(shù)
三、Param源碼分析
由于我也是剛學(xué)習(xí)Mybatis的相關(guān)內(nèi)容,所以理解可能不夠到位,這里我推薦大家可以看這篇文章MyBatis源碼解讀 - @Param注解。
以后,我還會(huì)回頭來(lái)更新Mybatis源碼相關(guān)的內(nèi)容,初學(xué)者的話,大家先以熟練使用為主,然后再慢慢的理解其中底層的原理,不要一下子就鉆進(jìn)源碼中,這樣可能導(dǎo)致畏難心理,這是我的一點(diǎn)體會(huì)。
到此這篇關(guān)于淺談Mybatis獲取參數(shù)值的方式的文章就介紹到這了,更多相關(guān)Mybatis獲取參數(shù)值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文)
這篇文章主要介紹了史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文),需要的朋友可以參考下2016-12-12HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼
下面小編就為大家?guī)?lái)一篇HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Java使用x-www-form-urlencoded發(fā)請(qǐng)求方式
在開(kāi)發(fā)中經(jīng)常使用JSON格式,但遇到x-www-form-urlencoded格式時(shí),可以通過(guò)重新封裝處理,POSTMan和APIpost工具中對(duì)此編碼的稱(chēng)呼不同,分別是x-www-form-urlencoded和urlencoded,分享這些經(jīng)驗(yàn)希望對(duì)他人有所幫助2024-09-09SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳
這篇文章主要介紹了SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)實(shí)現(xiàn)文件上傳,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下2021-04-04java中Hibernate面試知識(shí)點(diǎn)整理
在本篇文章里小編給大家整理的是一篇關(guān)于java中Hibernate面試知識(shí)點(diǎn)整理內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01idea創(chuàng)建spring boot工程及配置文件(最新推薦)
本文給大家介紹idea創(chuàng)建spring boot工程及配置文件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11Java中數(shù)組的一些常見(jiàn)操作和技巧分析
這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的一些常見(jiàn)操作和技巧分析的相關(guān)資料,數(shù)組(Array)是Java中的一種引用數(shù)據(jù)類(lèi)型,是多個(gè)相同類(lèi)型數(shù)據(jù)一定順序排列的集合,并使用一個(gè)名字命名,并通過(guò)編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理,需要的朋友可以參考下2023-08-08