在實際應(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)