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多个接口参数的注解使用方式(@Param)
-
MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)
-
mybatis @Alias注解在类上的使用方式(推荐)
-
mybatis @Alias注解在类上的使用方式(推荐)
-
MyBatis不用@Param传递多个参数的操作
-
解决MyBatis @param注解参数类型错误异常的问题
-
详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理
-
使用mybatis的interceptor修改执行sql以及传入参数方式
-
使用自定义注解进行restful请求参数的校验方式
-
springboot RESTful以及参数注解的使用方式