Mybatis 中传递对象参数
# 80.Mybatis 中传递对象参数
我们之前传参都是基本类型(String,Integer....),其实也可以传递对象,Mybatis 使用 OGNL 表达式解析对象字段的值。
# OGNL
OGNL 是 Apache 提出的概念,全称 Object Graphic Navigation Language,对象图导航语言,它是通过对象的取值方法来获取数据,在写法上把 get 给省略了。
比如我们要获取用户的名称,在 Java 代码中的写法:user.getUsername()
,而使用 OGNL 表达式写法:user.username
。如果 username 是一个对象,还可以继续使用,例如 user.username.firstname
而我们之前使用 Mybatis 的时候,为什么没有前面前缀 user.
?这是因为在 parameterType 中已经提供了属性所属的类,所以此时不需要写对象名,而是可以直接写:#{sex}
,例如:
<insert id="saveUser" parameterType="com.peterjxl.domain.User">
insert into user(username, address, sex, birthday) values (#{username}, #{address}, #{sex}, #{birthday})
</insert>
1
2
3
2
3
# 传递 JavaBean 对象
我们的查询,有时候不仅仅涉及到一个表,更可能涉及到多表查询;同理,我们的 parameterType 涉及到的也可能不仅仅是一个类。
此时,我们可以自定义一个查询对象,该对象包含了查询时要赋值的属性,然后我们查询时传递该对象就可以了。
我们来做一个实际的例子吧。新建 QueryVo 类,用来传参:
package com.peterjxl.domain;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在 IUserDao 接口中新增方法:
/**
* 根据 QueryVo 中的条件查询用户
* @param vo
* @return
*/
List<User> findUserByVo(QueryVo vo);
1
2
3
4
5
6
2
3
4
5
6
在 IUserDao.xml 里添加一个 select 标签:然后就可以使用 OGNL 表达式了
<!-- 根据QueryVo的条件查询用户-->
<select id="findUserByVo" parameterType="com.peterjxl.domain.QueryVo" resultType="com.peterjxl.domain.User">
select * from user where username like #{user.username}
</select>
1
2
3
4
2
3
4
在测试里新增测试方法:
/**
* 测试使用 QueryVo 作为查询条件
*/
@Test
public void testFindByVo(){
User user = new User();
user.setUsername("mybatis%");
QueryVo vo = new QueryVo();
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 源码
所有代码已上传到了 GitHub (opens new window) 和 Gitee (opens new window) 上,并且创建了分支 demo8,读者可以通过切换分支来查看本文的示例代码。
上次更新: 2024/10/1 21:14:36