MyBatis 示例-传递多个参数
映射器的主要元素:

本章介绍 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 中传递多个参数的 4 种方式
方式 1 :封装成对象入参 #{对应实体类的属性} //UserMapper.java 接口 /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @para ...
- Mybatis中传递多个参数的方法总结
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- Mybatis学习——传递Map型参数
Spring整合Mybatis调用 public boolean editItemSales(int i_id, int i_sales) { Map<String, Object> ma ...
- MyBatis 示例-类型处理器
MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...
- MyBatis 示例-简介
简介 为了全面熟悉 MyBatis 的使用,整理一个 MyBatis 的例子,案例中包含了映射器.动态 SQL 的使用.本章先介绍项目结构和配置. 项目地址:链接 数据库表的模型关系:链接 项目结构 ...
- MyBatis 示例-联合查询
简介 MyBatis 提供了两种联合查询的方式,一种是嵌套查询,一种是嵌套结果.先说结论:在项目中不建议使用嵌套查询,会出现性能问题,可以使用嵌套结果. 测试类:com.yjw.demo.JointQ ...
- MyBatis 示例-缓存
MyBatis 提供两种类型的缓存,一种是一级缓存,另一种是二级缓存,本章通过例子的形式描述 MyBatis 缓存的使用. 测试类:com.yjw.demo.CacheTest 一级缓存 MyBati ...
- MyBatis 示例-动态 SQL
MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...
- MyBatis 示例-插件
简介 利用 MyBatis Plugin 插件技术实现分页功能. 分页插件实现思路如下: 业务代码在 ThreadLocal 中保存分页信息: MyBatis Interceptor 拦截查询请求,获 ...
随机推荐
- jqGrid 日期格式化,只显示日期,去掉小时分
{name:'operateTime',index:'operateTime', formatter:"date", formatoptions: {newformat:'Y-m- ...
- Spring Boot(二) 配置文件
文章导航-readme 一.配置Spring Boot热部署 技术的发展总是因为人们想偷懒的心理,如果我们不想每次修改了代码,都必须重启一下服务器,并重新运行代码.那么可以配置一下热部署.有了 ...
- Chrome 调试AJAX请求返回的JS脚本
有时候会使用AJAX请求加载局部的Html页面,这个时候如果想调试局部页面中的js就比较麻烦,现在暂时发现了两种方法.第一种是在js代码中想要断点的地方加debugger,这样代码执行到此处会进入断点 ...
- Scrapy项目 - 数据简析 - 实现豆瓣 Top250 电影信息爬取的爬虫设计
一.数据分析截图(weka数据分析截图 ) 本例实验,使用Weka 3.7对豆瓣电影网页上所罗列的上映电影信息,如:标题.主要信息(年份.国家.类型)和评分等的信息进行数据分析,Weka 3.7数据分 ...
- ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者
本文翻译自:https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel ...
- python简单爬虫(爬取pornhub特定关键词的items图片集)
请提前搭好梯子,如果没有梯子的话直接403. 1.所用到的包 requests: 和服务器建立连接,请求和接收数据(当然也可以用其他的包,socket之类的,不过requests是最简单好用的) Be ...
- 序列标注(BiLSTM-CRF/Lattice LSTM)
前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...
- Redis系列---操作命令及数据类型
本章将简单介绍下,Redis里面常用的数据类型以及我们常用到的一些命令,let's go 准备环境: Redis 详细见上一个章节 我们接下来操作的命令用的是Redis自带的客户端工具,在安装red ...
- [LeetCode] 470. Implement Rand10() Using Rand7()
Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a functio ...
- C++set 和 multiset的使用
最后一个自由支配的暑假,学一些自己感兴趣的部分,也算为大三作准备. C++中set集合的使用 定义一个int类型的集合 set<int> s: set<int>::iterat ...