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.原始的方法

当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用Map,例如接口

public List<Role> findRoleByMap(Map<String, Object> parameter);
<select id="findRoleByMap" parameterType="map" resultType="role">
    SELECT id,name FROM t_role
    WHERE roleName=#{roleName}
    AND note=#{note}
<select>

测试代码:

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Map<String, Object> parameter = new HashMap<>();
parameter.put("roleName", "剑士");
parameter.put("note", "决战紫禁之巅");
List<Role> roles = roleMapper.findRolesByMap(parameter);

3.使用@Param

很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用@Param的情况,需要将接口改为

public List<Role> findRoleByAnnotation(@Param("roleName") String roleName, @Param("note") String note);

这样我们就可以直接传入对应的值了。

当然也可以使用Java Bean来传递多个参数,定义一个POJO

public class RoleParam {
    private String roleName;
    private String note;
    /*getter和setter*/
}

此时接口就变为

public List<Role> findRoleByBean(RoleParam role);

这样对应的xml文件与1处的区别就在于id和parameterType发生了变化,id对应的方法和parameterType对应该类的权限定名。

而使用更多的场景可能是这样的,对应多个POJO

public List<Role> findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);

这样就可以进行如下映射:

<select id="findRoleByMix" resultType="role">
    SELECT id,name FROM t_role
    WHERE roleName=#{roleP.roleName}
    AND note=#{rolep.note}
    AND level=#{permissionP.level}
<select>

注意此时并不需要写出parameterType属性,Mybatis会进行自动搜索。

小结一下:最后也许会有小火办会问,那@Param和@RequestParam是什么关系呢?其实它们没有关系,就跟Java和JavaScript,雷锋和雷锋塔一样,拥有相似的外表,其实作用是不一样的,@Param是地处Dao层,是为了传递多个参数,解决的是可读性和直观性;而@RequestParam是位列Controller层,作用是为获取前端参数,解决的是前后端参数不一致的问题。所以它们没有关系!

@Param注解和参数使用

1.使用@Param注解

当以下面的方式进行写SQL语句时:

@Select("select column from table where userid = #{userid} ")
public int selectColumn(int userid);

当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以。

@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);

当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。

@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);

2.不使用@Param注解

不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。

// 这里id是user的属性
@Select("SELECT * from Table where id = ${id}")
Enchashment selectUserById(User user);

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

(0)

相关推荐

  • 解决MyBatis @param注解参数类型错误异常的问题

    问题现象 今天使用mybatis遇到个很奇怪的问题,我使用一个参数@param("threshold"),类型是java的double,但是很奇怪,一直告诉我参数转换错误,int不能转double,我就奇怪了,哪里来的int. 解决办法 我感觉可能使用用到了mybatis的关键字,所以就把threshold换了个名字,果然好了. 问题原因 某些关键词,mybatis会认为是某种类型,下面列出来一些,后面发现再补充. size, threshold, modCount是int类型 loa

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

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

  • 解决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省略@Param注解操作

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

  • mybatis多个接口参数的注解使用方式(@Param)

    1 简介 1.1 单参数 在 Mybatis 中, 很多时候, 我们传入接口的参数只有一个. 对应接口参数的类型有两种, 一种是基本的参数类型, 一种是 JavaBean . 例如在根据主键获取对象时, 我们只需要传入一个主键的参数即可. 而在插入, 更新等操作时, 一般会涉及到很多参数, 我们就使用 JavaBean . 1.2 多参数 但是, 在实际的情况中, 我们遇到类似这样的情况可能: 接口需要使用的参数多于一个: 接口需要使用的参数又远少于对应 JavaBean 的成员变量, 或者需要

  • 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注解的作用说明 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注解的用法详解

    目录 1.概述 2.实例: 实例一:@Param注解基本类型的参数 实例二:@Param注解JavaBean对象 3.注意点 附:为什么要用@param 总结 1.概述 首先明确这个注解是为SQL语句中参数赋值而服务的. @Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param("userId") int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了.将参数值传如SQL语句中,通过#{userId

  • mybatis中@Param注解总是报取不到参数问题及解决

    目录 @Param注解总是报取不到参数 错误如下 @Param注解详细使用方法 1.@Param这个注解是用来解决接口方法有多个参数时 2.可以修饰JavaBean对象.Map集合等 3.@Param参数其实可加可不加 4.使用@Param注解好处 @Param注解总是报取不到参数 springboot+mybatis项目中,在mapper 层传多个参数,请求时总是报参数取不到,快疯了,我发誓xml层没问题,mapper层参数名也没问题 错误如下 百度了好久,一直让我检查.xml文件是否存在问题

  • Mybatis中@Param的用法和作用详解

    用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 我们先来看Mapper接口中的@Select方法 package Mapper; public interface Mapper { @Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}")

  • 浅谈Spring中@Import注解的作用和使用

    @Import用来导入@Configuration注解的配置类.声明@Bean注解的bean方法.导入ImportSelector的实现类或导入ImportBeanDefinitionRegistrar的实现类. @Import注解的作用 查看Import注解源码 /** * Indicates one or more {@link Configuration @Configuration} classes to import. * * <p>Provides functionality eq

  • Spring中@DependsOn注解的作用及实现原理解析

    本文给大家讲解Spring中@DependsOn注解的作用及实现原理! 官方文档解释 Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean. Used infrequently in cases where a bean does not explicitly depend on another thro

  • 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新增了-p

随机推荐