我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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);

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Eclipse中使用Mybatis Generator报错怎么解决

本篇内容介绍了“Eclipse中使用Mybatis Generator报错怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Eclip
2023-06-02

mybatis中使用foreach出现报错如何解决

这篇文章将为大家详细讲解有关mybatis中使用foreach出现报错如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。发现问题在mybatis的动态sql中最常见的错误就是使用,比如:
2023-05-31

Mybatis中Mapper使用package方式配置报错如何解决

这篇文章主要讲解了“Mybatis中Mapper使用package方式配置报错如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis中Mapper使用package方式配置报错
2023-06-20

chatGPT使用及注册过程中常见的一些错误解决方法(所以报错汇总)

这篇文章主要介绍了chatGPT注册报错及使用过程中报错汇总及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-02-08

win11安装过程中报错如何解决

在安装Windows 11过程中出现错误时,可以尝试以下方法解决:1. 检查系统要求:确保你的计算机符合Windows 11的系统要求,包括64位处理器、4GB RAM、64GB存储空间、DirectX 12兼容的显卡等。2. 更新驱动程序
2023-08-28

npm install安装过程中报错怎么解决

今天小编给大家分享一下npm install安装过程中报错怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项目拷到本地
2023-07-02

mysql调用存储过程报错怎么解决

当在MySQL中调用存储过程时出现错误,可以尝试以下解决方法:检查存储过程的语法:确保存储过程的语法正确,没有语法错误。可以通过SHOW CREATE PROCEDURE procedure_name;命令查看存储过程的定义。检查参数传递:
mysql调用存储过程报错怎么解决
2024-04-09

Vue中使用stylus报错的解决

如果你也和我一样,按照正常的流程下载并且配置了stylus,但是依旧报错,也许这篇文章就是你的菜,一起来看看吧
2022-11-13

SQLServer中offset使用报错怎么解决

在SQL Server中,OFFSET和FETCH NEXT子句用于分页查询数据。如果您在使用OFFSET和FETCH NEXT时遇到错误,请尝试以下解决方法:检查SQL Server版本:OFFSET和FETCH NEXT子句是在SQL
SQLServer中offset使用报错怎么解决
2024-04-09

PHP中mysqli_num_rows使用报错怎么解决

在PHP中,mysqli_num_rows()函数用于获取结果集中的行数。如果你在使用该函数时遇到了错误,有几种可能的解决办法:检查SQL查询语句是否正确:首先,确保你的SQL查询语句是正确的,可以在数据库管理工具中测试该查询语句是否返回了
PHP中mysqli_num_rows使用报错怎么解决
2024-04-09

C++中resetcontent使用报错怎么解决

当您在C++中使用"resetcontent"时报错,可能是因为该函数或变量未定义。要解决此问题,可以尝试以下几种方法:确保正确包含必要的头文件:检查是否正确包含了相关的头文件,例如,如果您使用了MFC类,可能需要包含"afxwin.h"头
C++中resetcontent使用报错怎么解决
2024-02-29

python中timeout使用报错怎么解决

在Python中使用timeout时常见的错误可能是超时异常引起的,可以通过捕获异常并处理来解决。以下是一个示例代码:import timeimport signalclass TimeoutError(Exception):passd
python中timeout使用报错怎么解决
2024-03-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录