Mybatis(4):映射文件与接口代码的传参,使用@Param 注解用法

MyBatis @Param注解深度解析:参数绑定机制与最佳实践 在Java持久层框架中,参数绑定是ORM(对象关系映射)的核心机制之一,它负责将Java方法中的参数值安全、准确地映射到SQL语句的占位符上。MyBatis通过其独特的参数包装策略实现这一过程,其中参数名的解析遵循明确的优先级链,包括@Param注解指定、编译参数保留、反射获取及位置索引兜底等。理解这一原理对于编写稳定、可维护的数据访问层至关重要,它能有效避免运行时参数绑定错误,提升代码的健壮性。在实际开发中,尤其是在处理多参数方法、动态SQL(如<foreach>遍历)或复杂对象嵌套时,合理使用@Para 阅读详情

四部曲:

1.写接口  +  2.写映射sql  + 3.把mapper注册到mybatis的配置文件  + 4.写单元测试和运行


      我们都知道,在 UserMapper.java 文件里面可以写了接口,国际惯例的在映射文件里面的parameterType参数注明传参的类型,在sql中使用#{参数}得到参数,这一系列步骤确实规范,但有时会让我们疲于设置,Mybatis提供了一个更快的注释机制---@Param 注解用法。

(1)新建一个UserMapper.java文件,并且编写接口方法:

package com.smbms.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.smbms.entities.User;

public interface UserMapper {

	public int updatePwd(@Param("id") Integer id,@Param("userPassword") String userPassword);

}

(2)新建UserMapper.xml文件,写sql 语句:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.smbms.dao.UserMapper">

	
	<update id="updateUser" parameterType="com.smbms.entities.User">
		update smbms_user set userCode = #{userCode},userName=#{userName},userPassword=#{userPassword},gender=#{gender},birthday=#{birthday},
		     phone=#{phone},address=#{address},userRole=#{userRole},modifyBy=#{modifyBy},modifyDate=#{modifyDate}
		 where id=#{id}     
	</update>

	
 </mapper> 

(3)新建一个Mybatis全局配置文件mybatis-config.xml,并注册UserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd" >
 <configuration>
 	<properties resource="datasources.properties"/>
 	<settings>
 		<setting name="logImpl" value="LOG4J"/>
 	</settings>
 	<environments default="development">
 		<environment id="development">
 			<transactionManager type="JDBC"></transactionManager>
 			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.usename}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
 		</environment>
 	</environments>
 	<mappers>
 		<mapper resource="com/smbms/dao/UserMapper.xml"/>
 		<mapper resource="com/smbms/dao/ProviderMapper.xml"/>
 	</mappers>
 </configuration>


(4)新建一个单元测试文件 UserTest.java:

package com.smbms.entities;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.smbms.dao.ProviderMapper;
import com.smbms.dao.UserMapper;

public class UserTest {
	
	public SqlSession getSqlSession() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession openSession = build.openSession();
		return openSession;
	}
}	
//updateUser
//	@Test
	public void test08() throws IOException{
		System.out.println("===============test add!");
		List<User> userlist = new ArrayList<User> ();
		int count = 0;
		SqlSession sqlSession = getSqlSession();
		User user = new User();
		try{
			System.out.println(110);
			user.setId(1);
			user.setAddress("maoming");
			Date birthday = new SimpleDateFormat("YYYY-MM-dd").parse("1992-1-1");
			user.setBirthday(birthday);
			user.setPhone("000000");
			user.setUserCode("test01");
			user.setUserName("mmb");
			user.setUserPassword("scua-electical");
			user.setGender(2);
			user.setUserRole(110);
			user.setCreatedBy(1);
			user.setCreationDate(new Date());
			UserMapper mapper = sqlSession.getMapper(UserMapper.class);
			System.out.println(111);
			mapper.updateUser(user);
			System.out.println(112);
			sqlSession.commit();
			userlist = mapper.Usershow();
			for(User user1 : userlist){
				System.out.println("***: "+user1);
			}
			//模拟异常
//			int i = 2/0;
		}catch(Exception e){
			System.out.println(222);
			e.printStackTrace();
			sqlSession.rollback();
			count=0;
		}finally{
			sqlSession.close();
		}
	}

综上,完成一个Update的Demo。

 

知识点:

(1)date数据模型的设定,在java代码里要导入Util库,赋初值的方式是:

                Date birthday = new SimpleDateFormat("YYYY-MM-dd").parse("1992-1-1");

(2)事务回滚,当有异常发生(传参有误等)的情况,修改不能超过上传,便需要将状态回滚到原来的情况。




从PersistenceException看MyBatis参数传递:为什么你的@Param注解突然失效了? 本文深入解析MyBatis参数传递中的常见问题,特别是`PersistenceException`异常和`@Param`注解失效的原因。通过对比三种参数传递方式的底层机制,提供企业级解决方案和性能优化建议,帮助开发者避免常见陷阱并提升数据库操作效率。 阅读详情

相关推荐

Mybatis分页查询——四种传参方式

Mybatis分页查询——四种传参方式

qq_53317005的博客 7278

文件上传/下载接口(超简单的教程来了)

前言 文件上传/下载接口与普通接口类似,但是有细微的区别。 如果需要发送文件到服务器,例如:上传文档、图片、视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: multipart/form-data 数据类型,可以发送文件,也可以发送相关的消息体数据。 反之,文件下载就是将二进制格式的响应内容存储到本地,并根据需要下载的文件的格式来写文件名,例如:F:/合同文件.pdf。 一、文件上传接口 1. 接口文档 Request URL: /createbyfile...

m0_70618214的博客 1万+

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7985

requests 请求上传文件的接口,就是这么简单

近期也有不少的小伙伴在工作中遇到了文件上传的接口,表示不知道应该如何去传递文件上传的参数。为了帮大家解决这个疑惑,我这边特地写了一个文件上传的接口,那么接下来我们结合这个接口给大家来讲讲解决方案。

测试萌萌 3948

开关变换器小信号建模实战:从理论到环路设计

本文深入探讨了开关变换器小信号建模的实战技巧,从理论基础到环路设计全面解析。通过Buck和Boost变换器的具体案例,详细介绍了状态空间平均法、扰动法等关键建模技术,并分享环路补偿设计和实际调试中的宝贵经验。文章特别强调了小信号建模在电源设计中的重要性,为工程师提供了从理论到实践的完整解决方案。

weixin_29290259的博客 376

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 485

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式传输给服务端,而服务端接受客户端传过来的二进制文件流以及文件名称等信息(此时这些二进制文件流存储在内存中),然后将其写入存储空间(即磁盘中),完成上传操作,返回给客户端信息。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 1588

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1744

HttpClient 发送接口传文件

Http请求发送传递文件类型的参数

lf1934305268的博客 3562

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

君逍遥o 408

李宏毅2025《机器学习》第一讲-生成式AI:技术突破和未来发展

本文基于台湾大学李宏毅教授的“一堂课搞懂生成式人工智慧的技术突破与未来发展”课程内容,系统性地梳理了生成式AI的核心概念、技术原理、发展演进以及未来趋势。文章从AI的“行为”入手,通过生动的实例展示了其强大的生成与推理能力;进而深入剖析其底层运作机制,阐释了“万物皆为令牌(Token)”、自回归生成、Transformer架构等核心原理;接着,文章追溯了通用AI模型从“专才”到“通才”的演进历程;最后,探讨了如何通过微调(Fine-tuning)、模型编辑(Model Editing)等技术赋予AI新的能力

木鱼时刻的专栏 2295

Java实现本地文件上传下载接口示例

Java实现本地文件上传下载功能

cl617287的博客 5824

智能挂锁软件需求规格说明书(SRS)

智能挂锁系统SmartPadlockV1.0是一款融合蓝牙通信、指纹识别和远程控制技术的便携式安防设备。系统由设备端、移动App和云平台三部分组成,支持蓝牙配对(10米内)、指纹识别、OTP一次性密码等多种开锁方式,响应时间<1.5秒。产品采用SM2/SM4加密技术保障安全,日均20次使用下续航达180天,兼容iOS13+/Android8.0+系统。功能包括设备绑定、远程授权、开锁记录查询和OTA固件升级,符合个人信息保护法规要求,适用于仓储、快递柜等多场景应用。

moton2017的博客 2112

mysql入参映射,Mybatis(4):映射文件与接口代码的传参,使用@Param 注解用法

四部曲:1.写接口 + 2.写映射sql + 3.把mapper注册到mybatis的配置文件 + 4.写单元测试和运行我们都知道,在 UserMapper.java 文件里面可以写了接口,国际惯例的在映射文件里面的parameterType参数注明传参的类型,在sql中使用#{参数}得到参数,这一系列步骤确实规范,但有时会让我们疲于设置,Mybatis提供了一个更快的注释机制---(1)...

weixin_39953629的博客 251

LeRobot 入门教程(四)SO-101机械臂组装教程

《SO-101机器人组装与配置指南》详细介绍了旗舰机器人SO-101的完整搭建流程。从获取3D打印零件、安装LeRobot软件和FeetechSDK,到分步组装6个关节的机械臂结构(含夹爪/手柄选项),指南提供了清晰的螺丝规格和安装位置说明。重点包括:电机ID/波特率设置方法、USB端口识别技巧、领导者/跟随者臂的校准流程,以及故障排查建议。完成组装后,用户可通过配套Python脚本校准机器人,为后续的自主学习任务做好准备。文档附有视频演示和技术支持通道,确保用户顺利完成机器人部署。

2506_90492529的博客 2581

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MyBatis 的几种传参方式,看完就懂了!

本文重点讲点Mybatis中的参数传递,让你清楚了解。

qq_56158663的博客 2008

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MyBatis-@param注解详解

@param参数注解 一、@Param注解单一属性 dao层示例 Public User selectUser(@param(“userName”) String name,@param(“userpassword”) String password); xml映射对应示例 &amp;amp;amp;amp;amp;amp;amp;lt;select id=&amp;amp;amp;amp;amp;amp;quot; selectUser&amp;amp;amp;amp;amp;a

xuonline4196的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MyBatis之@Param注解详解

MyBatis中的@Param详解

2301_80074257的博客 3255

【详解】@Param注解的用法

首先明确这个注解是为SQL语句中参数赋值而服务的。@Param的作用就是给参数命名,比如在mapper里面某方法A(intid),当添加注解后A(@Param(“userId”)intid),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。...

m0_67402235的博客 1万+

Mybatis配置映射文件中parameterType的用法,使用@Param注解来参入多个参数

在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了 parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的 输入参数类型即可。parameterType有基本数据类型和复杂的数据类型配置。 1.基本数据类型,如输入参数只有一个,其数据类型可以是基本的数据类型,也可以是 自己定的类类型。包括int,Str...

博客 2273

MyBatis @Param注解深度解析

在当今的软件开发领域,MyBatis 作为一款优秀的持久层框架,以其简洁的配置和强大的功能,深受广大开发者的喜爱。然而,在实际的项目开发中,我们常常会遇到一些复杂的情况,比如在执行 SQL 查询时,需要传递多个参数,而这些参数之间可能存在关联性。这时,如何有效地管理这些参数,就成为了我们需要解决的问题。为了解决这一问题,MyBatis 提供了 @Param 注解,它可以帮助我们更好地组织和管理参数,提高代码的可读性和可维护性。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1147

@param注解用法解析

@Param注解单一属性 @Select({"select * from country where countryname=#{countryname} and countrycode=#{countrycode}"}) Country selectByNameAndCode(@Param("countryname") String countryname,@Param("countrycode") String countrycode); @Select({"sel.

ITupup的博客 4058

@Param注解的用法

@Param 的描述 :当映射器方法需要多个参数时,这个注解可以应用于映射器方法来给每个参数一个名字。否则,多参数将会以他们的顺序位置来命名。比如#{1}、#{2}等,这是默认的。若使用@Param(“person”),SQL中的参数应该被命名为#{person} 示例 dao层示例 Public User selectUser(@param(“userName”) String name,@pa...

coco_____的博客 3257

33. MyBatis中的@Param注解如何使用?如何在Mapper接口中传递多个参数?

注解,MyBatis 提供了更加灵活和清晰的方式来处理 SQL 语句中的参数绑定,尤其是在处理多参数的方法时,使代码更具可维护性和可读性。为了使参数名称更加明确和可读,,可以直接在 SQL 语句中引用它。注解允许你为每个参数指定一个名称,从而在 SQL 语句中使用这个名称。接口方法的参数指定名称,以便在 SQL 语句中使用更具可读性的参数名。注解用于将方法参数绑定到 SQL 语句中的命名参数。接口中传递多个参数,以便在 SQL 语句中更方便地引用这些参数。注解中指定的参数名称与 SQL 语句中的占位符。

zhzjn的博客 1131

MyBatis @Param注解的使用和参数的说明

1.为什么要使用@Param注解 在上篇博客中,我们以及将代码跑起来了,在跑起来后,我们是否思考过当方法中传递多个参数的时候,这个方法该怎么办,有人可能想到用逗号分开,但是发现会报错。就很神奇,说明MyBatis有专门的方法来解决多个简单参数赋值的方法。这就是我今天要说的@Param注解 2.@Param注解的使用情况 在什么情况使用@Param注解呢?? 1.当方法有多个参数时。(最常用) 2.想给方法的参数取别名。(可以将复杂的参数名称换个简单的) 3.当xml文件的sql语句含...

莫得感情得码农 2513
上一篇: FAQ(15):A query was run and no Result Maps were found for the Mapped Statement 'com.smbms.dao.UserMa
下一篇: Mybatis(5):使用sql映射文件,将返回结果封装为ResulMap
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值