好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 创建接口方法

?

1

2

3

4

5

6

/**

    * 获取一段时间内的用户

    * @param params

    * @return

    */

   list<student> selectbetweencreatedtime(map<string, object> params);

该方法返回的是多个记录, 因此使用 list 作为返回值。

2.1.2 配置对应的sql

?

1

2

3

4

5

6

<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 调用

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

@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 创建接口方法

?

1

2

3

4

5

6

7

/**

  * 获取指定时间内的对象

  * @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 语句

?

1

2

3

4

5

6

<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 了, 只需要按参数提示传入对应的实际参数即可。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

@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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/weixin_37139197/article/details/82975594

查看更多关于mybatis多个接口参数的注解使用方式(@Param)的详细内容...

  阅读:12次