mybatis多个接口参数的注解使用方式(@Param)

 更新时间:2018年10月09日 11:34:00   作者:阿进的写字台  
这篇文章主要介绍了mybatis多个接口参数的注解使用方式(@Param),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1 简介

1.1 单参数

在 Mybatis 中, 很多时候, 我们传入接口的参数只有一个。 对应接口参数的类型有两种, 一种是基本的参数类型, 一种是 JavaBean 。

例如在根据主键获取对象时, 我们只需要传入一个主键的参数即可。 而在插入, 更新等操作时, 一般会涉及到很多参数, 我们就使用 JavaBean 。

1.2 多参数

但是, 在实际的情况中, 我们遇到类似这样的情况可能:

  1. 接口需要使用的参数多于一个;
  2. 接口需要使用的参数又远少于对应 JavaBean 的成员变量, 或者需要多个 JavaBean 对象;
  3. 或者需要使用的参数对应 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 对应。 因此, 在此例子中传入的参数

  1. 传入一个 key 为 btime 的时间, 作为开始时间;
  2. 传入一个 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 中的参数进行赋值。其缺点:

  1. 手动创建 Map 这个过程很不简洁, 看着很繁琐。
  2. 手动对参数进行赋值, 很容易出错。 比如本来是要 params.put(“bTime”, bTime) 可能会不小心写成 params.put(“bime”, bTime) , 但是这个时候编译器并不会提示。

相比于 Map 方式, 使用 @Param 时, 我们在使用上就像调用方法一样, 传入对应的实际参数即可。 调用时基本不会出错。

4 Github

相应代码, 可以访问 我的Github-helloMybatis

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

相关文章

  • 详解springboot中junit回滚

    详解springboot中junit回滚

    本篇文章主要介绍了springboot中junit回滚,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring实战之Bean的作用域singleton和prototype用法分析

    Spring实战之Bean的作用域singleton和prototype用法分析

    这篇文章主要介绍了Spring实战之Bean的作用域singleton和prototype用法,结合实例形式分析了Bean的作用域singleton和prototype相关使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Spring JDBC 框架简介

    Spring JDBC 框架简介

    Spring JDBC 提供几种方法和数据库中相应的不同的类与接口。我将给出使用JdbcTemplate类框架的经典和最受欢迎的方法。本文给大家介绍Spring JDBC 框架的相关知识,感兴趣的朋友一起看看吧
    2021-12-12
  • SpringBoot使用Logback进行日志记录的代码示例

    SpringBoot使用Logback进行日志记录的代码示例

    在开发Web应用程序时,日志记录是非常重要的一部分,在SpringBoot中,我们可以使用Logback进行日志记录,Logback是一款高性能、灵活的日志框架,它可以满足各种不同的日志需求,在本文中,我们介绍了如何在SpringBoot中使用Logback进行日志记录
    2023-06-06
  • Java开发中的OOM内存溢出问题详解

    Java开发中的OOM内存溢出问题详解

    这篇文章主要介绍了Java开发中的OOM内存溢出问题详解,OOM,全称 Out Of Memory,意思是内存耗尽或内存溢出,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个 error,需要的朋友可以参考下
    2023-08-08
  • Java通过正则表达式捕获组中的文本

    Java通过正则表达式捕获组中的文本

    这篇文章主要给大家介绍了关于利用Java如何通过正则表达式捕获组中文本的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧下
    2019-09-09
  • springboot实现后台上传图片(工具类)

    springboot实现后台上传图片(工具类)

    这篇文章主要为大家详细介绍了springboot实现后台上传图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • jpa多数据源时Hibernate配置自动生成表不生效的解决

    jpa多数据源时Hibernate配置自动生成表不生效的解决

    这篇文章主要介绍了jpa多数据源时Hibernate配置自动生成表不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java实现获取安卓设备里已安装的软件包

    java实现获取安卓设备里已安装的软件包

    本文给大家介绍的是如何获取设备中已经安装的应用软件包的代码,其核心方法原理很简单,我们通过Android中提供的PackageManager类,来获取手机中安装的应用程序信息
    2015-10-10
  • springboot中使用雪花算法生成雪花ID

    springboot中使用雪花算法生成雪花ID

    本文主要介绍了springboot中使用雪花算法生成雪花ID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论