MyBatis 中 @Param 注解的使用场景:多参数、$、动态SQL、取别名

MyBatis @Param注解深度解析:多参数传递避坑指南与最佳实践 在Java持久层框架中,参数绑定是ORM(对象关系映射)的核心机制之一,它负责将Java方法中的参数安全、正确地映射到SQL语句的占位符上。MyBatis作为广泛使用的半自动化ORM框架,其参数处理机制直接影响着SQL执行的正确性和代码的健壮性。当Mapper接口方法包含多个参数时,MyBatis默认会使用一套基于参数索引(如arg0, param1)的命名策略进行映射,但这在动态SQL、集合遍历等复杂场景下容易引发“Parameter not found”等运行时异常。为了解决这一问题,@Param注解应 阅读详情

我目前找到的关于mapper参数最详细的文章

第一种:方法有多个参数,需要 @Param 注解

例如下面这样:

@Mapper

public interface UserMapper {

Integer insert(@Param("username") String username, @Param("address") String address);

}

对应的 XML 文件如下:

<insert id="insert" parameterType="org.javaboy.helloboot.bean.User">

insert into user (username,address) values (#{username},#{address});

</insert>

这是最常见的需要添加 @Param 注解的场景。

 

第二种:方法参数要取别名,需要 @Param 注解

当需要给参数取一个别名的时候,我们也需要 @Param 注解,例如方法定义如下:

@Mapper

public interface UserMapper {

User getUserByUsername(@Param("name") String username);

}

对应的 XML 定义如下:

<select id="getUserByUsername" parameterType="org.javaboy.helloboot.bean.User">

select * from user where username=#{name};

</select>

老实说,这种需求不多,费事。

第三种:XML 中的 SQL 使用了 $ ,那么参数中也需要 @Param 注解

$ 会有注入漏洞的问题,但是有的时候你不得不使用 $ 符号,例如要传入列名或者表名的时候,这个时候必须要添加 @Param 注解,例如:

@Mapper

public interface UserMapper {

List<User> getAllUsers(@Param("order_by")String order_by);

}
  1.  

对应的 XML 定义如下:

<select id="getAllUsers" resultType="org.javaboy.helloboot.bean.User">

select * from user

<if test="order_by!=null and order_by!=''">

order by ${order_by} desc

</if>

</select>

前面这三种,都很容易懂,相信很多小伙伴也都懂,除了这三种常见的场景之外,还有一个特殊的场景,经常被人忽略。

 

第四种,那就是动态 SQL ,如果在动态 SQL 中使用了参数作为变量,那么也需要 @Param 注解,即使你只有一个参数。

如果我们在动态 SQL 中用到了 参数作为判断条件,那么也是一定要加 @Param 注解的,例如如下方法:

@Mapper

public interface UserMapper {

List<User> getUserById(@Param("id")Integer id);

}

定义出来的 SQL 如下:

<select id="getUserById" resultType="org.javaboy.helloboot.bean.User">

select * from user

<if test="id!=null">

where id=#{id}

</if>

</select>

这种情况,即使只有一个参数,也需要添加 @Param 注解,而这种情况却经常被人忽略!

org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found.报错

首先,要明确一点的是,Dao层的抽象方法中的参数一般情况下默认的是一个参数或者一个对象;

1.

public interface StudentDao {

 

    int selectById(int id);

    

    int insert(Student stu);

    

}

这两种是正常的方式,不会出现什么问题,mappper中的对应取值都是用#{}这种方式;

例如:


<select id="selectById" resultMap="BaseResultMap">

        select

        <include refid="Base_Column_List" />

        from student

        where 1=1 and id = #{id}

    </select>

<insert id="insert" parameterType="com.yoho.crm.dal.model.student"><!--注意参数的类型要与对象类对应,也就是这个类的路径-->

        insert into inbox_template (name,age)

        values (#{name},#{age})

    </insert>

上面如果是student对象作为参数,那么mapper中不能少了parameterType,否则会找不对应的属性

2、当传多个参数时,就容易出现问题了,问题重现,如果像下面那样写就会出现标题中的错误,找不到参数;

public interface StudentDao {

    int selectBySelective(int id,String name);

}


解决办法就是在每个参数前加上@param注解,括号中注解的名称就是mapper中映射的值,如下:
import org.apache.ibatis.annotations.Param;
 

public interface StudentDao {

    int selectBySelective(@Param("id")int id,@Param("name")String name);

}


//mapper中还是那样写,可以使用${}或者#{}任意一种方式:

<select id="selectBySelective" resultMap="BaseResultMap">

        select

        <include refid="Base_Column_List" />

        from student

        where name = #{pname} and id = #{pid}

    </select>



3.既有参数又有对象时,对象也需要注解,一般参数的直接取,对象的需要对象.属性,如下:

public interface StudentDao {

    

    int selectBySelective(@Param("page")int page,@Param("stu")Student stu);

    

}


mapper:

<select id="selectBySelective" resultMap="BaseResultMap">

        select

        <include refid="Base_Column_List" />

        from student

        where name = #{stu.name} and id = #{stu.id} limit 0 ,#{page}

    </select>


4.像这种有公共的属性

 

例如分页都要传开始的index和pagesize,然后还要在传对象,就是3中的案例,可以为了方便管理,自己再新建一个类,里面封装了page的属性,同时又有对象,如下:
建一个page类:

public class Page {

    

    private int pageNo;

    

    private int pageSize;

    

    private Object obj;

    

    public Page(int page,int pageSize,Object obj){

        this.pageNo=page;

        this.pageSize=pageSize;

        this.obj=obj;

    }

 

    public int getPageNo() {

        return pageNo;

    }

 

    public void setPageNo(int pageNo) {

        this.pageNo = pageNo;

    }

 

    

    public int getPageSize() {

        return pageSize;

    }

 

    public void setPageSize(int pageSize) {

        this.pageSize = pageSize;

    }

 

    public Object getObj() {

        return obj;

    }

 

    public void setObj(Object obj) {

        this.obj = obj;

    }

    

    

}

在处理时直接new page对象中自己定义好的构造函数,然后直接把page作为参数传到dao:

Student stu = new Student();

        stu.setName("aa");

        stu.setId(1);

        stu.setAge(12);

        Page page = new Page(1, 10,stu);


dao:


public interface StudentDao {

 

    int update(Page page);

    

}


mapper:

<update id="update" parameterType="com.yoho.crm.dal.model.student"><!--此时obj则是对应page中的属性了-->

        update inbox_template

        set 

        name = #{obj.name},

        age = #{obj.age}

        where id = #{obj.id}

    </update>

  1.  

电赛控制组入门到实战:从电路板到PID算法的完整路径 本文详细介绍了电赛控制组从电路板制作到PID算法实战的完整学习路径。涵盖嘉立创电路设计、Keil5开发环境搭建、STM32F103C8T6核心板外设应用,重点解析PID算法在电机速度环与位置环中的调试技巧,并探讨OpenMV视觉模块与主控制器的协同工作,为电赛参赛者提供系统化的实战指南。 阅读详情

相关推荐

相机图像质量研究(15)常见问题总结:光学结构对成像的影响--暗角

老式相机的暗角往往比较明显,周围一圈能够明显感觉到亮度下降的很多,当然有些电源模仿手持相机的摄影效果,也能看到周围明显的亮度下降。一、

xiaoshixiu的专栏 1124

Mybatis:mapper接口中的@Param注解的用法总结

@Param注解的用法总结(全网巨详细)

m0_59960942的博客 7119

Windows Server上OpenVPN 2.4.8双因子认证实战:账号密码+证书,附一键脚本

本文详细介绍了在Windows Server上部署OpenVPN 2.4.8双因子认证(账号密码+证书)的实战方案,包括架构设计、证书体系规划、环境准备、服务器端配置及客户端自动化部署。通过一键脚本和优化配置,提升企业VPN的安全性和运维效率,特别适合金融、医疗等对安全性要求高的行业。

weixin_29231221的博客 466

【详解】@Param注解的用法

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

m0_67402235的博客 1万+

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

weixin_45469245的博客 6456

《全连接到卷积神经网络:图像识别的演变历程》

这篇文章会从传统全连接层面临的困境说起,揭示卷积神经网络(CNN)成为图像识别核心动力的原因,探究其背后蕴含的设计思想与技术创新。但是回顾历史,CNN的出现提醒我们:技术的突破往往是由对自然规律的模仿和重新构建得来的。也许,当机器真的学会“像人一样看世界”的时候,它们的“眼睛”早就超过生物视觉的限制了。例如,用5×5的核处理224×224的输入时,只要25个参数(而不是全连接那种百万级的)。* 局部性:网络的底层只需留意局部的地方(像边缘、纹理这样的地方),不用管那些全局像素之间复杂的关系。

2401_82434295的博客 674

mybatis接口函数参数注解@Param

mybatis中mapper接口函数参数注解@Param使用

sai的学习历程 2319

【YOLOv11工业级实战】27. TensorRT量化实战:FP16/INT8极致加速!边缘设备YOLOv11推理速度提升4倍,精度损失控制在1.5%内

摘要:本文针对智慧园区200路摄像头实时分析的工业痛点——RTX 3080单卡仅能处理12路视频流(YOLOv11-nano FP32精度45FPS,需≥120FPS且精度损失≤3%),提供TensorRT量化完整解决方案。从原理解析(FP16/INT8精度差异与量化逻辑)到实操落地(ONNX转换、FP16引擎构建、INT8精细校准),全程给出可复用代码。实测显示:FP16量化后速度达128FPS(×2.8),精度损失0.2%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1721

Mybatis:插入数据返回最新主键id

insert元素属性                       parameterType,入参的全限定类名或类型别名 keyColumn,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置 keyProperty,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中 useGeneratedKeys,取值范围true|false(默认值...

琦彦 2093

NVIDIA Jetson之交叉编译工具

参考:http://bbs.xfyun.cn/forum.php?mod=viewthread&amp;tid=33630 用TX2做红外热成像仪的识别,厂家不提供源码,只能提供对应版本的SDK,但是需要我们自己提供交叉编译器 由于之前没有做过交叉编译相关工作,对编译工具不太了解,因此查找相关资料学习下 交叉编译知识 一般来说,针对嵌入式平台的开发有两种编译模式:原生编译和交叉编译。原生编...

ZONGXP的博客 8385

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 348

MyBatis中参数使用 @Param 注解的四种使用场景

Mybatis中参数使用@Param注解的四种方式: 1、多个参数时 2、参数取别名时 3、使用$时 4、动态SQL参数作为变量时

Tumbler 9150

全新DEIM有效涨点改进目录 | 本专栏持续更新500+篇内容 | 包含各种顶会顶刊卷积、注意力、特征融合模块、有效特征聚合提取模块,上采样模块、下采样模块,二次创新模块、独家创新等几百种创新点改进

🚀【CVPR2025DEIM改进专栏速览】🔥 专栏提供500+篇目标检测创新改进方案,涵盖卷积/注意力/特征融合等创新改进点,均源自顶会论文及实战经验。支持多领域应用(工业/医疗/遥感等),配套完整教程和答疑服务。亮点包括: 1️⃣ 持续更新SOTA模型改进方案 2️⃣ 小白友好型实验操作指南 3️⃣ 跨学科科研支持(已助非计算机专业发表论文) 4️⃣ 提供虚拟环境配置方案。 订阅可获完整项目代码及交流群服务,适合研究生科研论文改进需求。价格呈上涨趋势,早订更优惠!

Ai缝合怪、助力小伙伴高效发论文 2051

MyBatis多参数传递之@Param究竟加还是不加?

背景:传递多个参数,常用的三种实现方式1.@Param注解传参2.Map传参法3.Java Bean传参法 那么@Param 使用场景都有哪些呢?为啥平时写代码有的时候不加会报错,有的时候不写也没问题? 一 、MyBatis多参数传递 四种情况需要加@Param 1.方法有多个参数,需要 @Param 注解 2.当需要给参数取一个别名的时候,需要 @Param 注解 List<Device> getDeviceListTest(@Param("deviceId") S...

Stronger的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

@Param 注解的四种使用场景

MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略! 有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。 但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加...

weixin_45582552的博客 2824

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!

有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。 但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。 有的人会觉得这是 MyBatis 各个版本差异的锅,不可否认,My...

江南一点雨的专栏 3941

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

@param详解注解

这是最常见的需要添加 @Param 注解的场景。

SOBE_rrr的博客 9457

MyBatis 中 @Param 注解的四种使用场景

即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。 有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。 第一种:方法有多个参数,需要 @Param 注解 如下: @Mapper public interface UserMapper { Integer insert ( @Param ("username") Str...

qq_41781316的博客 556

@param注解_你了解几种MyBatis 中 @Param 注解的使用场景

四种使用场景,最后一种经常被人忽略!有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。有的人会觉得这是 MyBatis 各...

weixin_39932181的博客 387

MyBatis @Param注解详解:多参数传递场景下的正确使用姿势

在Java持久层框架中,参数绑定是ORM(对象关系映射)的核心机制之一,它负责将Java方法中的参数值安全、正确地映射到SQL语句的占位符中。其原理在于框架需要构建一个参数映射上下文,以便在执行SQL时能够按名称或位置引用传入的数据。这项技术的价值在于保证了数据操作的类型安全性与可维护性,避免了SQL注入风险,并提升了开发效率。在动态SQL构建、多条件查询等常见应用场景中,清晰的参数传递机制尤为重要。本文聚焦于MyBatis框架中解决多参数映射问题的关键注解——@Param,深入解析其在不同参数场景下的绑定

weixin_34163553的博客 347

你了解几种MyBatis 中 @Param 注解的使用场景

你了解几种MyBatis 中 @Param 注解的使用场景 四种使用场景,最后一种经常被人忽略! 有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。 但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Pa...

Javazhoumou的博客 188

@order注解_MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!

有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。有的人会觉得这是 MyBatis 各个版本差异的锅,不可否认,MyBat...

weixin_39562606的博客 559

mybatis 动态传入表名 注解_你了解几种MyBatis 中 @Param 注解的使用场景

四种使用场景,最后一种经常被人忽略!有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。有的人会觉得这是 MyBatis 各...

weixin_28994403的博客 469
上一篇: shiro SecurityUtils.getSubject()获取的信息由来
下一篇: 从0开始的阿里云:申请域名以及解析域名到服务器IP
吐司吐丝
博客等级 码龄10年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值