MyBatis傳入引數與parameterType
Mybatis的Mapper檔案中的select、insert、update、delete元素中有一個parameterType屬性,用於對應的mapper介面方法接受的引數型別。
可以接受的引數型別有基本型別和複雜型別。
mapper介面方法一般接受一個引數,可以通過使用@Param註釋將多個引數繫結到一個map做為輸入引數。
- 簡單資料型別
mapper介面方法:
1 User selectByPrimaryKey(Integer id);
sql對映:
1 2 3 4 5 6 <
select
id
=
"selectByPrimaryKey"
resultMap
=
"BaseResultMap"
parameterType
=
"java.lang.Integer"
>
select
<
include
refid
=
"Base_Column_List"
/>
from base.tb_user
where id = #{id,jdbcType=INTEGER}
</
select
>
對於簡單資料型別,sql對映語句中直接#{變數名}這種方式引用就行了,其實這裡的”變數名”可以是任意的。mapper介面方法傳遞過來的值,至於其叫什麼名字其實是不可考也沒必要知道的。
而且JAVA反射只能獲取方法引數的型別,是無從得知方法引數的名字的。比如上面這個示例中,使用#{id}來引用只是比較直觀而已,使用其他名字來引用也是一樣的。所以當在if元素中test傳遞的引數時,就必須要用_parameter來引用這個引數了。像這樣:
1 2 3 4 5 6 7 8 <
select
id
=
"selectByPrimaryKey"
resultMap
=
"BaseResultMap"
parameterType
=
"java.lang.Integer"
>
select
<
include
refid
=
"Base_Column_List"
/>
from tb_user
<
if
test
=
"_parameter != 0"
>
where id = #{id,jdbcType=INTEGER}
</
if
>
</
select
>
如果test測試條件中使用id就會提示錯誤,因為這個引數其實沒有名字,只是一個值或引用而已,只能使用_parameter來引用。
- 物件型別
傳入JAVA複雜物件型別的話,sql對映語句中就可以直接引用物件的屬性名了,這裡的屬性名是實實在在的真實的名字,不是隨意指定的。
mapper介面方法:1 int
insert(User user);
sql對映:
1 2 3 <
insert
id
=
"insert"
parameterType
=
"User"
useGeneratedKeys
=
"true"
keyProperty
=
"id"
>
insert into tb_user (name, sex)
values (#{name,jdbcType=CHAR}, #{sex,jdbcType=CHAR})
雖然可以明確的引用物件的屬性名了,但如果要在if元素中測試傳入的user引數,仍然要使用_parameter來引用傳遞進來的實際引數,因為傳遞進來的User物件的名字是不可考的。如果測試物件的屬性,則直接引用屬性名字就可以了。
測試user物件:
1 <
if
test
=
"_parameter != null"
>
測試user物件的屬性:
1 <
if
test
=
"name != null"
>
- map型別
傳入map型別,直接通過#{keyname}就可以引用到鍵對應的值。使用@param註釋的多個引數值也會組裝成一個map資料結構,和直接傳遞map進來沒有區別。
mapper介面:
1 int
updateByExample(
@Param
(
"user"
) User user,
@Param
(
"example"
) UserExample example);
sql對映:
1 2 3 4 5 6 7 <
update
id
=
"updateByExample"
parameterType
=
"map"
>
update tb_user
set id = #{user.id,jdbcType=INTEGER},
...
<
if
test
=
"_parameter != null"
>
<
include
refid
=
"Update_By_Example_Where_Clause"
/>
</
if
>
注意這裡測試傳遞進來的map是否為空,仍然使用_parameter
- 集合型別
You can pass a List instance or an Array to MyBatis as a parameter object. When you do, MyBatis will automatically wrap it in a Map, and key it by name. List instances will be keyed to the name “list” and array instances will be keyed to the name “array”.
可以傳遞一個List或Array型別的物件作為引數,MyBatis會自動的將List或Array物件包裝到一個Map物件中,List型別物件會使用list作為鍵名,而Array物件會用array作為鍵名。
集合型別通常用於構造IN條件,sql對映檔案中使用foreach元素來遍歷List或Array元素。
mapper介面:
1 User selectUserInList(List<Interger> idlist);
sql動態語句對映:
1 2 3 4 5 6 7 8 9 <
select
id
=
"selectUserInList"
resultType
=
"User"
>
SELECT *
FROM USER
WHERE ID in
<
foreach
item
=
"item"
index
=
"index"
collection
=
"list"
open
=
"("
separator
=
","
close
=
")"
>
#{item}
</
foreach
>
</
select
>
- 物件型別中的集合屬性
對於單獨傳遞的List或Array,在SQL對映檔案中對映時,只能通過list或array來引用。但是如果物件型別有屬性的型別為List或Array,則在sql對映檔案的foreach元素中,可以直接使用屬性名字來引用。
mapper介面:1 List<User> selectByExample(UserExample example);
sql對映檔案:
1 2 3 <
where
>
<
foreach
collection
=
"oredCriteria"
item
=
"criteria"
separator
=
"or"
>
<
if
test
=
"criteria.valid"
>
在這裡,UserExample有一個屬性叫oredCriteria,其型別為List,所以在foreach元素裡直接用屬性名oredCriteria引用這個List即可。
item=”criteria”表示使用criteria這個名字引用每一個集合中的每一個List或Array元素