前面在使用配置文件实现增删改查一文中,我们说到,使用 MyBatis 的 Mapper 代理开发时首先要定义一个 Mapper 接口,后面会使用该接口的代理对象来执行 sql,而执行 sql 的方法就定义在该 Mapper 接口中。
在查询数据详情时,我们往方法中传入了 一个整数类型的值,用户接收需要查询的数据的主键 id ,然后根据这个 id 来查询数据库中的信息。
那么,你有没有思考过,在 MyBatis 的接口方法中可以接收哪些类型的参数呢?具体的是怎么实现的呢?这篇文章我们详细探讨 MyBatis 参数传递。
MyBatis 的接口方法可以接收各种各样的参数,大概可以分为以下几类:
下面分类做详细的探讨。
在 MyBatis 开发中,如果接口方法中需要定义多个参数,则每个参数都要使用 @param
注解,例如:
User select(@Param("username") String username,@Param("password") String password);
<select id="select" resultType="user">
select *
from tb_user
where
username=#{username}
and password=#{password}
select>
为什么在接口方法中有多个形参时要使用注解呢?这里与 MyBatis 底层处理逻辑有关。
我们在接口方法中定义多个参数,MyBatis 会将这些参数封装为 Map 集合对象,其值就是参数值,而键在没有使用 @param
注解时有自己的默认命名规则,其每个参数都有两个对应的不同的键,如下:
示例:在接口方法中传入两个参数时:
User select(String username,String password);
第一种方式:
<select id="select" resultType="user">
select *
from tb_user
where
username=#{arg0}
and password=#{arg1}
select>
第二种方式:
<select id="select" resultType="user">
select *
from tb_user
where
username=#{param1}
and password=#{param2}
select>
如果使用了 @param
注解,则可以直接使用注解中的命名。
所以,在接口方法中定义多个参数时,尽量使用 @param
注解的方式,这个具有更高的代码可读性。
POJO 类作为接口方法的形参时,可以直接使用,但是要求实体类对象的属性名和参数占位符名称一致。例如:
void add(Student student);
<insert id="add">
insert into student (name, gender, score_english, score_math)
values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
insert>
Map 集合类作为接口方法的形参时,可以直接使用,但是要保证 Map 集合的键名和参数占位符名称一致。例如:
void add(Map map);
<insert id="add">
insert into student (name, gender, score_english, score_math)
values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
insert>
使用 Collection 集合类型做为接口方法形参时,MyBatis 会将集合封装到 Map 集合中,例如:
使用 @param
注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。
使用 List 集合类型作为接口方法的形参时,Mybatis 会将集合封装到 Map 集合中,如下:
使用 @param
注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。
使用数组作为接口方法的形参时,Mybatis 会将数组封装到 Map 集合中,如下:
同样地,使用 @param
注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。
除了上面几种类型的参数,接口方法中还可以定义很多类型的参数,例如 int 类型,使用单个 int 类型的参数时,参数占位符的命名没有约束,但是要尽量满足 Java 标识符命名见名知意的规则。
例如:
void deleteById(int id);
<delete id="deleteById">
delete from student where id=#{key};
delete>
Mapper 接口方法中可以接收各种各样的参数,不同参数的使用方式并不相同。在使用例如 int 类型的参数时,参数占位符可以是任何名称,但是尽量保证见名知意。
使用 Collection ,List 类的集合或者数组时,其会被封装为 Map 集合对象,在该 Map 集合中,每种类型都有对应的默认键名,但是这种方式在开发中并不方便,我们可以使用 @param
注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。
如果参数是 Map 集合类型,则可以直接使用,前提是要保证 Map 集合的键名和参数占位符一致,同样地,参数是 POJO 实体类时,也可以直接使用,但是要保证实体类对象的属性和参数占位符名称一致。
感谢点赞三连,下期见。