mybatis中使用InsertProvider注解报错解决全过程

 更新时间:2022年07月06日 09:38:10   作者:fhqfjfh  
这篇文章主要介绍了mybatis中使用InsertProvider注解报错解决全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用InsertProvider注解报错解决

目前项目在使用mybatis,并且是使用注解的方式。

在使用InsertProvider注解的时候报了一下的错误:

org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation.  Cause: org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method........

注解是如下这个样子的

@InsertProvider(method = "insertlist",type=SqlProvider.class)
 public int insertInnerTable(List list,String dbTable);

思路是要写一个通用的插入一个集合的方法,但是在执行的时候就报了上面的错误。

在网上查资料未果。

于是只能自己动手,丰衣足食了。

一步步跟断点,跟到mybatis了报错的方法中,发现了如下的代码

try {
      this.sqlSourceParser = new SqlSourceBuilder(config);
      this.providerType = (Class<?>) provider.getClass().getMethod("type").invoke(provider);
      providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider);
      for (Method m : this.providerType.getMethods()) {
        if (providerMethodName.equals(m.getName())) {
          if (m.getParameterTypes().length < 2
              && m.getReturnType() == String.class) {
            this.providerMethod = m;
            this.providerTakesParameterObject = m.getParameterTypes().length == 1;
          }
        }
      }
    } catch (Exception e) {
      throw new BuilderException("Error creating SqlSource for SqlProvider.  Cause: " + e, e);
    }

注意标黄的位置,终于发现导致错误的罪魁祸首了,原来是这里限制了参数的个数,不能操作两个参数的啊。

于是将方法以及注解改为如下形式

@InsertProvider(method = "insert",type=SqlProvider.class)
 public int insert(SqlContext sqlContext);
在SqlProvider中对应的方法为
public String insert(SqlContext sqlContext){
      ........
}

至此问题解决

mybatis注解开发@InsertProvider

插入一条user的数据,可以直接根据username和password插入

//insert into user(username,password) values(?,?)
@Insert("insert into user(username,password) values(#{username},#{password})")
void save(User user);

但是如果有一个需求,要求传入username和password能正常输入,传入username、password、id也能够正常插入,这个时候就可以使用Provider注解。

这个的用法就是可以创建一个方法类,在类里面做判断,让mapper里面的查询方法根据写的方法来选择需要的sql语句。

Userprovider类

import com.sikiedu.springbootssm.entity.User;
public class Userprovider {    
    public String saveUser(User user)
    {
        if(user.getId()==null)
        {
            return "insert into user(username,password) values(#{username},#{password}) ";
        }
        else
        {
            return "insert into user values(#{id},#{username},#{password})";
        }
    }    
}

在这个类里面我们做判断,选择需要的sql语句。

mapper的书写

@InsertProvider(type = Userprovider.class,method="saveUser")
void save (User user);

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

相关文章

  • SpringBoot项目实现日志打印SQL的常用方法(包括SQL语句和参数)

    SpringBoot项目实现日志打印SQL的常用方法(包括SQL语句和参数)

    有时候遇到问题需要根据我们编写的SQL进行分析,但如果不进行一些开发或者配置的话,这些SQL是不会打印到控制台的,它们默认是隐藏的。下面给大家介绍几种常用的方法,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • java读取枚举类的值转成list和map方式

    java读取枚举类的值转成list和map方式

    这篇文章主要介绍了java读取枚举类的值转成list和map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring装配Bean教程之XML安装配置bean详解

    Spring装配Bean教程之XML安装配置bean详解

    大家都知道spring有多重配置方式,基于XML,基于注解,基于java类的配置,其中基于XML是最强大的一种,下面这篇文章主要给大家介绍了关于Spring装配Bean之XML安装配置bean的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Java使用位运算实现加减乘除详解

    Java使用位运算实现加减乘除详解

    这篇文章主要为大家详细介绍了Java如何使用位运算实现加减乘除,文中的示例代码讲解详细,对我们深入了解Java有一定的帮助,感兴趣的可以了解一下
    2023-05-05
  • SpringDataRedis简单使用示例代码

    SpringDataRedis简单使用示例代码

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Struts2修改上传文件大小限制方法解析

    Struts2修改上传文件大小限制方法解析

    这篇文章主要介绍了Struts2修改上传文件大小限制的相关内容,包括决定Struts2上传文件大小的因素,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • 一文搞懂如何实现Java,Spring动态启停定时任务

    一文搞懂如何实现Java,Spring动态启停定时任务

    定时任务的应用场景十分广泛,如定时清理文件、定时生成报表、定时数据同步备份等。本文将教你实现Java、Spring动态启停定时任务,感兴趣的可以学习一下
    2022-06-06
  • SpringBoot应用整合ELK实现日志收集的示例代码

    SpringBoot应用整合ELK实现日志收集的示例代码

    这篇文章主要介绍了SpringBoot应用整合ELK实现日志收集的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java字符串相关类使用方法详解

    Java字符串相关类使用方法详解

    String、StringBuilder、StringBuffer还傻傻分不清,下面这篇文章主要给大家介绍了关于Java字符串相关类使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Spring Cloud Gateway内置的断言和过滤器作用说明

    Spring Cloud Gateway内置的断言和过滤器作用说明

    这篇文章主要介绍了Spring Cloud Gateway内置的断言和过滤器作用说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论