MyBatis参数问题

参数的类型可以分为两种:
一种是基本类型,另 一种是 JavaBean 。
当参数是一个基本类型的时候,它在 XML 文件中对应的 SQL 语句只会使用 一个参数,例
如 delete 方法。当参数是一个 JavaBean 类型的时候,它在 XML 文件中对应的 SQL 语句会有
多个参数,例如 insert 、 update 方法 。
在实际应用中经常会遇到使用多个参数的情况 。 前面几节的例子中,我们将多个参数合并
到一个 JavaBean 中,并使用这个 JavaBean 作为接口方法的参数。这种方法用起来很方便,但
并不适合全部的情况,因为不能只为了两三个参数去创建新的 JavaBean 类,因此对于参数比较
少的情况 ,还有两种方式可以采用:

  • 使用 Map 类型作为参数
  • 使用@ Param 注解。

使用 Map 类型作为参数的方法,就是在 Map 中通过 key 来映射 XML 中 SQL 使用的参数
值名字, value 用来存放参数值,需要多个参数时,通过 Map 的 key-va lue 方式传递参数值 ,由
于这种方式还需要自己手动创建 Map 以及对参数进行赋值,其实并不简洁,所以对这种方式只
做以上简单介绍,接下来着重讲解使用@ Param 注解的方式。
先来看一下 ,如果在接口中使用多个参数但不使用@ Param 注解会发生什么错误

org.apache.ibatis.binding.BindingException:
Parameter ’userId ’ not found.
Available parameters are [0, 1, param1, param2]

这个错误表示 , XML 可用的参数只有 0 、 1 、 param1, param2 ,没有 userid
paraml 和 param2 都是 MyBatis 根据参数位置自定义的名字,这时如果将 XML 中的#{userId}
改为#{0}或#{param1} , 将#{enabled}改为#{1}或#{param2 },这个方法就可以被正常调
用了。这样讲只是为了让大家理解它们之间的关系,但实际上并不建议这么做 。
而建议使用@Param注解

List selectRo lesByUseridAndRoleEnabled(  @Param (”userId”) Long userId,@Param (”enabled ”) Integer enabled);

给参数配直@ Param 注解后, MyBatis 就会自动将参数封装成 Map 类型,@ Param 注解值
会作为 Map 中的 key,因此在 SQL 部分就可以通过配置的注解值来使用参数。
到这里大家可能会有一个疑问:当只有一个参数(基本类型或拥有 Type Handler 配置的
类型)的时候,为什么可以不使用注解?这是因为在这种情况下(除集合和数组外) , MyBatis
不关心这个参数叫什么名字就会直接把这个唯一的参数值拿来使用。

以上是参数类型比较简单时使用@Param 注解的例子 , 当参数类型是一些 JavaBean 的时候,
用法略有不同 将接口方法中的参数换成 JavaBean 类型,代码如下 。

List selectRolesByUserAndRole(
    @Param (” user ”) SysUser user,
    @Param (” role ”) SysRole role);

这时,在 XML 中就不能直接使用#{userId}和#{enabled}了,而是要通过点取值方式
使用#{user.id}和#{role.enabled}从两个 JavaBean 中取出指定属性的值 。

你可能感兴趣的:(MyBatis参数问题)