MyBatis在Mapper中传递多个参数的四种方法详解

1、若Dao层函数有多个参数,那么其对应的xml中,#{0}代表接收的是Dao层中的第一个参数,#{1}代表Dao中的第二个参数,以此类推。

假设Dao层函数有两个参数,分别是int类型的id和String类型的name:

1

2

3

4

5

6

// Dao层函数

public User getUserByIdAndName(int id, String name);

<!--对应的Mapper中-->

<select id="getUserByIdAndName" resultType="User">

  SELECT * FROM user WHERE id = #{0} AND name = #{1}

</select>

复制

2、使用@Param注解,在Dao层函数的参数前面添加@Param注解来显式指定每个参数的名称,例如:

1

2

3

4

5

6

// Dao层函数

public User getUserByIdAndName(@Param("id") int id, @Param("name") String name);

<!-- 对应的Mapper中 -->

<select id="getUserByIdAndName" resultType="User">

  SELECT * FROM user WHERE id = #{id} AND name = #{name}

</select>

3、将多个参数封装成Map并传递到Mapper中,例如:

1

2

3

4

5

6

// Dao层函数

public User getUser(Map<String, Object> map);

<!-- 对应的Mapper中 -->

<select id="getUser" resultType="User">

  SELECT * FROM user WHERE id = #{id} AND name = #{name}

</select>

调用该函数时需要将参数封装成Map并设置key值为"id"和"name",例如:

1

2

3

4

Map<String, Object> map = new HashMap<>();

map.put("id", 1);

map.put("name", "张三");

User user = userDao.getUser(map);

4、如果Dao层函数传递的是一个对象,该对象包含多个参数,MyBatis会将该对象看做是一个参数,并且会自动地将对象中的属性值映射到Mapper中的SQL语句中。

以查询用户信息为例,假设我们有一个User类,包含id、name和age三个属性:

1

2

3

4

5

6

public class User {

    private int id;

    private String name;

    private int age;

    // 省略getter和setter方法

}

在Dao层函数中,我们可以直接传入一个User对象作为参数:

1

public User getUser(User user);

在Mapper.xml文件中,可以使用类似以下的SQL语句:

1

2

3

<select id="getUser" resultType="com.example.User">

  SELECT * FROM user WHERE id = #{id} AND name = #{name} AND age = #{age}

</select>

在执行Dao层函数时,MyBatis会自动地根据user对象中的属性值,将#{id}、#{name}和#{age}替换为对应的属性值。例如:

1

2

3

4

5

User user = new User();

user.setId(1);

user.setName("张三");

user.setAge(20);

User result = userDao.getUser(user);

在执行上述代码时,MyBatis会将Mapper.xml中的SQL语句解析成如下形式:

1

SELECT * FROM user WHERE id = 1 AND name = '张三' AND age = 20

然后执行该SQL语句,并将结果映射成User对象返回。

具体实现原理是通过MyBatis的OGNL表达式(Object-Graph Navigation Language,即对象图导航语言)实现的。当我们在Mapper.xml文件中使用#{propertyName}时,MyBatis会使用OGNL表达式解析该表达式,找到对应的属性值,并将其替换到SQL语句中。

例如,在上述例子中,当我们使用#{id}、#{name}和#{age}时,MyBatis会使用OGNL表达式从Map中获取key分别为"id"、"name"和"age"的value,也就是user对象中的id、name和age属性值。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-21 06:00:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-21 06:00:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-21 06:00:06       82 阅读
  4. Python语言-面向对象

    2024-02-21 06:00:06       91 阅读

热门阅读

  1. selenium XPATH 使用简单例子

    2024-02-21 06:00:06       46 阅读
  2. GoReplay中间件python版本使用

    2024-02-21 06:00:06       52 阅读
  3. 中间件-面试题

    2024-02-21 06:00:06       49 阅读
  4. Mac公证脚本-Web公证方式

    2024-02-21 06:00:06       45 阅读
  5. 三、滑动窗口问题

    2024-02-21 06:00:06       55 阅读
  6. 力扣:40. 组合总和 II

    2024-02-21 06:00:06       43 阅读
  7. Nginx被动健康检测配置

    2024-02-21 06:00:06       46 阅读
  8. flink operator 1.7 更换日志框架log4j 到logback

    2024-02-21 06:00:06       48 阅读
  9. 设计模式——单例模式8种实现

    2024-02-21 06:00:06       56 阅读
  10. 力扣爆刷第73天--动态规划

    2024-02-21 06:00:06       58 阅读
  11. vDPA资料/文档/博客 链接

    2024-02-21 06:00:06       61 阅读