MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!
有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的。即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解。
但是,在你总结出规律之前,你可能会觉得莫名其妙,有的时候一个参数明明不用添加 @Param 注解,有的时候,却需要添加,不添加会报错。
有的人会觉得这是 MyBatis 各个版本差异的锅,不可否认,MyBatis 发展很快,不同版本之间的差异还挺明显的,不过这个加不加 @Param 注解的问题,却并不是版本的锅!今天松哥就和大家来聊一聊这个问题,到底哪些情况下需要添加 @Param 注解。
首先,如下几个需要添加 @Param 注解的场景,相信大家都已经有共识了:
第一种:方法有多个参数,需要 @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); }
对应的 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 注解,而这种情况却经常被人忽略!
好了,不知道大家有没有 GET 到呢?有问题欢迎留言讨论。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解
前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍,也发布了很多场景案例文章,这些文章收录在这个合集中《表格存储Tablestore权威指南》。值得一提的是,Tablestore可以支撑海量的数据规模,也提供了多种索引来支持丰富的查询模式,同时作为一个多模型数据库,提供了多种模型的抽象和特有接口。本文主要对Tablestore的存储和索引引擎进行介绍和解读,让大家对Tablestore引擎层的原理和能力,索引的作用和使用方式等有一个认识。 基本架构 Tablestore是一款云上的Serverless的分布式NoSQL多模型数据库,提供了丰富的功能。假设用户可以采用各种开源组件搭建一套类似服务,可以说是成本非常高昂,而使用
- 下一篇
阿里云邮箱企业版怎么办理
阿里云邮箱企业版怎么办理,阿里邮箱企业版购买,阿里云企业邮箱购买,阿里云企业邮箱免费试用询“阿里邮箱华南400服务0662020中心”。阿里物联网、大数据、云计算和人工智能的结合是工业4.0,它涉及到一系列有关智能制造的概念。云计算本身是通过使用电子商务的剩余计算能力而诞生的。它利用剩余的计算能力为其他企业提供云计算服务。云计算提供了一站式解决方案,大大降低了互联网企业提供服务的门槛。云计算已经逐渐成为互联网发展的基础。设施、抢占这个市场的重要性不言而喻。IT企业(互联网企业)是推动云计算发展的主力军。一些资源集成能力强的IT企业会自行构建云计算平台,而大多数IT企业主要使用云计算平台为用户提供服务。由于云计算平台的建设需要大量的资金投入和庞大的技术队伍,因此,具有公共云能力的IT企业仍然寥寥无几。最后,云计算作为第三方信息技术的代表技术之一,未来将具有广阔的发展空间。未来,随着云计算和边缘计算的结合,整个网络的服务体验将逐步得到改善。最后,尽管大数据和云计算有不同的关注点,但它们基于分布式存储和分布式计算技术架构,因此它们密切相关。阿里云企业版邮箱申请,阿里云邮箱企业版开通,阿里云企...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境