mybatis 多个接口参数的注解使用方式(@Param)
@
1 简介
1.1 单参数
在 Mybatis 中, 很多时候, 我们传入接口的参数只有一个。 对应接口参数的类型有两种, 一种是基本的参数类型, 一种是 JavaBean。
例如在根据主键获取对象时, 我们只需要传入一个主键的参数即可。 而在插入, 更新等操作时, 一般会涉及到很多参数, 我们就使用 JavaBean。
1.2 多参数
但是, 在实际的情况中, 我们遇到类似这样的情况可能:
- 接口需要使用的参数多于一个;
- 接口需要使用的参数又远少于对应 JavaBean 的成员变量, 或者需要多个 JavaBean 对象;
- 或者需要使用的参数对应 JavaBean 没有相应的成员变量。
比如 获取一段时间产生的日志信息, 日志对应的 JavaBean 只有一个日期, 那我们使用该 JavaBean 就无法满足我们的要求。
又比如我们进行模糊搜索, 搜索条件只有两个, 但对应的 JavaBean 有 50+ 个成员变量, 那创建对应的 JavaBean 就过于浪费了。
对此, 我知道的有如下几种方法
2 多个接口参数的两种使用方式
2.1 Map 方法(不推荐)
Map
方法的使用很简单, 就是将对应的参数以 key-value 的方式存储, key 对应 SQL 中的参数名字, value 对应需要传入的参数值。
以获取一段时间内存储的用户为例
2.1.1 创建接口方法
/**
* 获取一段时间内的用户
* @param params
* @return
*/
List<Student> selectBetweenCreatedTime(Map<String, Object> params);
该方法返回的是多个记录, 因此使用 List
作为返回值。
2.1.2 配置对应的SQL
<select id="selectBetweenCreatedTime" parameterType="java.util.Map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from student
where gmt_created > #{bTime, jdbcType=TIMESTAMP} and gmt_created < #{eTime, jdbcType=TIMESTAMP}
</select>
id 与 之前创建的方法名一样。
2.1.3 调用
@Test
public void testSelectBtweenCreatedTimeMap() {
Map<String, Object> params = new HashMap<>();
Calendar bTime = Calendar.getInstance();
// month 是从0~11, 所以9月是8
bTime.set(2018, Calendar.AUGUST, 29);
params.put("bTime", bTime.getTime());
Calendar eTime = Calendar.getInstance();
eTime.set(2018,Calendar.SEPTEMBER,2);
params.put("eTime", eTime.getTime());
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = (StudentMapper) sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.selectBetweenCreatedTime(params);
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
调用方法很简单, 传入相应的 Map 参数即可。 此时, Map 中的 key 对应。 因此, 在此例子中传入的参数
- 传入一个 key 为 btime 的时间, 作为开始时间;
- 传入一个 key为 etime 的时间, 作为结束时间;
2.2 @Param 方法(推荐)
@Param 方法就是使用注解的方式,
2.2.1 创建接口方法
/**
* 获取指定时间内的对象
* @param pbTime 开始时间
* @param peTime 结束时间
* @return
*/
List<Student> selectBetweenCreatedTimeAnno(@Param("bTime")Date pbTime, @Param("eTime")Date peTime);
@Param("bTime") 就是告诉 mybatis , 参数 pbTime 在 SQL 语句中用 bTime 作为 key。
也就是说, mybatis 帮我们完成了调用时, 类似 params.put("bTime", pbTime) 这个过程。
2.2.2 配置 SQL 语句
<select id="selectBetweenCreatedTimeAnno" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from student
where gmt_created > #{bTime, jdbcType=TIMESTAMP} and gmt_created < #{eTime, jdbcType=TIMESTAMP}
</select>
此处的 bTime 对应** @Param("bTime")** 中的 bTime, 需要完全一致。
eTime 也是一样。
2.2.3 调用
在调用时, 不需要创建 Map
了, 只需要按参数提示传入对应的实际参数即可。
@Test
public void testSelectBtweenCreatedTimeAnno() {
Map<String, Object> params = new HashMap<>();
Calendar bTime = Calendar.getInstance();
// month 是从0~11, 所以9月是8
bTime.set(2018, Calendar.AUGUST, 29);
Calendar eTime = Calendar.getInstance();
eTime.set(2018,Calendar.SEPTEMBER,2);
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = (StudentMapper) sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.selectBetweenCreatedTimeAnno(bTime.getTime(), eTime.getTime());
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
3 @Param 的优势
Map 方式的缺点就是需要手动创建 Map
, 并对 SQL 中的参数进行赋值。其缺点:
- 手动创建
Map
这个过程很不简洁, 看着很繁琐。 - 手动对参数进行赋值, 很容易出错。 比如本来是要 params.put("bTime", bTime) 可能会不小心写成 params.put("bime", bTime), 但是这个时候编译器并不会提示。
相比于 Map
方式, 使用 @Param 时, 我们在使用上就像调用方法一样, 传入对应的实际参数即可。 调用时基本不会出错。
4 Github
相应代码, 可以访问 我的Github-helloMybatis
一起学 mybatis
你想不想来学习 mybatis? 学习其使用和源码呢?那么, 在博客园关注我吧!!
我自己打算把这个源码系列更新完毕, 同时会更新相应的注释。快去 star 吧!!
mybatis 多个接口参数的注解使用方式(@Param)的更多相关文章
- Mybatis传递多个参数的4种方式(干货)
Mybatis传递多个参数的4种方式(干货)-----https://blog.csdn.net/youanyyou/article/details/79406486
- MyBatis多个接口参数报错:Available parameters are [0, 1, param1, param2], 及解决方法
1. sql语句如下: SELECT * FROM tb_crm_user WHERE id = #{userId, jdbcType=INTEGER} AND user_name = #{userN ...
- MyBatis绑定Mapper接口参数到Mapper映射文件sql语句参数
一.设置paramterType 1.类型为基本类型 a.代码示例 映射文件: <select id="findShopCartInfoById" parameterType ...
- Mybatis传递多个参数的几种方式
顺序传参法 public User selectUser(String name, int deptId); <select id="selectUser" resultMa ...
- Mybatis 使用Mapper接口的Sql动态代码方式进行CURD和分页查询
1.Maven的pom.xml 2.配置文件 2.1.db.properties 2.2.mybatis.xml 2.3.log4j.xml 3.MybatisUtil工具类 4.Mapper映射文件 ...
- mybatis 批量修改接口的几种实现方式
-----------------我也是有上线的--------------我也是有上线的------------我也是有上线的---------------我也是有上线的-------------- ...
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...
- spring 接口校验参数(自定义注解)
1. 注解类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.l ...
- Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...
随机推荐
- RTP 流媒体
RTMP协议是Adobe的私有协议,未完全公开,RTSP协议和HTTP协议是共有协议,并有专门机构做维护. RTMP协议一般传输的是flv,f4v格式流,RTSP协议一般传输的是ts,mp4格式的流. ...
- Javascript数组系列四之数组的转换与排序Sort方法
今天我们继续来介绍 Javascirpt 数组中的方法,也是数组系列的第四篇文章,因为数组的方法众多,每篇文章我们都对数组的每个方法都有比较细致的描述,只要你能够从中成长一点点,那我们的目的就达到了, ...
- SAP生产机该不该开放Debuger权限
前段时间公司定制系统在调用SAP RFC接口的时候报错了,看错误消息一时半会儿也不知道是哪里参数数据错误,就想着进到SAP系统里面对这个接口做远程Debuger,跟踪一下参数变量的变化,结果发现根本就 ...
- [20190130]删除tab$记录的恢复2.txt
[20190130]删除tab$记录的恢复2.txt --//前面链接写好了脚本,开始测试删除后的恢复.千万不要在生产系统做这样的测试!!--//参考链接:http://blog.itpub.net/ ...
- [20180822]session_cached_cursors与子游标堆0.txt
[20180822]session_cached_cursors与子游标堆0.txt --//前几天测试刷新共享池与父子游标的问题,--//链接: http://blog.itpub.net/2672 ...
- SQL SERVER 查询哪些存储使用了该表
SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容 FROM syscomments sc INNER JOIN sysobjects obj ON sc.Id = obj.I ...
- Linux进程调度器概述--Linux进程的管理与调度(十五)
调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1 背景知识 1.1 什么是调度器 ...
- win10显示许可证即将过期,但在激活界面显示的仍是已激活问题解决
win10开机显示"许可证即将过期"怎么办? 很多win10用户在开机的时候遇见了"许可证即将过期"请转到设置种激活windows的问题,但是查询自己的win1 ...
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
- Java-Socket实现文件的断点续传
前段时间因为任务需要本人这个java渣渣开始研究如何用java实现简单的文件断点续传.所谓的文件断点续传,我的理解是文件在传输过程中因为某些原因程序停止运行文件终止传输,下一次重新传输文件的时候还能从 ...