mybatis多个接口参数的注解使用方式(@Param)
1简介
1.1单参数
在Mybatis中,很多时候,我们传入接口的参数只有一个。对应接口参数的类型有两种,一种是基本的参数类型,一种是JavaBean。
例如在根据主键获取对象时,我们只需要传入一个主键的参数即可。而在插入,更新等操作时,一般会涉及到很多参数,我们就使用JavaBean。
1.2多参数
但是,在实际的情况中,我们遇到类似这样的情况可能:
- 接口需要使用的参数多于一个;
- 接口需要使用的参数又远少于对应JavaBean的成员变量,或者需要多个JavaBean对象;
- 或者需要使用的参数对应JavaBean没有相应的成员变量。
比如获取一段时间产生的日志信息,日志对应的JavaBean只有一个日期,那我们使用该JavaBean就无法满足我们的要求。
又比如我们进行模糊搜索,搜索条件只有两个,但对应的JavaBean有50+个成员变量,那创建对应的JavaBean就过于浪费了。
对此,我知道的有如下几种方法
2多个接口参数的两种使用方式
2.1Map方法(不推荐)
Map方法的使用很简单,就是将对应的参数以key-value的方式存储,key对应SQL中的参数名字,value对应需要传入的参数值。
以获取一段时间内存储的用户为例
2.1.1创建接口方法
/** *获取一段时间内的用户 *@paramparams *@return */ ListselectBetweenCreatedTime(Map params);
该方法返回的是多个记录,因此使用List作为返回值。
2.1.2配置对应的SQL
select fromstudent wheregmt_created>#{bTime,jdbcType=TIMESTAMP}andgmt_created<#{eTime,jdbcType=TIMESTAMP}
id与之前创建的方法名一样。
2.1.3调用
@Test publicvoidtestSelectBtweenCreatedTimeMap(){ Mapparams=newHashMap<>(); CalendarbTime=Calendar.getInstance(); //month是从0~11,所以9月是8 bTime.set(2018,Calendar.AUGUST,29); params.put("bTime",bTime.getTime()); CalendareTime=Calendar.getInstance(); eTime.set(2018,Calendar.SEPTEMBER,2); params.put("eTime",eTime.getTime()); SqlSessionsqlSession=null; try{ sqlSession=sqlSessionFactory.openSession(); StudentMapperstudentMapper=(StudentMapper)sqlSession.getMapper(StudentMapper.class); List students=studentMapper.selectBetweenCreatedTime(params); for(inti=0;i 调用方法很简单,传入相应的Map参数即可。此时,Map中的key对应。因此,在此例子中传入的参数
- 传入一个key为btime的时间,作为开始时间;
- 传入一个key为etime的时间,作为结束时间;
2.2@Param方法(推荐)
@Param方法就是使用注解的方式,
2.2.1创建接口方法
/** *获取指定时间内的对象 *@parampbTime开始时间 *@parampeTime结束时间 *@return */ ListselectBetweenCreatedTimeAnno(@Param("bTime")DatepbTime,@Param("eTime")DatepeTime); @Param(“bTime”)就是告诉mybatis,参数pbTime在SQL语句中用bTime作为key。
也就是说,mybatis帮我们完成了调用时,类似params.put(“bTime”,pbTime)这个过程。
2.2.2配置SQL语句
select fromstudent wheregmt_created>#{bTime,jdbcType=TIMESTAMP}andgmt_created<#{eTime,jdbcType=TIMESTAMP} 此处的bTime对应**@Param(“bTime”)**中的bTime,需要完全一致。
eTime也是一样。
2.2.3调用
在调用时,不需要创建Map了,只需要按参数提示传入对应的实际参数即可。
@Test publicvoidtestSelectBtweenCreatedTimeAnno(){ Mapparams=newHashMap<>(); CalendarbTime=Calendar.getInstance(); //month是从0~11,所以9月是8 bTime.set(2018,Calendar.AUGUST,29); CalendareTime=Calendar.getInstance(); eTime.set(2018,Calendar.SEPTEMBER,2); SqlSessionsqlSession=null; try{ sqlSession=sqlSessionFactory.openSession(); StudentMapperstudentMapper=(StudentMapper)sqlSession.getMapper(StudentMapper.class); List students=studentMapper.selectBetweenCreatedTimeAnno(bTime.getTime(),eTime.getTime()); for(inti=0;i 3@Param的优势
Map方式的缺点就是需要手动创建Map,并对SQL中的参数进行赋值。其缺点:
- 手动创建Map这个过程很不简洁,看着很繁琐。
- 手动对参数进行赋值,很容易出错。比如本来是要params.put(“bTime”,bTime)可能会不小心写成params.put(“bime”,bTime),但是这个时候编译器并不会提示。
相比于Map方式,使用@Param时,我们在使用上就像调用方法一样,传入对应的实际参数即可。调用时基本不会出错。
4Github
相应代码,可以访问我的Github-helloMybatis
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。