文章目录
Mybatis对参数的处理
最简单情况:一个参数(普通类型或对象的引用)
一个简单类型(或其包装类)的参数
public College getCollegeById(Integer id);
<select id="getCollegeById" resultMap="college">
select * from college where college_id = #{id};
</select>
一个简单类型的参数,直接使用#{参数名}
就可以使用
一个对象的引用
public void updateCollege(College college);
<update id="updateCollege">
update college set college_name = #{name} where college_id = #{id}
</update>
一个引用类型的参数,直接使用#{字段名}
就可以取出该参数的字段
多个参数
Mybatis对多个参数的处理
如果传递多个参数,Mybatis会将这多个参数封装到一个map对象。
取得参数:#{key}
,key就是map的key
参数对应的key
参数对应的key有4种:
若有N个参数,每个参数对应的key
- param1,param2 … paramN
- arg0, arg1 … argN-1
- 方法中的参数名
- 通过
@Param('key')
指定
举例:
public College getCollegeByIdAndName(Integer id, String name);
- 使用param1, param2 … paramN作为key
<select id="getCollegeByIdAndName" resultMap="college">
select * from college where college_id = #{param1} and college_name = #{param2}
</select>
- 使用arg0, arg1 … argN-1
<select id="getCollegeByIdAndName" resultMap="college">
select * from college where college_id = #{arg0} and college_name = #{arg1}
</select>
- 使用
@Param
指定key
public College getCollegeByIdAndName(@Param("cid")Integer id, @Param("cname") String name);
<select id="getCollegeByIdAndName" resultMap="college">
select * from college where college_id = #{cid} and college_name = #{cname}
</select>
- 使用参数名作为key
public College getCollegeByIdAndName(Integer id, String name);
<select id="getCollegeByIdAndName" resultMap="college">
select * from college where college_id = #{id} and college_name = #{name}
</select>
注意不要和传递一个对象的引用的情况相混淆。
使用参数名作为key的有关设置
- 开启Mybatis的
useActualParamName
选项
在全局配置文件中的<configuration>
中,进行以下配置:
当前比较高的版本,这个选项默认值为true,为了防止版本更迭对这个选项造成影响,显式地设置更保险。
<settings>
<setting name="useActualParamName" value="true"/>
</settings>
- 编译时,加入
-parameters
选项。有了这个选项,反射机制才可以获得参数名。但是,如果开启了这个选项,arg0,arg1…argN-1就不能再使用了,parm1…paramN仍然可以使用
多个参数中存在引用类型
在上面的例子中,已经知道了通过key
可以取得一个参数,对于多个参数来说,可以通过它的key
得到它。
如果它是一个对象的引用,可以通过#{key.field}来获取它的字段
public void updateCollegeWithName(College college, String name);
同样,在编译时,开启了-prameters
选项
<update id="updateCollegeWithName">
update college set college_name = #{name} where college_name = #{college.name}
</update>
因为开启了-prameters
选项,所以不能再使用arg0,arg1…argN-1
但是仍然可以使用parm1…paramN
<update id="updateCollegeWithName">
update college set college_name = #{name} where college_name = #{param1.name}
</update>
集合类型
Map类型
Map类型的集合,Mybatis会像处理多个参数一样,将map对象的每一项加入参数的map。也就是说,使用传入的map中的key,就可以的得到传入map中key对应的value。
接口定义:
public College getCollegeByIdAndNameWithMap(Map<String, Object> args);
传参:
Map<String ,Object> map = new HashMap<>();
map.put("cid", 1);//配置文件中,使用#{cid}就可以取得value(1)
map.put("cname", "计算机学院");
College c = collegeDao.getCollegeByIdAndNameWithMap(map);
配置:
<select id="getCollegeByIdAndNameWithMap" resultMap="college">
select * from college where college_id = #{cid} and college_name = #{cname}
</select>
List
如果参数的类型为List,配置文件中需要使用#{list[0].field}
获得0号下标元素的field字段(如果是简单类型,则不用指定字段)。
public void addColleges(List<College> colleges);
<insert id="addColleges">
insert into college(college_name) values (#{list[0].name});
</insert>
也可以使用collection[0].field
<insert id="addColleges">
insert into college(college_name) values (#{collection[0].name});
</insert>
数组
数组和List类似,可以使用#{array[0]}
或#c{ollection[0]}