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

yizhihongxing

Mybatis是一款优秀的持久化框架,它的优点之一就是支持多数据源和动态SQL,但在使用多数据源时,可能会发现使用同名的mapper.xml进行映射时,出现了问题。此时可以用 @Param 注解来区分同名方法。这里将对多个接口参数的注解使用方式进行详细讲解,并配合两个实例来加深理解。

什么是 @Param 注解

@Param 是 Mybatis 中的注解,表示为映射方法参数取别名。在 SQL 中,通过 #{别名} 来引用这个值。

例如:

public interface UserMapper{
    List<User> getUserList(@Param("id") int id, @Param("name") String name, @Param("sex") String sex);
}

上面的代码在 SQL 中就可以这样使用:

SELECT * FROM user WHERE id = #{id} and name = #{name} and sex = #{sex}

在调用接口方法的时候,我们在传递参数时,需要使用这个注解标记参数,以便在 Mybatis 处理方法调用时,能够识别这个参数并在 SQL 中通过 #{别名} 映射过来。

为什么要使用 @Param 注解

实际开发中,常常有多个参数的情况,这时候我们需要在 XML 中编写多个 #{} 模板,并将参数全部按顺序传入,这样不但繁琐而且容易混淆,因此 Mybatis 提供了 @Param 注解,方便我们传递参数。

@Param 注解的使用方式

在接口方法的参数前,使用 @Param 注解并指定其中的参数名。在 XML 文件中就可以直接使用指定的参数名来取代之前的“数字”参数。

例如:

public interface UserMapper{
    void updateUser(@Param("id") int id, @Param("name") String name, @Param("age") int age);
}

XML 中使用:

<update id="updateUser" parameterType="hashmap">
    UPDATE USER SET name=#{name},age=#{age} WHERE id=#{id}
</update>

这样在接口方法中传入参数时,必须指定参数名。

例如:

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(1, "Tom", 23);

这里传的必须是 updateUser( @Param("id") 1, @Param("name") "Tom", @Param("age") 23);

@Param 注解的注意事项

  1. @Param 注解中的值必须与 XML 中 #{} 中的值相一致。
  2. 接口中可以使用多个 @Param 注解进行参数注释,但是建议使用 POJO 对象传参。
  3. 如果一个方法只传一个参数,不需要使用 @Param 注解。

示例1:多参数查询示例

以下以一个多参数查询为例,来说明 @Param 注解的使用方法。

首先,在 mapper 接口类中定义方法 getUserList,该方法需要传递多个参数:

public interface UserMapper {
    List<User> getUserList(@Param("name") String name, @Param("age") Integer age, @Param("sex") String sex);
}

在 XML 中定义了该方法的 SQL 语句:

<select id="getUserList" parameterType="hashmap" resultType="User">
    SELECT * FROM user 
    WHERE 1 = 1 AND name LIKE CONCAT('%',#{name},'%') 
    <if test='age!=null'>AND age = #{age}</if>
    <if test='sex!=null'>AND sex = #{sex}</if>
</select>
  • 如果 age 不为 null,则会拼接 AND 条件 age = #{age}
  • 如果 sex 不为 null,则会拼接 AND 条件 sex = #{sex}

在执行查询方法时,先创建一个 map,用于存储传递的参数,最后将 map 传递给查询方法,方法中使用 @Param 注解引用 map 中的参数。

@Test
public void testGetUserList() {
    UserMapper userMapper = openSession.getMapper(UserMapper.class);

    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("name", "zhang");
    paramMap.put("age", 20);
    paramMap.put("sex", null);

    List<User> users = userMapper.getUserList(paramMap);
    for (User user : users) {
        System.out.println(user);
    }

    openSession.close();
}

运行结果如下:

User(id=1, name=zhangsan, age=18, sex=男)
User(id=3, name=zhangsan, age=20, sex=女)

说明查询成功。

示例2:增加数据示例

以下以一个单表增加数据为例,来说明 @Param 注解的使用方法。

mapper 接口类中定义 add 方法,该方法需要传递多个参数:

public interface UserMapper {
    void add(@Param("name") String name, @Param("age") Integer age, @Param("sex") String sex);
}

在 XML 中定义了该方法的 SQL 语句:

<insert id="add" parameterType="hashmap" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(name, age, sex) VALUES (#{name}, #{age}, #{sex})
</insert>

在执行增加方法时,也需要先创建一个 map,用于存储传递的参数,最后将 map 传递给增加方法,方法中使用 @Param 注解引用 map 中的参数。

@Test
public void testAdd() {
    UserMapper userMapper = openSession.getMapper(UserMapper.class);

    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("name", "Tom");
    paramMap.put("age", 22);
    paramMap.put("sex", "男");

    userMapper.add(paramMap);
    System.out.println("插入数据的主键: " + paramMap.get("id"));

    openSession.commit();
    openSession.close();
}

运行结果如下:

插入数据的主键: 5

说明插入成功。

以上就是关于 mybatis多个接口参数的注解使用方式(@Param) 的完整攻略,通过此文,我们能够了解到 @Param 注解的语法格式,注意事项和两个实例操作,希望对您的工作有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis多个接口参数的注解使用方式(@Param) - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Windows系统中搭建Go语言开发环境图文详解

    以下是详细讲解“Windows系统中搭建Go语言开发环境图文详解”的完整攻略。 简介 Go语言是一门优秀的编程语言,在逐渐受到越来越多的关注和使用。在Windows系统中搭建Go语言开发环境,可以让开发者更加方便地进行Go语言的开发工作。 安装Go语言环境 在官网下载Go语言环境安装包,选择对应系统的32位或64位版本进行下载。 运行安装包,根据安装向导的提…

    GitHub 2023年5月16日
    00
  • RocketMQ源码本地搭建调试方法

    当你需要对RocketMQ这个消息中间件进行二次开发或者调试的时候,我们需要搭建RocketMQ源码环境,从而可以方便地进行代码调试以及定位问题。接下来,我会为你介绍如何在本地搭建RocketMQ源码的开发环境,并且通过两个示例来演示如何进行调试。 环境准备 在开始搭建RocketMQ源码环境之前,需要您本地已经准备好以下环境: JDK1.8及以上 Git …

    GitHub 2023年5月16日
    00
  • 详解Android Studio Git分支实践

    下面我将为你详细讲解“详解Android Studio Git分支实践”的完整攻略。 简介 Git是一款流行的版本控制工具,而在Android Studio开发中,也经常会使用Git来管理代码。Git的分支机制可以方便地维护不同版本的代码,特别是在多人协作开发的场景下。 本文将介绍Android Studio中Git分支的基本操作,以及实际应用。 Git分支…

    GitHub 2023年5月16日
    00
  • Vue-cli 使用json server在本地模拟请求数据的示例代码

    下面为你详细讲解“Vue-cli 使用json server在本地模拟请求数据的示例代码”的完整攻略,包含两条示例说明。 1. 安装json server 在终端使用npm全局安装json server: npm install -g json-server 安装成功后,可以在终端使用json-server命令启动一个简单的服务器。 2. 创建json数据文…

    GitHub 2023年5月16日
    00
  • idea中git从码云克隆项目到本地的方法

    下面是详细讲解“idea中git从码云克隆项目到本地的方法”的完整攻略: 前提条件 在使用Idea中Git从码云克隆项目到本地之前,需要先满足以下前提条件: 你需要安装Idea软件,并且能够正常使用; 你需要拥有一个码云账号,并且在该账号下有所需要克隆的项目; 你已经在本地安装了Git,并且能够正常使用。 方法概述 在Idea中Git从码云克隆项目到本地,主…

    GitHub 2023年5月16日
    00
  • 利用Go语言快速实现一个极简任务调度系统

    下面我将详细讲解“利用Go语言快速实现一个极简任务调度系统” 的完整攻略。 1. 前言 在本篇攻略中,我们将使用 Go 语言实现一个极简的任务调度系统,包括实现任务的增、删、改、查和定时执行等功能。 2. 开始实现 2.1 系统设计 首先,我们需要设计出我们的系统。 这个系统有两个主要的结构,即任务(Task)和任务管理器(Task Manager)。 2.…

    GitHub 2023年5月16日
    00
  • 浅谈Android开发者2017年最值得关注的25个实用库

    标题 浅谈Android开发者2017年最值得关注的25个实用库 介绍 本攻略旨在介绍2017年Android开发者最值得关注的25个实用库。这些库涵盖了各个方面,包括UI设计、网络请求、数据库存储、调试工具等。 内容 ButterKnife ButterKnife是一个Android View注入框架,可以通过注解的方式来绑定视图和事件。由于ButterK…

    GitHub 2023年5月16日
    00
  • 详解50行代码,Node爬虫练手项目

    下面我来详细讲解“详解50行代码,Node爬虫练手项目”的完整攻略。 简介 本项目主要是用于初学者练习Node爬虫技术的一个小项目。代码主要是利用 request 和 cheerio 这两个第三方库完成。 项目需求 本项目需要完成的任务是从网站上爬取所有书籍的信息,并将这些信息存储到本地的数据库中。 功能实现 爬虫代码 首先需要使用 request 第三方库…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部