写点什么

Mybatis 省略 @Param 注解原理

作者:吴明
  • 2022 年 6 月 30 日
  • 本文字数:1101 字

    阅读完需:约 4 分钟

环境配置

jdk1.8


mybatis3.4.1

springboot2.0

起源:

编写 mybatis 的 Demo 程序时,mapper 传递多参数时,需要添加 @param 注解指定传递参数名称,而在 springboot 整合的 mybatis 则可以省略 @param 注解。于是乎,开始探究原因。

涉及到的知识点:


jdk8 新增了-parameters 参数,开启此参数可以将编译后的 class 文件保留源码中的参数名称,而不是(arg0,arg1)。保留参数名称方便判断反射参数。此处便运用在 Mybatis 中 mapper 接口传参中。

1、新建 mybatis 的 Demo 项目

首先创建一个单独的 MyBatis 项目,并编写 UserMapper.java 接口文件和 XML 文件,这里接口方法省略 @Param 注解。


public interface UserMapper {    User getUser(String username, String password);}
复制代码

编写完接口 XML 文件后,进行最后一步,编写测试类


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 版本没有添加该参数。


谢谢您的阅览,希望这篇文章对您有所帮助!

发布于: 刚刚阅读数: 6
用户头像

吴明

关注

还未添加个人签名 2022.06.27 加入

还未添加个人简介

评论

发布
暂无评论
Mybatis省略@Param注解原理_MyBatis标签_吴明_InfoQ写作社区