MyBatis传递参数

Posted Kmily_Lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis传递参数相关的知识,希望对你有一定的参考价值。

MyBatis传递参数

一、使用 map 接口传递参数

  在 MyBatis 中允许 map 接口通过键值对传递多个参数,把接口方法定义为

public List<Role> findRolesByMap(Map<String , Object> parameterMap);

   此时,传递给映射器的是个 map对象,使用它SQL 中设置对应的参数,如代码清单, 参数 roleName note , 要求map 的

<select id=” findRolesByMap ” parameterType=”map” resultType=”role”>
  select id, role name as roleName , note from t_role
    where role name like concat ( ’%’, #{ roleName } ,’%’)
      and note like concat ( ’%’, #{ note } ,’%’)
</select>

 

  严说,map 适用 乎所有场景 但是我们用得不多。原因有两个:首先 , map 值对合,

使用者要通过阅读它的键 才能明了其其次 ,使用 map 能限定其传递的数据类型

业务性质不强 可读性使用者要读懂代码才能知道需要传递什么参数给它

不推荐用这方式传递多参数。

 

二、使用注解传递多个参数

  MyBatis 为 开发者提供了 注解@Param ( org.apache. atis .annotations.Param ),

 以通过它去定义映射参数名称 使用它可 得到更好可读性, 方法定义为:

public List<Role> findRolesByAnnotation (@Param (”roleName” ) String rolename ,@Param (”note” ) String note) ;

 

  此时代可读性大大提高了,能明确参数 roleName 是角称,而 note 是备注 , 目了然 时候需要修改映射文件的代码,如代码清单

<select id=” findRolesByAnnotation ” resultType=”role ”>
  select 工 d , role name as roleName , note from t_role
    where role name like concat (’%’,#{ roleName },’%’)
      and note like concat ( ’% ’,#{ note },’%’)
</select>

 

  注意 ,此时并不需要给出 parameterType 性,让 MyBatis 自动探索便可以了 。如果 SQL 复杂,拥有大于 10 个参数

那么接口方法的参数个数就多了,使用起来就很不容易,不过不必担心, MyBatis 还提供传递 Java Bean 的形式。

三、通过 JavaBean 传递多个参数

  先定义一个参数的 POJO一RoleParams,如代码清单

public class RoleParams {
    private String roleName ;
    private String note ;
    /**setter and getter**/
}

 

  此时把接口方法定义为:

public List<Role> findRolesByBean(RoleParams roleParam);

 

  JavaBean 的属性 roleName 代表角色名称,而 note 代表备注 ,代码清单

<select id=”findRolesByBean”  parameterType= ”cn.lzc.ssm.mybatis.po.RoleParams” resultType=”role” >
  select id, role name as roleName, note from t_role
  where role name like concat ( ’%’, #roleName },’%’ )
  and note like concat ( ’%’, #{note }, ’%’)
</select>

 

 

四、混合使用

  在某些情况下可能需要混合使用几种方法来传递参数。举个例子,查询个角色,可以通过角色名称和备注进行查询,与此同时还需要支持分页,而分页的 POJO 实现如代清单

public class PageParams {
    private int start ;
    private int limit;
    /*******setter and getter*********/
}

 

  这个时候接口设计如下

public List<Role> findByMix (@Param (”params”) RoleParams roleParams ,@Param (”page”) PageParam PageParam) ;

 

  这样不仅是可行的,也是合理的,当然 MyBatis 也为此做了支持,把映射文件修改为如代码清单

<select id=”findByMix” resultType=”role” >
  select id, role name as roleName , note from t_role
  where role name like
  concat (’%’, #{params.roleName}, ’%’}
  and note like concat ( ’%’, #{params.note} ,’%’)
  limit #{page.start}, #{page.limit}
</select>

 

  这样就能使用混合参数了,其中 MyBatis 对 params 和 page 这Java Bean 参数提供
  EL (中间语言)支持,为编程带来了很多的便利。

 

五、总结

  描述了 4 种传递多个参数的方法,对各种方法加以点评和总结,以利于我们在实际操作中的应用。

  • 使用 map 传递参数导致了业务可读性的丧失,导致后续扩展和维护的困难,在实际的应用中要果断废弃这种方式。
  • 使用@Param 注解传递多个参数,受到参数个数 ( n )的影响。当 n<=5 时, 这是最佳的传参方式,它比用 Java Bean 更好,因为它更加直观 当 n> 5 时, 多个参数将给调用带来困难,此时不推荐使用它。
  • 当参数个数多于 5 个时,建议使用 Java Bean 方式。
  • 对于使用混合参数的,要明确参数的合理性。

 
















以上是关于MyBatis传递参数的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis--02

MyBatis传递参数

MyBatis String类型传递参数问题

Mybatis如何传递多个参数——一个莫名空指针错误引起的思考

MyBatis增删改查(步骤详细,由浅入深,适合初学者,只看这一篇就够了)

mybatis 传递参数的方法总结