【MyBatis持久层框架】MyBatis参数传递详细解读

文章目录

  • 1. 前言
  • 2. MyBatis 参数传递
  • 3. 多个参数
  • 4. 单个参数
    • 4.1 POJO类
    • 4.2 Map集合类
    • 4.3 Collection集合类型
    • 4.4 List集合类型
    • 4.5 Array类型
    • 4.6 其他类型
  • 5. 总结

1. 前言

前面在使用配置文件实现增删改查一文中,我们说到,使用 MyBatis 的 Mapper 代理开发时首先要定义一个 Mapper 接口,后面会使用该接口的代理对象来执行 sql,而执行 sql 的方法就定义在该 Mapper 接口中。

【MyBatis持久层框架】MyBatis参数传递详细解读_第1张图片

在查询数据详情时,我们往方法中传入了 一个整数类型的值,用户接收需要查询的数据的主键 id ,然后根据这个 id 来查询数据库中的信息。

那么,你有没有思考过,在 MyBatis 的接口方法中可以接收哪些类型的参数呢?具体的是怎么实现的呢?这篇文章我们详细探讨 MyBatis 参数传递。

2. MyBatis 参数传递

MyBatis 的接口方法可以接收各种各样的参数,大概可以分为以下几类:

【MyBatis持久层框架】MyBatis参数传递详细解读_第2张图片

下面分类做详细的探讨。

3. 多个参数

在 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 注解时有自己的默认命名规则,其每个参数都有两个对应的不同的键,如下:

  • 以 arg 开头:arg0,arg1…
  • 以 param 开头:param1,param2…

示例:在接口方法中传入两个参数时:

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 注解的方式,这个具有更高的代码可读性。

4. 单个参数

4.1 POJO类

POJO 类作为接口方法的形参时,可以直接使用,但是要求实体类对象的属性名和参数占位符名称一致。例如:

void add(Student student);
<insert id="add">
     insert into student (name, gender, score_english, score_math)
     values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
insert>

4.2 Map集合类

Map 集合类作为接口方法的形参时,可以直接使用,但是要保证 Map 集合的键名和参数占位符名称一致。例如:

void add(Map map);
<insert id="add">
     insert into student (name, gender, score_english, score_math)
    values (#{name}, #{gender}, #{scoreEnglish}, #{scoreMath});
insert>

4.3 Collection集合类型

使用 Collection 集合类型做为接口方法形参时,MyBatis 会将集合封装到 Map 集合中,例如:

  • map.put(“arg0”,list集合);
  • map.put(“collection”,list集合);
  • map.put(“list”,list集合);

使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.4 List集合类型

使用 List 集合类型作为接口方法的形参时,Mybatis 会将集合封装到 Map 集合中,如下:

  • map.put(“arg0”,list集合);
  • map.put(“collection”,list集合);
  • map.put(“list”,list集合);

使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.5 Array类型

使用数组作为接口方法的形参时,Mybatis 会将数组封装到 Map 集合中,如下:

  • map.put(“arg0”,数组);
  • map.put(“array”,数组);

同样地,使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

4.6 其他类型

除了上面几种类型的参数,接口方法中还可以定义很多类型的参数,例如 int 类型,使用单个 int 类型的参数时,参数占位符的命名没有约束,但是要尽量满足 Java 标识符命名见名知意的规则。

例如:

void deleteById(int id);
<delete id="deleteById">
    delete from student where id=#{key};
delete>

5. 总结

Mapper 接口方法中可以接收各种各样的参数,不同参数的使用方式并不相同。在使用例如 int 类型的参数时,参数占位符可以是任何名称,但是尽量保证见名知意。

使用 Collection ,List 类的集合或者数组时,其会被封装为 Map 集合对象,在该 Map 集合中,每种类型都有对应的默认键名,但是这种方式在开发中并不方便,我们可以使用 @param 注解的方式可以替换 Map 集合中默认的 arg 键名,提高代码的可读性。

如果参数是 Map 集合类型,则可以直接使用,前提是要保证 Map 集合的键名和参数占位符一致,同样地,参数是 POJO 实体类时,也可以直接使用,但是要保证实体类对象的属性和参数占位符名称一致。

感谢点赞三连,下期见。

你可能感兴趣的:(JavaWeb基础教程系列,mybatis,java,mysql)