在上一篇博客中,我們介紹了單個參數的增刪改查,然而在實際的開發中,經常會遇到多個接口參數的情況。在之前的例子中,我們都是將多個參數合併到一個JavaBean中,但是不可能每次都爲不同的參數創建一個新的JavaBean,所以需要使用其他方式來傳遞多個參數,常見的方法有使用Map類型和使用@param註解。
使用Map類型方法主要是將需要傳遞的參數添加到一個Map集合中,再將Map集合作爲Mybatis的參數傳入,但是這種方法比較繁瑣的地方在於每次需要自己創建一個Map集合並且將需要的參數添加到集合當中。如果感興趣可以去學習一下這種方法,在這裏我們主要使用的是@param註解的方法。
一.添加方法與xml代碼
首先,我們在UserMapper接口中創建一個根據用戶ID和角色的enabled狀態獲取用戶角色信息的方法selectRolesByUserIdAndRoleEnabled,在這個方法聲明時使用@param註解。
/**
* 根據用戶ID和角色的enabled狀態獲取用戶角色
*
* @param userId
* @param enabled
* @return
*/
List<SysRole> selectRolesByUserIdAndRoleEnabled(
@Param("userId")Long userId,
@Param("enabled")Integer enabled
);
在這裏給參數配置@param註解後,Mybatis會自動將參數封裝成Map類型,而@param註解的值會成爲Map中的key,因此在sql中可以通過配置的註解值來使用參數。
接下來在對應的xml文件中添加相應的select語句。
<select id="selectRolesByUserIdAndRoleEnabled" resultType="SysRole">
select
r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime
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>
可以看到,經過@param配置後的參數在xml文件的sql中可以直接使用。但是當參數是JavaBean類型時,使用@param註解後就不能直接使用,而是要通過點取值的方式。
/**
* 根據用戶ID和角色的enabled狀態獲取用戶角色
*
* @param user
* @param role
* @return
*/
List<SysRole> selectRolesByUserIdAndRoleEnabled(
@Param("user")SysUser user,
@Param("role")SysRole role
);
通過這樣的方式來傳遞參數時,在sql語句中需要使用#{user.id}和#{role.enabled}從兩個JavaBean中取出指定屬性的值。
二.測試結果
在UserMapperTest類中我們添加selectRoleByUserIdAndRoleEnabled方法的測試方法
@Test
public void testSelectRolesByUserIdAndRoleEnabled(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
List<SysRole> userList = usermapper.selectRolesByUserIdAndRoleEnabled(1l, 1);
} finally{
sqlSession.close();
}
}
運行後測試結果如下