一. Mybatis参数的处理
在正常的开发中,参数可能是单个参数,也可能是多个参数,也可能是实体类的对象,这些是较常见的,还有一些特殊的,比如参数是map键值对,是list,除了map和list之外还有其他的多个参数。
①单个参数(Integer empId):单个参数MyBatis不会做任何特殊处理,在SQL映射文件中使用任意的参数名称都可以取得该参数
②多个参数(String empName,Integer pageCurrent,Integer pageSIze):
首先我们测试一下多个参数,看情况:
<!--
public List<Emp> selectEmpByEmpNameLike(String empName,Integer startSize,Integer pageSize);
-->
<select id="selectEmpByEmpNameLike" resultType="com.wanbangee.entities.Emp">
select * from emp where emp_name like #{empName} limit #{startSize},#{pageSize}
</select>
控制台提示错误信息:
Available parameters are [0, 1, 2, param3, param1, param2]
以上程序运行提示:参数只有0,1,2,param2,param2,param3可用,这是因为在传递多个参数的情况下,MyBatis会将参数自动的封装成Map键值对,而且每一个参数都有两个键和两个值,这两个键不同,但是值相同,以上程序最终封装的键值对如下:
Key | value |
---|---|
0 | 第一个参数的值 |
Param1 | 第一个参数的值 |
1 | 第二个参数的值 |
Param2 | 第二个参数的值 |
2 | 第三个参数的值 |
param3 | 第三个参数的值 |
那么在我们的SQl映射文件中,#{键},在执行的时候就会传入相应的键对应的值。如下:
<!--
public List<Emp> selectEmpByEmpNameLike(String empName,Integer startSize,Integer pageSize);
-->
<select id="selectEmpByEmpNameLike" resultType="com.wanbangee.entities.Emp">
select * from emp where emp_name like #{param1} limit #{1},#{param3}
</select>
当然我们也可以给参数指定键,在接口方法的入参前使用@Param注解,给参数指定封装的Map的key,如下:
public List<Emp> selectEmpByEmpNameLike(@Param("empName")String empName,@Param("startSize")Integer startSize,@Param("pageSize")Integer pageSize);
现在注解后可以在SQL映射文件中,使用指定注解的key获得参数的值,那么默认的param1…或者0,1…还能用吗?Param1,param2…可以正常使用,0,1,2…不能使用了。
③:传递的参数是一个实体类对象:会将参数封装成一个Map键值对,键对应的是实体类对象的属性名,值对应的是该实体类属性的值。比如,传递对象为Emp,则封装的Map键值对为:
Key | value |
---|---|
empName | empName属性值 |
empMail | empMail属性值 |
empId | empId属性值 |
empGender | empGender属性值 |
deptId | deptId属性值 |
④:Map作为参数(Map<String,Object>):传入参数为Map的情况下,直接在sql映射文件中使用#{键} 就可以传递相应的值
⑤: List【Set,Array】作为参数(List):一个list参数是很好处理的,集合会被封装成键值对,键为list和collection,值为List集合的值,所以在sql映射文件中想要取得集合的某个位置的具体的值:#{list[索引位置]},#{collection[索引位置]},同理Set集合或者Array数据处理相似。
<!--
public Emp selectEmpByID2(List<Integer> ids); 去主键集合中的第一个元素作为查询条件
-->
<select id="selectEmpByID2" resultType="com.wanbangee.entities.Emp">
select * from emp where emp_id = #{collection[2]} 或者 #{list[2]}
</select>
<!--
public Emp selectEmpByID2(Integer[] ids); 去主键集合中的第一个元素作为查询条件
-->
<select id="selectEmpByID2" resultType="com.wanbangee.entities.Emp">
select * from emp where emp_id = #{array[2]}
</select>
Map,List,和其他参数(Map<String,Object>,List,String empName,Integer pageCurrent,Integer pageSIze):会将参数封装成Map键值对,而且是符合②所述多个参数的封装规则。
<!--
public List<Emp> selectEmpByEmpNameLike(String empName,Integer startSize,Integer pageSize,List<Integer> ids);
-->
<select id="selectEmpByEmpNameLike" resultType="com.wanbangee.entities.Emp">
select * from emp where emp_name like #{param1} and emp_id = #{param4[2]} limit #{1},#{2}
</select>