映射器的主要元素

本章介绍 select 元素中传递多个参数的处理方式。

测试类:com.yjw.demo.MulParametersTest

使用 Map 传递参数(不建议使用)

使用 MyBatis 提供的 Map 接口作为参数来实现。

StudentDao

/**
* 使用 Map 传递参数
*
* @param params
* @return
*/
List<StudentDO> listByMap(Map<String, String> params);

StudentMapper.xml

<!-- 使用 Map 传递参数 -->
<select id="listByMap" parameterType="map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_student
<where>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
<if test="selfcardNo != null">
AND selfcard_no = #{selfcardNo}
</if>
</where>
</select>

这个方法虽然简单,但是有一个弊端:这样设置的参数使用 Map,而 Map 需要键值对应,由于业务关联性不强,造成代码可读性低。

使用注解方式传递参数(参数少时可以使用)

使用 MyBatis 的参数注解 @Param(org.apache.ibatis.annotations.Param)来实现想要的功能。

StudentDao

/**
* 使用注解方式传递参数
*
* @param name
* @param sex
* @return
*/
List<StudentDO> listByParamAnnotation(@Param("name") String name,
@Param("sex") Sex sex);

StudentMapper.xml

把映射器的 XML 修改为无需定义参数类型。

<!-- 使用注解方式传递参数 -->
<select id="listByParamAnnotation" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_student
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
</where>
</select>

当我们把参数传递给后台的时候,通过 @Param 提供的名称 MyBatis 就会知道 #{name} 代表 name参数,参数的可读性大大提高了。但是这回引起另一个麻烦,一条 SQL 拥有 10 个参数的查询,如果我们都使用 @Param 方式,那么参数将十分复杂,可读性依旧不高,不过 MyBatis 为我们提供了 JavaBean 定义参数的方式来解决这个问题。

使用 JavaBean 传递参数

在参数过多的情况下,MyBatis 允许组织一个 JavaBean,通过简单的 setter 和 getter 方法设置参数,这样就可以提高我们的可读性。

首先,定义一个 StudentQuery 的 JavaBean

public class StudentQuery extends PageQuery {

    private List<Long> ids;

    private String name;

    private Byte sex;

    private Long selfcardNo;

    // get set 方法

}

StudentDao

/**
* 根据条件获取学生信息
*
* @param studentQuery
* @return
*/
List<StudentDO> listByConditions(StudentQuery studentQuery);

StudentMapper.xml

<!-- 根据条件获取学生信息-->
<select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_student
<where>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
<if test="selfcardNo != null">
AND selfcard_no = #{selfcardNo}
</if>
</where>
</select>

总结

下面对各种方式加以总结,以利于我们在实际操作中的应用。

  • 使用 Map 传递参数。因为 Map 导致业务可读性的丧失,从而导致后续扩展和维护的困难,我们应该在实际的应用中果断废弃这样的传递参数的方式。
  • 使用 @Param 注解传递多个参数,这种方式的使用受到参数个数(n)的影响。当 n<= 5 时,它是最佳的传参方式,它比用 JavaBean 更好,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数多于5个时,建议使用 JavaBean 方式。

MyBatis 实用篇

MyBatis 概念

MyBatis 示例-简介

MyBatis 示例-类型处理器

MyBatis 示例-传递多个参数

MyBatis 示例-主键回填

MyBatis 示例-动态 SQL

MyBatis 示例-联合查询

MyBatis 示例-缓存

MyBatis 示例-插件

MyBatis 示例-传递多个参数的更多相关文章

  1. MyBatis 中传递多个参数的 4 种方式

    方式 1 :封装成对象入参  #{对应实体类的属性} //UserMapper.java 接口 /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @para ...

  2. Mybatis中传递多个参数的方法总结

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  3. Mybatis学习——传递Map型参数

    Spring整合Mybatis调用 public boolean editItemSales(int i_id, int i_sales) { Map<String, Object> ma ...

  4. MyBatis 示例-类型处理器

    MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...

  5. MyBatis 示例-简介

    简介 为了全面熟悉 MyBatis 的使用,整理一个 MyBatis 的例子,案例中包含了映射器.动态 SQL 的使用.本章先介绍项目结构和配置. 项目地址:链接 数据库表的模型关系:链接 项目结构 ...

  6. MyBatis 示例-联合查询

    简介 MyBatis 提供了两种联合查询的方式,一种是嵌套查询,一种是嵌套结果.先说结论:在项目中不建议使用嵌套查询,会出现性能问题,可以使用嵌套结果. 测试类:com.yjw.demo.JointQ ...

  7. MyBatis 示例-缓存

    MyBatis 提供两种类型的缓存,一种是一级缓存,另一种是二级缓存,本章通过例子的形式描述 MyBatis 缓存的使用. 测试类:com.yjw.demo.CacheTest 一级缓存 MyBati ...

  8. MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...

  9. MyBatis 示例-插件

    简介 利用 MyBatis Plugin 插件技术实现分页功能. 分页插件实现思路如下: 业务代码在 ThreadLocal 中保存分页信息: MyBatis Interceptor 拦截查询请求,获 ...

随机推荐

  1. mysql5.6.27压缩版安装配置指南【个人总结】

      1..下载准备压缩包   360云盘下载地址: https://yunpan.cn/cPKyugkUcDEmP  访问密码 375b   2.解压缩,将压缩版解压到D盘 D:\mysql-5.6. ...

  2. 报错:ORA-25150:不允许对区参数执行ALERING

    alter table 表名 MOVE   storage   (     next 128   ) ; -- Add/modify columns alter table 表名 add 列名 var ...

  3. 数据结构与算法(C/C++版)【数组】

    第五章<数组> 一.概念 根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组.二维数组.….n维数组.n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用 ...

  4. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  5. 无广告版本Flash player 一枚,需要的拿走~

    无广告版本flashplayer,国内flashplayer已经被植入了广告,安装后不断的弹出广告使用体验很差,最开始还以为是电脑被恶意植入捆绑插件, 检查半天发现竟然是浏览器的flash playe ...

  6. [ngclass]、[ngstyle]、管道

    [ngclass] 动态改变一个元素的class ts: public classcolor:boolean=false; public list:any = [{title:"新闻1&qu ...

  7. [UWP] 自定义一个ItemsPanel

    在做游民星空的搜索页面的时候,需要展示搜索热点词,返回的是一个string数组的形式,然后以一种错落的方式显示,每一个Item的大小都和热点词长度一致,然后一行放不下之后就换行,描述的不太直观,直接看 ...

  8. TF-IDF算法——原理及实现

    TF-IDF算法是一种用于信息检索与数据挖掘的常用加权技术.TF的意思是词频(Term - frequency),IDF的意思是逆向文件频率(inverse Document frequency). ...

  9. C# 8 的模式匹配

    C# 7 里面的Pattern Mathing is 模式 switch 和 when C# 8 里面的Pattern Matching 使用Deconstructor 和 位置匹配模式 下面两个类T ...

  10. 详述Python序列化

    一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样.很多时候我们会有这样的需求: 把内存中的各种数据类型的 ...