返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis中使用InsertProvider注解报错解决全过程
  • 246
分享到

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

2024-04-02 19:04:59 246人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录使用InsertProvider注解报错解决mybatis注解开发@InsertProviderUserprovider类mapper的书写使用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);

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

--结束END--

本文标题: mybatis中使用InsertProvider注解报错解决全过程

本文链接: https://lsjlt.com/news/153583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作