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

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

(0)

相关推荐

  • Mybatis如何通过注解开启使用二级缓存

    这篇文章主要介绍了Mybatis基于注解开启使用二级缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文主要是补充一下Mybatis中基于注解的二级缓存的开启使用方法. 1.在Mybatis的配置文件中开启二级缓存 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.or

  • Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

  • 详解Spring Boot集成MyBatis(注解方式)

    MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.spring Boot是能支持快速创建Spring应用的Java框架.本文通过一个例子来学习Spring Boot如何集成MyBatis,而且过程中不需要XML配置. 创建数据库 本文的例子使用MySQL数据库,首先创建一个用户表,执行sql语句如下: CREATE TABLE IF NOT EXISTS user ( `id` INT(10) NOT NULL A

  • Spring与Mybatis基于注解整合Redis的方法

    基于这段时间折腾redis遇到了各种问题,想着整理一下.本文主要介绍基于Spring+Mybatis以注解的形式整合Redis.废话少说,进入正题. 首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图: 一,先上jar包 二,创建实体类 package com.sl.user.vo; import java.io.Serializable; import com.fasterxml.jackson.databind.PropertyNamingSt

  • mybatis @Alias注解在类上的使用方式(推荐)

    比如在类上使用该注解 @Alias("dDebtEntity") 则在mapper.xml文件中resultType="dDebtEntity" 在myBatisConfig.xml中 sqlSessionFactory需要配置注解  需要扫的路径 <typeAliases> <package name="com.xxxxx.core"/> </typeAliases> Mybatis之typeAlias配置的

  • 详解spring boot mybatis全注解化

    本文重点给大家介绍spring boot mybatis 注解化的实例代码,具体内容大家参考下本文: pom.xml <!-- 引入mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version

  • mybatis学习笔记之mybatis注解配置详解

    Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护.MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀. MyBatis 3构建在基于全面且强大的Java配置API上.该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础

  • 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)

    序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求. 一. 基础注解 MyBatis 主要提供了以下CRUD注解: @Select @Insert @Update @Delete 增删改查占据了绝大部分的业务操作,掌握这些基础注解的使用是很必要的.例如下面这段代码无需XML即可完成数据查询: @Mapper public interface UserMa

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

    1 简介 1.1 单参数 在 Mybatis 中, 很多时候, 我们传入接口的参数只有一个. 对应接口参数的类型有两种, 一种是基本的参数类型, 一种是 JavaBean . 例如在根据主键获取对象时, 我们只需要传入一个主键的参数即可. 而在插入, 更新等操作时, 一般会涉及到很多参数, 我们就使用 JavaBean . 1.2 多参数 但是, 在实际的情况中, 我们遇到类似这样的情况可能: 接口需要使用的参数多于一个: 接口需要使用的参数又远少于对应 JavaBean 的成员变量, 或者需要

  • SpringBoot+Mybatis使用Mapper接口注册的几种方式

    目录 I. 环境准备 1. 数据库准备 2. 项目环境 II. 实例演示 1. 实体类,Mapper类 2. 注册方式 2.1 @MapperScan注册方式 2.2 @Mapper 注册方式 2.3 MapperScannerConfigurer注册方式 3. 小结 III. 不能错过的源码和相关知识点 SpringBoot项目中借助Mybatis来操作数据库,对大部分java技术栈的小伙伴来说,并不会陌生:我们知道,使用mybatis,一般会有下面几个 Entity: 数据库实体类 Mapp

  • MyBatis下SQL注入攻击的3种方式

    目录 前言 Mybatis框架下易产生SQL注入漏洞的情况主要分为以下三种: 1.模糊查询 2.in 之后的多个参数 3.order by 之后 二.实战思路 三.总结 前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路. Mybatis的SQL语句可以基于注解的

  • Mybatis Mapper中多参数方法不使用@param注解报错的解决

    目录 问题描述 寻求解决方案 寻找原因 拓展延伸 在使用低版本的Mybatis的时候,Mapper中的方法如果有多个参数时需要使用@param注解,才能在对应xml的sql语句中使用参数名称获取传入方法的参数值,否则就会报错.本文结合自身在真实开发环境中使用IDEA开发时遇到的问题来共同探讨一下不使用@Param注解报错背后的原因以及解决方案. 问题描述 最近使用IDEA进行开发,项目使用SpringBoot+Mybatis3.4.6,同样的代码检出到本地IDEA后运行,在一个业务查询模块报错,

  • Mybatis传递多个参数进行SQL查询的用法

    PS:ibatis3如何传递多个参数有两个方法:一种是使用java.Map,另一种是使用JavaBean. 当只向xxxMapper.xml文件中传递一个参数时,可以简单的用"_parameter"来接收xxxMapper.java传递进来的参数,并代入查询,比如说这样: (1)xxxMapper.java文件中这样定义: List<String> selectAllAirportCode(Boolean mapping); (2)这时在对应的xxxMapper.xml文件

  • Mybatis分页的实现及使用注解开发操作

    分页的实现 sql的分页语句为(第一个参数为当前页面的索引起始位置,第二个参数为页面的展示个数) select * from user limit #{startIndex},#{pageSize}: # startIndex : 起始位置 ,默认是0开始 # pageSize :页面大小 # 如何计算出当前页面索引起始位置 # currentPage = (currentPage-1)* pageSize limit实现分页 1.编写dao接口 //查询全部用户实现分页 List<User>

  • SpringBoot+Mybatis实现Mapper接口与Sql绑定几种姿势

    目录 I. 环境准备 1. 数据库准备 2. 项目环境 II. 实例演示 1. 实体类,Mapper接口 2. sql文件 3. Mapper与Sql绑定 3.1 默认方式 3.2 SpringBoot配置 3.3 Mapper标签 3.4 SqlSessionFactory 4. 小结 III. 不能错过的源码和相关知识点 通常我们在使用Mybatis进行开发时,会选择xml文件来写对应的sql,然后将Mapper接口与sql的xml文件建立绑定关系,然后在项目中调用mapper接口就可以执行

  • 基于MyBatis的parameterType传入参数类型

    目录 MyBatis的parameterType传入参数类型 1. MyBatis的传入参数parameterType类型分两种 2. 如何获取参数中的值 3.案例 mybatis 之parameterType="Long" MyBatis的parameterType传入参数类型 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数

  • Mybatis传递多个参数的解决办法(三种)

    小编给大家分享三种方案解决mybatis传递多个参数的问题,具体介绍如下所示: 第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_a

  • Spring Boot实现通用的接口参数校验

    本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP ,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例如有一个 AccountVO 实体: public class AccountVO { private String name; // 姓名 private Integer age; // 年龄 } 假设存在这样一个业务:用户注册时需要填写姓名和年龄,用户登陆时只需要填写姓名就可以了.那

随机推荐