主要内容:
- 在接口中只有一个参数和多个参数时,配置映射文件时应该怎么取值?
- @Param有什么用?
- 后端怎么封装在前端传过来的数据?有哪些场景?
文章目录
一.单个参数时
可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数名,不需要经过任何处理。
二.多个参数时
1.规则
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,arg1, arg0…,值就是参数的值。
在dao层接口参数上可以加@Param,它的主要作用就是为参数起别名:
@Param(“empSn”) Long empSn
当加了参数之后MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
在XXXmap.xml中拼接sql时,就可以#{empSn}来取值了,当然不加也可以,前提是接口中只有一个参数,这时候#{}中可以随意写,但从见名知意的角度来看不要这么做;
但是当你的参数不止一个时随便写就找不到对应的参数了,此时你的的参数要么都加了@Param,要么一些加了,在后面这种情况下,加了的就可以使用新别名或者param1到paramN,没加的就只能用param1到paramN了
2.如果参数很多
2.1 多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入POJO
#{属性名}这样就可以取出POJO中的属性值了
2.2 如果不是业务逻辑的数据模型,可以传入map(不经常使用)
#{属性名}这样就是取的是传入的map中的属性名对应的属性值即key/value
Mybatis总结(7)select查询结果封装为map
2.3 如果不是业务逻辑的数据模型,可以传入To(经常使用)
自己编写一个To(trasfer object),比如分页场景:
List selectPageByQuery(BaseQuery baseQuery);
或者前端页面请求携带的参数需要被拆分来,分别填充到不同的crud方法中去执行:
public class EnteringDTO {
//可以是对象也可以是普通类型,看你前端json怎么传喽
private Tenant tenant;
private Employee employee;
private Long mealId;
}
三.传入的是Collection
会做特殊处理将传入的集合类型发封装在map中,所以不能直接通过属性[索引]来取值
比如批量删除中的场景:
<delete id="batchDelete">
DELETE FROM t_customer WHERE id IN
<foreach collection="list" item="i" open="(" close=")" separator=",">
#{i.id}
</foreach>
</delete>
void batchDelete(List<T> list);
或者:
<insert id="saveRoleAndPermission">
INSERT INTO t_role_permission(permission_sn,role_sn) VALUES
<foreach collection="permissions" item="permission" separator=",">
(#{permission.sn},#{roleSn})
</foreach>
</insert>
void saveRoleAndPermission(@Param("permissions") List<Permission> permissions, @Param("roleSn") Long roleSn);