在之前的CRUD操作中,有时我们需要给SQL语句传递参数,可传递的参数如下三种:

  • 简单的类型:int
  • 传递POJO对象:user实体类
  • pojo包装类对象:

可以看到,其实我们在上一篇文章中已经传递了前两种类型的数据。另外,我们在映射配置文件中,应该使用parameterType属性表明我们要传递的类型。简单类型这里不再说了,就是我们基础知识里面提到的整型,浮点型,布尔型等数据。

1.传递POJO对象

当我们在传递一个user实体类对象作为参数的时候,Mybatis其实是用的ognl表达式来解析对象字段的值,#{}括号中的值为pojo属性名称。那什么是ognl呢?

OGNL是Apache开发的,全称为Object Graphic Navigation Language,翻译过来就是对象图导航语言,它的作用是通过对象中的取值方法(getXXX)来获取数据,在写法上,把get给省略了。

比如我们要获取用户的名称,在类中我们可以这样写:

user.getUsername();

但是OGNL表达式写法如下,他是根据属性名称就可以获取到属性的值。

user.username

而Mybatis中可以直接写username,而不用user.,这是为什么呢?因为在parameterType属性中已经提供了,此类的全限定类名。

2.传递POJO包装类对象

有时,我们使用POJO对象作为参数的载体,可能并不能携带所有的查询条件,因此我们还需要定义另外的对象来包装所有的查询条件,这时,我们就应该吧这个查询条件对象作为参数传递给Mybatis。具体怎么用呢?

2.1 新增DAO方法

/**
 * 根据queryVo中的条件查询用户
 * @param vo
 * @return
 */
int findUserByVo(QueryVo vo);

2.2 创建QueryVo类

这里我们还是需要使用姓名关键字进行模糊查询,只不过这个关键字不是我们直接指定,而是封装到了一个queryVo对象中了。这里我们先创建一个这个对象:

package com.eastnotes.domian;

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

2.3 修改映射配置文件

<!--根据QueryVo来进行模糊查询-->
<select id="findByVo" parameterType="com.eastnotes.domian.QueryVo" resultType="com.eastnotes.domian.User">
    select * from user where username like #{user.username}
</select>

在SQL语句中,我们就是用了OGNL表达式来获取QueryVo对象中的user对象的username属性

2.4 编写测试文件

/**
 * 根据QueryVo对象进行模糊查询
 */
@Test
public void testFindByVo(){
    User user = new User();
    user.setUsername("%王%");
    QueryVo vo = new QueryVo();
    vo.setUser(user);
    List<User> users = userDao.findUserByVo(vo);
    for (User u: users ){
        System.out.println(u);
    }
}

查询结果就是name包含王的所有记录。