mybatis多個(gè)接口參數(shù)的注解使用方式(@Param)
1 簡(jiǎn)介
1.1 單參數(shù)
在 Mybatis 中, 很多時(shí)候, 我們傳入接口的參數(shù)只有一個(gè)。 對(duì)應(yīng)接口參數(shù)的類(lèi)型有兩種, 一種是基本的參數(shù)類(lèi)型, 一種是 JavaBean 。
例如在根據(jù)主鍵獲取對(duì)象時(shí), 我們只需要傳入一個(gè)主鍵的參數(shù)即可。 而在插入, 更新等操作時(shí), 一般會(huì)涉及到很多參數(shù), 我們就使用 JavaBean 。
1.2 多參數(shù)
但是, 在實(shí)際的情況中, 我們遇到類(lèi)似這樣的情況可能:
- 接口需要使用的參數(shù)多于一個(gè);
- 接口需要使用的參數(shù)又遠(yuǎn)少于對(duì)應(yīng) JavaBean 的成員變量, 或者需要多個(gè) JavaBean 對(duì)象;
- 或者需要使用的參數(shù)對(duì)應(yīng) JavaBean 沒(méi)有相應(yīng)的成員變量。
比如 獲取一段時(shí)間產(chǎn)生的日志信息, 日志對(duì)應(yīng)的 JavaBean 只有一個(gè)日期, 那我們使用該 JavaBean 就無(wú)法滿足我們的要求。
又比如我們進(jìn)行模糊搜索, 搜索條件只有兩個(gè), 但對(duì)應(yīng)的 JavaBean 有 50+ 個(gè)成員變量, 那創(chuàng)建對(duì)應(yīng)的 JavaBean 就過(guò)于浪費(fèi)了。
對(duì)此, 我知道的有如下幾種方法
2 多個(gè)接口參數(shù)的兩種使用方式
2.1 Map 方法(不推薦)
Map 方法的使用很簡(jiǎn)單, 就是將對(duì)應(yīng)的參數(shù)以 key-value 的方式存儲(chǔ), key 對(duì)應(yīng) SQL 中的參數(shù)名字, value 對(duì)應(yīng)需要傳入的參數(shù)值。
以獲取一段時(shí)間內(nèi)存儲(chǔ)的用戶為例
2.1.1 創(chuàng)建接口方法
/** * 獲取一段時(shí)間內(nèi)的用戶 * @param params * @return */ List<Student> selectBetweenCreatedTime(Map<String, Object> params);
該方法返回的是多個(gè)記錄, 因此使用 List 作為返回值。
2.1.2 配置對(duì)應(yīng)的SQL
<select id="selectBetweenCreatedTime" parameterType="java.util.Map" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from student where gmt_created > #{bTime, jdbcType=TIMESTAMP} and gmt_created < #{eTime, jdbcType=TIMESTAMP} </select>
id 與 之前創(chuàng)建的方法名一樣。
2.1.3 調(diào)用
@Test public void testSelectBtweenCreatedTimeMap() { Map<String, Object> params = new HashMap<>(); Calendar bTime = Calendar.getInstance(); // month 是從0~11, 所以9月是8 bTime.set(2018, Calendar.AUGUST, 29); params.put("bTime", bTime.getTime()); Calendar eTime = Calendar.getInstance(); eTime.set(2018,Calendar.SEPTEMBER,2); params.put("eTime", eTime.getTime()); SqlSession sqlSession = null; try { sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = (StudentMapper) sqlSession.getMapper(StudentMapper.class); List<Student> students = studentMapper.selectBetweenCreatedTime(params); for (int i = 0; i < students.size(); i++) { System.out.println(students.get(i)); } } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } }
調(diào)用方法很簡(jiǎn)單, 傳入相應(yīng)的 Map 參數(shù)即可。 此時(shí), Map 中的 key 對(duì)應(yīng)。 因此, 在此例子中傳入的參數(shù)
- 傳入一個(gè) key 為 btime 的時(shí)間, 作為開(kāi)始時(shí)間;
- 傳入一個(gè) key 為 etime 的時(shí)間, 作為結(jié)束時(shí)間;
2.2 @Param 方法(推薦)
@Param方法就是使用注解的方式,
2.2.1 創(chuàng)建接口方法
/** * 獲取指定時(shí)間內(nèi)的對(duì)象 * @param pbTime 開(kāi)始時(shí)間 * @param peTime 結(jié)束時(shí)間 * @return */ List<Student> selectBetweenCreatedTimeAnno(@Param("bTime")Date pbTime, @Param("eTime")Date peTime);
@Param(“bTime”)就是告訴 mybatis , 參數(shù) pbTime 在 SQL 語(yǔ)句中用 bTime 作為 key 。
也就是說(shuō), mybatis 幫我們完成了調(diào)用時(shí), 類(lèi)似 params.put(“bTime”, pbTime) 這個(gè)過(guò)程。
2.2.2 配置 SQL 語(yǔ)句
<select id="selectBetweenCreatedTimeAnno" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from student where gmt_created > #{bTime, jdbcType=TIMESTAMP} and gmt_created < #{eTime, jdbcType=TIMESTAMP} </select>
此處的 bTime 對(duì)應(yīng)** @Param(“bTime”)** 中的 bTime , 需要完全一致。
eTime也是一樣。
2.2.3 調(diào)用
在調(diào)用時(shí), 不需要?jiǎng)?chuàng)建 Map 了, 只需要按參數(shù)提示傳入對(duì)應(yīng)的實(shí)際參數(shù)即可。
@Test public void testSelectBtweenCreatedTimeAnno() { Map<String, Object> params = new HashMap<>(); Calendar bTime = Calendar.getInstance(); // month 是從0~11, 所以9月是8 bTime.set(2018, Calendar.AUGUST, 29); Calendar eTime = Calendar.getInstance(); eTime.set(2018,Calendar.SEPTEMBER,2); SqlSession sqlSession = null; try { sqlSession = sqlSessionFactory.openSession(); StudentMapper studentMapper = (StudentMapper) sqlSession.getMapper(StudentMapper.class); List<Student> students = studentMapper.selectBetweenCreatedTimeAnno(bTime.getTime(), eTime.getTime()); for (int i = 0; i < students.size(); i++) { System.out.println(students.get(i)); } } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } }
3 @Param 的優(yōu)勢(shì)
Map 方式的缺點(diǎn)就是需要手動(dòng)創(chuàng)建 Map , 并對(duì) SQL 中的參數(shù)進(jìn)行賦值。其缺點(diǎn):
- 手動(dòng)創(chuàng)建 Map 這個(gè)過(guò)程很不簡(jiǎn)潔, 看著很繁瑣。
- 手動(dòng)對(duì)參數(shù)進(jìn)行賦值, 很容易出錯(cuò)。 比如本來(lái)是要 params.put(“bTime”, bTime) 可能會(huì)不小心寫(xiě)成 params.put(“bime”, bTime) , 但是這個(gè)時(shí)候編譯器并不會(huì)提示。
相比于 Map 方式, 使用 @Param 時(shí), 我們?cè)谑褂蒙暇拖裾{(diào)用方法一樣, 傳入對(duì)應(yīng)的實(shí)際參數(shù)即可。 調(diào)用時(shí)基本不會(huì)出錯(cuò)。
4 Github
相應(yīng)代碼, 可以訪問(wèn) 我的Github-helloMybatis
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法分析
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法,結(jié)合實(shí)例形式分析了Bean的作用域singleton和prototype相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11SpringBoot使用Logback進(jìn)行日志記錄的代碼示例
在開(kāi)發(fā)Web應(yīng)用程序時(shí),日志記錄是非常重要的一部分,在SpringBoot中,我們可以使用Logback進(jìn)行日志記錄,Logback是一款高性能、靈活的日志框架,它可以滿足各種不同的日志需求,在本文中,我們介紹了如何在SpringBoot中使用Logback進(jìn)行日志記錄2023-06-06Java開(kāi)發(fā)中的OOM內(nèi)存溢出問(wèn)題詳解
這篇文章主要介紹了Java開(kāi)發(fā)中的OOM內(nèi)存溢出問(wèn)題詳解,OOM,全稱?Out?Of?Memory,意思是內(nèi)存耗盡或內(nèi)存溢出,當(dāng)JVM因?yàn)闆](méi)有足夠的內(nèi)存來(lái)為對(duì)象分配空間并且垃圾回收器也已經(jīng)沒(méi)有空間可回收時(shí),就會(huì)拋出這個(gè)?error,需要的朋友可以參考下2023-08-08springboot實(shí)現(xiàn)后臺(tái)上傳圖片(工具類(lèi))
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)后臺(tái)上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04jpa多數(shù)據(jù)源時(shí)Hibernate配置自動(dòng)生成表不生效的解決
這篇文章主要介紹了jpa多數(shù)據(jù)源時(shí)Hibernate配置自動(dòng)生成表不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02java實(shí)現(xiàn)獲取安卓設(shè)備里已安裝的軟件包
本文給大家介紹的是如何獲取設(shè)備中已經(jīng)安裝的應(yīng)用軟件包的代碼,其核心方法原理很簡(jiǎn)單,我們通過(guò)Android中提供的PackageManager類(lèi),來(lái)獲取手機(jī)中安裝的應(yīng)用程序信息2015-10-10