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属性值。

相关推荐
源代码•宸2 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
云和数据.ChenGuang2 小时前
PHP-FPM返回的File not found.”的本质
开发语言·php·运维工程师·运维技术
It's now2 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈2 小时前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin2 小时前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎3 小时前
翻之矩阵中的行
java·算法
yangpipi-3 小时前
《C++并发编程实战》 第4章 并发操作的同步
开发语言·c++
火钳游侠3 小时前
java单行注释,多行注释,文档注释
java·开发语言