Mybatis省略@Param注解原理分析

目录
  • 1、新建mybatis的Demo项目
  • 2、添加-parameters参数后的执行结果如下
  • 3、springboot项目为什么不用另外配置-parameters参数呢

环境配置:

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2022-06-22

Mybatis Mapper中多参数方法不使用@param注解报错的解决

目录 问题描述 寻求解决方案 寻找原因 拓展延伸 在使用低版本的Mybatis的时候,Mapper中的方法如果有多个参数时需要使用@param注解,才能在对应xml的sql语句中使用参数名称获取传入方法的参数值,否则就会报错.本文结合自身在真实开发环境中使用IDEA开发时遇到的问题来共同探讨一下不使用@Param注解报错背后的原因以及解决方案. 问题描述 最近使用IDEA进行开发,项目使用SpringBoot+Mybatis3.4.6,同样的代码检出到本地IDEA后运行,在一个业务查询模块报错,

Mybatis中@Param注解的作用说明

目录 @Param注解的作用说明 1.关于@Param 2.原始的方法 3.使用@Param @Param注解和参数使用 1.使用@Param注解 2.不使用@Param注解 @Param注解的作用说明 1.关于@Param @Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳. 2.原始的方法 当只有一个参数时,没什么好说的

mybatis省略@Param注解操作

项目是Springboot+mybatis,每次写一堆@Param注解感觉挺麻烦,就找方法想把这个注解给省了,最后确实找到一个方法 1.在mybatis的配置里有个属性useActualParamName,允许使用方法签名中的名称作为语句参数名称 我用的mybatis:3.4.2版本Configuration中useActualParamName的默认值为true 源码简单分析: MapperMethod的execute方法中获取参数的方法convertArgsToSqlCommandParam

Mybatis使用@param注解四种情况解析

一.方法有多个参数 例如: 接口方法: @Mapper public interface UserMapper { Integer insert(@Param("username") String username, @Param("address") String address); } 对应的xml: <insert id="insert" parameterType="org.javaboy.helloboot.bean.U

解决Mybatis的@Param()注解导致分页失效的问题

@Param注解导致分页失效-分页拦截器 问题描述 在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据. 出现问题时,分页策略为:分页拦截器实现的分页 [错误写法] service写法: public Page<Entity> getByNidAndEntity(Page<Entity> page,String nid,Entity entity){ entity.setPage(page); page.setList(dao.getB

MyBatis&nbsp;@Param注解的实现

先说结论: 当输入参数只有一个且没有使用@Param注解时,MyBatis会直接传递这个参数:当输入参数多于一个,或者使用了@Param注解时,MyBatis会将参数封装在Map中传递,这时的Map的key分为以下几种可能: Map中会有param1, param2这样的key,其顺序对应输入参数的顺序.无论是否有@Param注解. 对于@Param注解的参数,Map中会保存注解中给定的名字作为key 对于没有用@Param注解的参数,Map中会用1.2.3 ..这样的数字作为key,按顺序保存

详解spring boot mybatis全注解化

本文重点给大家介绍spring boot mybatis 注解化的实例代码,具体内容大家参考下本文: pom.xml <!-- 引入mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version

Mybatis 开发注解快速入门

快速普及 1.mybatis是什么 mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis实现了接口绑定,使用更加方便. 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来

Mybatis中注解@MapKey的使用详解

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

前言 距离第一篇 Spring Boot 系列的博文 3 个月了.虽然 XML 形式是我比较推荐的,但是注解形式也是方便的.尤其一些小系统,快速的 CRUD 轻量级的系统. 这里感谢晓春 http://xchunzhao.tk/ 的 Pull Request,提供了 springboot-mybatis-annotation 的实现. 一.运行 springboot-mybatis-annotation 工程 然后Application 应用启动类的 main 函数,然后在浏览器访问: http

Mybatis基于注解形式的sql语句生成实例代码

对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方式,可能以后会逐渐完善起来.第一次写博客,写的简单点. package com.bob.config.mvc.mybatis; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retenti

Mybatis基于注解实现多表查询功能

对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多.在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充. 同样的先介绍一下Demo的情况:存在两个实体类用户类和账户类,用户类可能存在多个账户,即一对多的表关系.每个账户只能属于一个用户,即一对一或者多对一关系.我们最后实现两个方法,第一个实现查询所有用户信息并同时查询出每个用户的账户信息,第二个实现查询所有的账户信息并且同时查询出其所属的用户信息. 1.项目

MyBatis使用注解开发实现过程详解

使用注解开发 1.面向接口编程 面向接口编程的根本原因:解耦,可扩展,提高复用,分层开发中.上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性好 2.使用注解开发 注解在接口上实现 @Select(value = "select * from user") List<User> getUsers(); 需要在核心配置文件中绑定接口 <!--绑定接口--> <mappers> <mapper class="rui.da

Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库操作中的常用操作. 其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,以及增删改查,参数传递等注解的常用操作. 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)已经介绍过了,不清楚的朋友可

Spring与Mybatis基于注解整合Redis的方法

基于这段时间折腾redis遇到了各种问题,想着整理一下.本文主要介绍基于Spring+Mybatis以注解的形式整合Redis.废话少说,进入正题. 首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图: 一,先上jar包 二,创建实体类 package com.sl.user.vo; import java.io.Serializable; import com.fasterxml.jackson.databind.PropertyNamingSt