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传递参数的更多相关文章

  1. mybatis 传递参数的方法总结

    有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml ...

  2. mybatis传递参数的方法

    一.传递一个参数 例:根据员工编号查询员工的基本信息 1.在dao接口中声明一个方法 2.在mapper中实现该方法 3.测试 /** * 传递一个参数 */ public class Test02 ...

  3. Mybatis传递参数的几种方式

    使用Map传递 优点:直接在sql中取出key即可 缺点:适用于小项目,不符合大公司规范 对象传递参数 优点:符合标准规范 缺点:麻烦 3.只有一个基本类型参数的情况下,直接在sql中取中 4.多个参 ...

  4. mybatis传递参数到mapping.xml

    第一种方案 ,通过序号传递 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id ...

  5. Mybatis传递参数的三种方式

    第一种: Dao层使用@Param注解的方法 VersionBox getVersionByVersionNumAndVersionType(@Param("versionNum" ...

  6. mybatis 传递参数的两种方式与模糊匹配 很重要

  7. MyBatis(二):Select语句传递参数的集中方案

    从别人说的方案中看出,传递参数方案还挺多,不如自己整理下,以便以后使用过程中有个笔记回忆录. 1.传递一个参数的用法: 配置文件 <select id="getById" r ...

  8. Mybatis 传递多个参数

    Mybatis提供了4种传递多个参数的方法: 1 Map sql语句 接口 调用方法 这个方法虽然简单易用,但是存在一个弊端:Map存储的元素是键值对,可读性不好. 2 注解 使用MyBatis的参数 ...

  9. MyBatis DAO层传递参数到mapping.xml 几种方式

    Dao层传递参数到mapping.xml文件的几种方式:(Mybatis传值总结) 第一种:传递单个参数 Dao层Code片段: /** * 根据articleId查询XXXX详情. * * @par ...

随机推荐

  1. Java知多少(56)线程模型

    Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程.实际上,Java使用线程来使整个环境异步.这有利于通过防止CPU循环的浪费来减少无效部分. 为更好的理解多线程环境的优势可以将它与它 ...

  2. Java知多少(102)多媒体基础

    本节介绍 Java程序播放幻灯片和动画,播放声音和视频的方法. 播放幻灯片和动画 用实例说明播放幻灯片和动画的方法. [例 12-7]小应用程序先将幻灯片读入数组在存储,单击鼠标变换幻灯片,逐张显示. ...

  3. 短信文本查找之 MATCH 与 LIKE

    最近发现原生短信应用的搜索功能的搜索结果十分不准确,所以就开始追踪代码: 关于android searchview的使用这里就不描述了,简单说一下,android的searchVIew是支持autoc ...

  4. Oracle HAVING子句 - 转

    使用 HAVING 子句选择行 HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似.WHERE 子句搜索条件在进行分组操作之前应用:而 ...

  5. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  6. MySQL临时表创建及旧表建新表

    1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: C ...

  7. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  8. 不可思议的颜色混合模式 mix-blend-mode (转)

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  9. 图表统计FusionCharts

    工作中用的图形统计,用的FusionCharts,发现Chenssy总结了很详细了,特此记录一下.tks Chenssy. tks: http://www.cnblogs.com/chenssy/ar ...

  10. mui---获取入口文件对象

    在做APP的时候,发现在Hbuilder里面,如果是已经加载过的页面,可以通过 plus.webview.getWebviewById(id),拿到加载的页面对象,这里的id默认是url,但是入口文件 ...