Mybatis省略@Param注解原理分析
作者:吴明_yst 发布时间:2023-06-19 16:08:44
标签:Mybatis,@Param,注解
环境配置:
jdk1.8
mybatis3.4.1
springboot2.0
起始原因:
编写mybatis的Demo程序时,mapper传递多参数时,需要添加@param注解指定传递参数名称,而在springboot整合的mybatis则可以省略@param注解。于是乎,开始探究原因。
涉及到的知识点:
jdk8新增了-parameters参数,开启此参数可以将编译后的class文件保留源码中的参数名称,而不是(arg0,arg1)。保留参数名称方便判断反射参数。此处便运用在Mybatis中mapper接口传参中。
1、新建mybatis的Demo项目
编写UserMapper.java,这里省略@Param注解。
public interface UserMapper {
User getUser(String username, String password);
}
编写测试类
public class MyBatisTest {
@Test
public void testCrud() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User admin = mapper.getUser("admin", "123456");
System.out.println(admin);
}
}
Debug路线如下: 直接上图
此时参数封装的结构为:
然后就不出意外的报错了
那么如何解决呢?
2、添加-parameters参数后的执行结果如下
在pom文件添加插件并参加参数,参数的意义: 让编译器在编译代码时,保留参数的实际名称。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
添加插件和参数后, 可以在idea查看编译器添加参数的情况。
此时Mybatis封装参数效果如下:
那么执行结果如何呢?
没有问题,只是数据库没有匹配的数据。
那么为什么springboot项目我们没有配置过这类的参数,但是也可以省略@param注解呢?
3、springboot项目为什么不用另外配置-parameters参数呢
新建一个springboot项目(2.0.3版本)
此时就看到了熟悉的关键字。为了确认是否这个参数,于是乎将这一段注释掉。
想法得到验证。
springboot1.5.1版本没有添加该参数。
来源:https://blog.csdn.net/qq_50661854/article/details/124443139


猜你喜欢
- 用一道选择题作为本文的开始吧! ArrayList list = new ArrayList(20);中的list扩充几次 A.0 B.1
- 此文章是看郭神公众号发的一篇,仅作学习。在modlue gradle中添加compile 'cjt.library.wheel:ca
- 看到ios版上QQ刷新效果像水滴,然后自己也想着去实现这样的效果,这篇文章暂时没有介绍下拉刷新的效果,只是单独用一个控件来实现这样的水滴效果
- 通过邮件找回密码功能的实现1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是
- 目录1、成员2、辅助功能3、字段4、方法4.1参数4.2方法主体和局部变量4.3静态和实例方法4.4虚方法、重写方法和抽象方法4.5方法重载
- 本文实例讲述了Java TreeMap排序算法。分享给大家供大家参考,具体如下:TreeMap 和 HashMap 用法大致相同,但实际需求
- java 方法签名,我想做java 开发的朋友也知道,方法签名的重要性,是方法重载的一个比较好的解释,尤其是在后续优化方面,这里记录下,有看
- 一、文件上传的必要前提A form 表单的 enctype 取值必须是:multipart/form-data(默认值是:applicati
- 1、什么是委托从数据结构来讲,委托是和类一样是一种用户自定义类型。委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。
- 背景两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),n
- IDEA SpringBoot项目配置热更新的步骤1.在pom.xml中添加依赖:<dependency><groupId
- 该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、T
- JSR303简介JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernat
- Android 图片添加水印的实现方法实现效果图:手机端打水印(文字和图片)使用的是Bitmap、Matrix和Canvas类的一些方法,
- 环境准备JDK 1.8,Springboot 2.1.3.RELEASE,spring-boot-starter-aop.2.1.4.REL
- 面向对象三要素:封装、继承、多态。封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。我们应该
- 这篇文章主要介绍了springboot多租户设计过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecim
- Java注解介绍基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,
- AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度