參數(shù)的類型可以分為兩種:
一種是基本類型,另 一種是 JavaBean 渠抹。
當(dāng)參數(shù)是一個(gè)基本類型的時(shí)候蝙昙,它在 XML 文件中對應(yīng)的 SQL 語句只會使用 一個(gè)參數(shù),例
如 delete 方法梧却。當(dāng)參數(shù)是一個(gè) JavaBean 類型的時(shí)候奇颠,它在 XML 文件中對應(yīng)的 SQL 語句會有
多個(gè)參數(shù),例如 insert 放航、 update 方法 烈拒。
在實(shí)際應(yīng)用中經(jīng)常會遇到使用多個(gè)參數(shù)的情況 。 前面幾節(jié)的例子中广鳍,我們將多個(gè)參數(shù)合并
到一個(gè) JavaBean 中荆几,并使用這個(gè) JavaBean 作為接口方法的參數(shù)。這種方法用起來很方便赊时,但
并不適合全部的情況吨铸,因?yàn)椴荒苤粸榱藘扇齻€(gè)參數(shù)去創(chuàng)建新的 JavaBean 類,因此對于參數(shù)比較
少的情況 祖秒,還有兩種方式可以采用:
- 使用 Map 類型作為參數(shù)
- 使用@ Param 注解诞吱。
使用 Map 類型作為參數(shù)的方法舟奠,就是在 Map 中通過 key 來映射 XML 中 SQL 使用的參數(shù)
值名字, value 用來存放參數(shù)值房维,需要多個(gè)參數(shù)時(shí)沼瘫,通過 Map 的 key-va lue 方式傳遞參數(shù)值 ,由
于這種方式還需要自己手動創(chuàng)建 Map 以及對參數(shù)進(jìn)行賦值握巢,其實(shí)并不簡潔晕鹊,所以對這種方式只
做以上簡單介紹,接下來著重講解使用@ Param 注解的方式暴浦。
先來看一下 溅话,如果在接口中使用多個(gè)參數(shù)但不使用@ Param 注解會發(fā)生什么錯(cuò)誤
org.apache.ibatis.binding.BindingException:
Parameter ’userId ’ not found.
Available parameters are [0, 1, param1, param2]
這個(gè)錯(cuò)誤表示 , XML 可用的參數(shù)只有 0 歌焦、 1 飞几、 param1, param2 ,沒有 userid
paraml 和 param2 都是 MyBatis 根據(jù)參數(shù)位置自定義的名字独撇,這時(shí)如果將 XML 中的#{userId}
改為#{0}或#{param1} 屑墨, 將#{enabled}改為#{1}或#{param2 },這個(gè)方法就可以被正常調(diào)
用了纷铣。這樣講只是為了讓大家理解它們之間的關(guān)系卵史,但實(shí)際上并不建議這么做 。
而建議使用@Param注解
List<SysRole> selectRo lesByUseridAndRoleEnabled( @Param (”userId”) Long userId,@Param (”enabled ”) Integer enabled);
給參數(shù)配直@ Param 注解后搜立, MyBatis 就會自動將參數(shù)封裝成 Map 類型以躯,@ Param 注解值
會作為 Map 中的 key,因此在 SQL 部分就可以通過配置的注解值來使用參數(shù)啄踊。
到這里大家可能會有一個(gè)疑問:當(dāng)只有一個(gè)參數(shù)(基本類型或擁有 Type Handler 配置的
類型)的時(shí)候忧设,為什么可以不使用注解?這是因?yàn)樵谶@種情況下(除集合和數(shù)組外) 颠通, MyBatis
不關(guān)心這個(gè)參數(shù)叫什么名字就會直接把這個(gè)唯一的參數(shù)值拿來使用址晕。
以上是參數(shù)類型比較簡單時(shí)使用@Param 注解的例子 , 當(dāng)參數(shù)類型是一些 JavaBean 的時(shí)候顿锰,
用法略有不同 將接口方法中的參數(shù)換成 JavaBean 類型谨垃,代碼如下 。
List<SysRole> selectRolesByUserAndRole(
@Param (” user ”) SysUser user,
@Param (” role ”) SysRole role);
這時(shí)撵儿,在 XML 中就不能直接使用#{userId}和#{enabled}了乘客,而是要通過點(diǎn)取值方式
使用#{user.id}和#{role.enabled}從兩個(gè) JavaBean 中取出指定屬性的值 。