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

@Param注解导致分页失效—分页拦截器

问题描述

在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据。

出现问题时,分页策略为:分页拦截器实现的分页

【错误写法】

service写法:

public Page<Entity> getByNidAndEntity(Page<Entity> page,String nid,Entity entity){
       entity.setPage(page);
       page.setList(dao.getByNidAndEntity(nid,entity));
       return page;
}

dao方法声明:

List<Entity> getByNidAndEntity(@Param("nid") String nid,@Param("entity")Entity entity);

mapper.xml中的sql:

<select id="getByNidAndEntity" resultType="Entity">
      select <include refid="entityColumns" />
      from entity_table et left join other_table ot on et.id = ot.eid
      where ot.nid = #{nid}
      and et.name = #{entity.name} and et.remarks = #{entity.remarks}
</select>

原因解析

【关键原因】

  • 根源问题在于:在PaginationInterceptor中,分页对象Page被解析为null,导致的分页失效
  • 由于@Param会将参数封装到ParamMap中,而page对象在实体类entity中,导致convertParameter方法返回的page对象为null

【mybatis原码:@Param将参数封装到ParamMap】

跟踪源码进入:org.apache.ibatis.binding.MapperMethod.class

进入executeForMany方法:

进入convertArgsToSqlCommandParam方法,可以看到参数封装到ParamMap中:

解决办法

  • 不使用@Param注解:在传递多个参数(或是多个javaBean)时,可以使用一个包含page属性的实体类进行封装
  • 使用@Param注解:根据需求修改BaseInterceptor类中的convertParameter方法,使得解析page对象不为null即可

到此这篇关于解决Mybatis的@Param()注解导致分页失效的问题的文章就介绍到这了,更多相关Mybatis分页失效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis-plus新版本分页失效PaginationInterceptor过时的问题

    一.确认mybatis-plus-boot-starter版本 3.4.0版本对此部分有更新,如果是旧版本升级,会出现分页失效问题,同时idea会提示PaginationInterceptor过时,新版本改用了MybatisPlusInterceptor 二.Mybatis-plus3.4.0版本配置 更改新版配置后,分页功能正常,注意DbType.MYSQL改为自己使用的数据库类型,否则分页也不生效 @Configuration public class MyBatisPlusConfig {

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

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

  • MyBatis不用@Param传递多个参数的操作

    背景 假设我们要保存一个小狗的信息到数据库中 通常的做法 我们在使用mybatis 接口和xml对应的时候,常常是这样写的: 接口 public interface DogDao { void save(@Param("dogName") String dogName, @Param("age")int age); } xml <insert id="save"> INSERT INTO dog values (null, #{dog

  • 浅谈为什么要使用mybatis的@param

    起因 我们先来看一个报错 报错很简单,参数 start 没找到. 我是在实现一个 API 接口时发现了一个问题,当我不使用 @Param 标签时,mybatis 是不认识哪个参数叫什么名字的,尽管我定义了 (long start,long end) 它仍然不认识.在这个接口上,我希望根据前端传来的参数,查找指定范围的数据,例如:我想搜索第二页的数据,假设一页20个,那么搜索的范围就是21-40,于是就会调用接口中的 getTypeListByRange 来查找对应 mapper 的 SQL 语句

  • 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的用法和作用详解

    用注解来简化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}")

  • 解决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注解的用法详解

    目录 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注解的作用说明

    目录 @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.新建mybatis的Demo项目 2.添加-parameters参数后的执行结果如下 3.springboot项目为什么不用另外配置-parameters参数呢 环境配置: jdk1.8 mybatis3.4.1 springboot2.0 起始原因: 编写mybatis的Demo程序时,mapper传递多参数时,需要添加@param注解指定传递参数名称,而在springboot整合的mybatis则可以省略@param注解.于是乎,开始探究原因. 涉及到的知识点: jdk8新增了-p

  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    目录 问题背景 mybatis拦截器使用 使用方法: 注解参数介绍: setProperties方法 bug内容: 自定义拦截器部分代码 PageInterceptor源码: 解决方法: 解决方案一 调整执行顺序 解决方案二 修改拦截器注解定义 问题背景 在最近的项目开发中遇到一个需求 需要对mysql做一些慢查询.大结果集等异常指标进行收集监控,从运维角度并没有对mysql进行统一的指标搜集,所以需要通过代码层面对指标进行收集,我采用的方法是通过mybatis的Interceptor拦截器进行

  • 解决@Transaction注解导致动态切换更改数据库失效问题

    目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transactional失效的场景及原理 1.@Transactional修饰的方法 2.在类内部没有添加@Transactional的方法 3.就是在@Transactional方法内部捕获了异常 @Transaction注解导致动态切换更改数据库失效 使用场景 给所有的Controller方法上加切点 在@Before注解的方法里,根据http请求中携带的header,动态切换数据源 使用mybati

随机推荐