1 簡介
1.1 單參數
在 mybatis 中, 很多時候, 我們傳入接口的參數只有一個。 對應接口參數的類型有兩種, 一種是基本的參數類型, 一種是 javabean 。
例如在根據主鍵獲取對象時, 我們只需要傳入一個主鍵的參數即可。 而在插入, 更新等操作時, 一般會涉及到很多參數, 我們就使用 javabean 。
1.2 多參數
但是, 在實際的情況中, 我們遇到類似這樣的情況可能:
- 接口需要使用的參數多于一個;
- 接口需要使用的參數又遠少于對應 javabean 的成員變量, 或者需要多個 javabean 對象;
- 或者需要使用的參數對應 javabean 沒有相應的成員變量。
比如 獲取一段時間產生的日志信息, 日志對應的 javabean 只有一個日期, 那我們使用該 javabean 就無法滿足我們的要求。
又比如我們進行模糊搜索, 搜索條件只有兩個, 但對應的 javabean 有 50+ 個成員變量, 那創建對應的 javabean 就過于浪費了。
對此, 我知道的有如下幾種方法
2 多個接口參數的兩種使用方式
2.1 map 方法(不推薦)
map 方法的使用很簡單, 就是將對應的參數以 key-value 的方式存儲, key 對應 sql 中的參數名字, value 對應需要傳入的參數值。
以獲取一段時間內存儲的用戶為例
2.1.1 創建接口方法
1
2
3
4
5
6
|
/** * 獲取一段時間內的用戶 * @param params * @return */ list<student> selectbetweencreatedtime(map<string, object> params); |
該方法返回的是多個記錄, 因此使用 list 作為返回值。
2.1.2 配置對應的sql
1
2
3
4
5
6
|
<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 與 之前創建的方法名一樣。
2.1.3 調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@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(); } } } |
調用方法很簡單, 傳入相應的 map 參數即可。 此時, map 中的 key 對應。 因此, 在此例子中傳入的參數
- 傳入一個 key 為 btime 的時間, 作為開始時間;
- 傳入一個 key 為 etime 的時間, 作為結束時間;
2.2 @param 方法(推薦)
@param方法就是使用注解的方式,
2.2.1 創建接口方法
1
2
3
4
5
6
7
|
/** * 獲取指定時間內的對象 * @param pbtime 開始時間 * @param petime 結束時間 * @return */ list<student> selectbetweencreatedtimeanno( @param ( "btime" )date pbtime, @param ( "etime" )date petime); |
@param(“btime”)就是告訴 mybatis , 參數 pbtime 在 sql 語句中用 btime 作為 key 。
也就是說, mybatis 幫我們完成了調用時, 類似 params.put(“btime”, pbtime) 這個過程。
2.2.2 配置 sql 語句
1
2
3
4
5
6
|
<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 對應** @param(“btime”)** 中的 btime , 需要完全一致。
etime也是一樣。
2.2.3 調用
在調用時, 不需要創建 map 了, 只需要按參數提示傳入對應的實際參數即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@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 的優勢
map 方式的缺點就是需要手動創建 map , 并對 sql 中的參數進行賦值。其缺點:
- 手動創建 map 這個過程很不簡潔, 看著很繁瑣。
- 手動對參數進行賦值, 很容易出錯。 比如本來是要 params.put(“btime”, btime) 可能會不小心寫成 params.put(“bime”, btime) , 但是這個時候編譯器并不會提示。
相比于 map 方式, 使用 @param 時, 我們在使用上就像調用方法一樣, 傳入對應的實際參數即可。 調用時基本不會出錯。
4 github
相應代碼, 可以訪問 我的github-hellomybatis
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_37139197/article/details/82975594