【MyBatis】 MyBatis修煉之七 MyBatis XML方式的基本用法(多個接口參數(shù))

在實際應(yīng)用中送滞,我們使用的接口方法的參數(shù)不僅只有一個侠草,而且還可能是多個參數(shù),如果是 一個參數(shù)的時候犁嗅,可以分為兩種情況:一種是基本數(shù)據(jù)類型边涕,另一種是JaveBean。當(dāng)接口參數(shù)是一個基本數(shù)據(jù)類型的時候褂微,它在XML文件中對應(yīng)的SQL語句只會使用一個參數(shù)功蜓,當(dāng)接口參數(shù)是一個JavaBean類型的時候,它在XML文件中對應(yīng)的SQL語句會有多個參數(shù)宠蚂,這些參數(shù)為JavaBean的屬性式撼。

而當(dāng)接口參數(shù)為多個參數(shù)時,如果這個幾個參數(shù)都是屬于同一個JavaBean求厕,我們可以將其合并為一個JavaBean中著隆,并使用這個JavaBean作為接口方法的參數(shù),但是這種情況并不適用于所有情況甘改,我們不可能為所有的多個參數(shù)去創(chuàng)建JavaBean類旅东,因此對于參數(shù)比較少的情況,我們可以采用兩種方式:使用Map類型作為參數(shù)十艾,或使用@param注解抵代。

使用Map類型作為參數(shù)的方法,就是使用Map中的key值來映射XML中SQL使用的參數(shù)值的名字忘嫉,value就是參數(shù)值荤牍,需要多個參數(shù)時,通過Map的key-value方式傳遞參數(shù)值庆冕,由于這種方式我們在使用時都需要手動的為參數(shù)創(chuàng)建Map康吵,非常麻煩,所以我們基本不采用此種方式访递。

MyBatis參考文檔:

中文版:http://www.mybatis.org/mybatis-3/zh/index.html
英文版:http://www.mybatis.org/mybatis-3/

工具

JDK 1.6及以上版本
MyBatis 3.30版本
MySQL 6.3版本
Eclipse4 及以上版本
Apache Maven 構(gòu)建工具


項目源碼下載地址:https://github.com/JFAlex/MyBatis/tree/master/MyBatis_No.7


下面開始@param注解的使用晦嵌。
現(xiàn)在我們根據(jù)用戶id和角色的enable狀態(tài)來查詢用戶所有的角色,定義一個接口方法(此時接口參數(shù)前未加@param注解):

public List<SysRole> selectRolesByUserIdAndRoleEnabled(Long userId, Integer enabled);

這個接口方法對應(yīng)的UserMapper.xml中的代碼為:

    <select id="selectRolesByUserIdAndRoleEnabled" resultType="mybatis.simple.model.SysRole">
        select r.id,
        r.role_name roleName,
        r.enabled,
        r.create_by createBy,
        r.create_time
        createTime,
        u.user_name as "user.userName"
        from sys_user u
        inner join
        sys_user_role ur on u.id=ur.user_id
        inner join sys_role r on
        ur.role_id=r.id
        where u.id =
        #{userId} and r.enabled = #{enabled}
    </select>

然后在測試類UserMapperTest中添加測試方法:

@Test
    public void testSelectRolesByUserIdAndRoleEnabled() {
        // 獲取SqlSession
        SqlSession sqlSession = getSqlSession();

        // 獲取UserMapper接口
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 調(diào)用selectById方法拷姿,查詢id=1的用戶
            List<SysRole> roleList = userMapper.selectRolesByUserIdAndRoleEnabled(1L,1);
        } catch(Exception e){
            e.printStackTrace();
        }finally {
            // 關(guān)閉SqlSession
            sqlSession.close();
        }
    }

右鍵單擊測試類惭载,在Run As選項中選擇JUnit Test執(zhí)行測試,測試輸出日志會顯示錯誤如下响巢。

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]

這個錯誤的意思是描滔,XML可以使用的參數(shù)只有0,1踪古,param1,param2含长,沒有userId券腔。0和1,param1和param2都是MyBatis根據(jù)參數(shù)位置自定義的名字拘泞,這時如果將XML中的#{userId}改為#{0} 或者#{param1}纷纫,將#{enabled}改成#{1}或者#{param2},這個方法就可以被正常執(zhí)行了田弥,但是涛酗,我們通常情況下采用這種方式來實現(xiàn)铡原。

現(xiàn)在我們修改接口方法中的參數(shù)偷厦,添加@param注解:

public List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId")Long userId, @Param("enabled")Integer enabled);

此時XML文件中不用作任何修改,然后右鍵單擊測試類燕刻,在Run As選項中選擇JUnit Test執(zhí)行測試只泼,輸入日志:

DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1320677379.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4eb7f003]
DEBUG [main] - ==>  Preparing: select r.id, r.role_name roleName, r.enabled, r.create_by createBy, r.create_time createTime, u.user_name as "user.userName" from sys_user u inner join sys_user_role ur on u.id=ur.user_id inner join sys_role r on ur.role_id=r.id where u.id = ? and r.enabled = ? 
DEBUG [main] - ==> Parameters: 1(Long), 1(Integer)
TRACE [main] - <==    Columns: id, roleName, enabled, createBy, createTime, user.userName
TRACE [main] - <==        Row: 1, 管理員, 1, 1, 2017-08-09 15:26:52.0, admin
TRACE [main] - <==        Row: 2, 普通用戶, 1, 1, 2017-08-09 15:26:52.0, admin
DEBUG [main] - <==      Total: 2
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4eb7f003]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4eb7f003]
DEBUG [main] - Returned connection 1320677379 to pool.

現(xiàn)在可以正確獲取數(shù)據(jù)庫的數(shù)據(jù)了,這時XML文件中對應(yīng)的SQL的可用參數(shù)變成了[userID卵洗,enabled,param1十绑,param2]酷勺,如果我們把#{userID}和#{enabled}修改成#{param1}和#{param2}脆诉,也是可以通過的。

還有一個情況就是亏狰,如果參數(shù)是多個JavaBean時偶摔,將接口方法修改為JavaBean類型

public List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("user")SysUser user, @Param("role")SysRole role);

這時辰斋,在XML中我們不能直接使用#{userID}和#{enabled},而是通過#{user.userID}和#{role.enabled}從兩個JavaBean中獲取對應(yīng)的屬性值抽活。這里就不提供代碼說明了下硕。

除了以上常用的參數(shù)類型外,接口的參數(shù)還可以能是集合或者數(shù)組霜幼,有關(guān)集合和數(shù)組的用法誉尖,以后再做講解。


項目源碼下載地址:https://github.com/JFAlex/MyBatis/tree/master/MyBatis_No.7


上一篇:【MyBatis】 MyBatis修煉之六 MyBatis XML方式的基本用法(UPDATE琢感、DELETE)

下一篇:【MyBatis】 MyBatis修煉之八 MyBatis 注解方式的基本用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末探熔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柬甥,更是在濱河造成了極大的恐慌其垄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棒口,居然都是意外死亡无牵,警方通過查閱死者的電腦和手機茎毁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門七蜘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橡卤,“玉大人,你說我怎么就攤上這事柜与。” “怎么了颅悉?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迁匠。 經(jīng)常有香客問我剩瓶,道長城丧,這世上最難降的妖魔是什么延曙? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任芙贫,我火速辦了婚禮搂鲫,結(jié)果婚禮上磺平,老公的妹妹穿的比我還像新娘。我一直安慰自己拐辽,他們只是感情好拣挪,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俱诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睁搭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天舔痪,我揣著相機與錄音,去河邊找鬼滋捶。 笑死,一個胖子當(dāng)著我的面吹牛余黎,可吹牛的內(nèi)容都是我干的惧财。 我是一名探鬼主播炒考,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霎迫!你這毒婦竟也來了斋枢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤知给,失蹤者是張志新(化名)和其女友劉穎瓤帚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩赢,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡戈次,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筒扒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯邪。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖花墩,靈堂內(nèi)的尸體忽然破棺而出悬秉,到底是詐尸還是另有隱情,我是刑警寧澤冰蘑,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布和泌,位于F島的核電站,受9級特大地震影響祠肥,放射性物質(zhì)發(fā)生泄漏武氓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一仇箱、第九天 我趴在偏房一處隱蔽的房頂上張望县恕。 院中可真熱鬧,春花似錦剂桥、人聲如沸忠烛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽况木。三九已至,卻和暖如春旬迹,著一層夾襖步出監(jiān)牢的瞬間火惊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工奔垦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屹耐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像惶岭,于是被迫代替她去往敵國和親寿弱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容