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