mybatis中使用InsertProvider注解报错解决全过程
作者:fhqfjfh 发布时间:2021-06-25 18:36:42
标签: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);
来源:https://blog.csdn.net/fhqfjfh/article/details/84762912


猜你喜欢
- 本文实例为大家分享了Android实现支付宝记账饼图,点击旋转到最下面,供大家参考,具体内容如下代码:package com.example
- 推荐教程:idea2021以下版本适用,通过无限重置试用持续激活:https://www.jb51.net/article/198343.h
- 前言PowerManagerService之亮屏流程分析 分析了亮屏的流程,并归纳出了一个适用于亮屏或灭屏的通用的流程。 但是,灭屏流程还有
- 本文实例讲述了Java面向对象程序设计:继承,多态用法。分享给大家供大家参考,具体如下:本文内容:继承多态首发时期:2018-03-23继承
- 大家好,记得上次我带着大家一起实现了一个类似与淘宝客户端中带有的图片滚动播放器的效果,但是在做完了之后,发现忘了加入图片自动播放的功能(或许
- 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Threa
- 摘要:vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目
- 文章描述在前面两篇写完了对于GIF动态图片的分割和合成,这一篇来写下将视频文件分割成一帧帧图片的方法。开发环境.NET Framework版
- 绪论转眼间,2016伴随着互联网寒冬和帝都的雾霾马上就过去了,不知道大家今年一整年过得怎么样?最近票圈被各个城市的雾霾刷屏,内心难免会动荡,
- 前言这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分。这次主要是总结依赖注入的bean的装配方式。
- 当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel
- 多线程的创建,方式一:继承于Thread类1.创建一个继承于Thread类的子类2.重写Thread类的run()--->将此线程执行
- 本文主要研究的是关于Java中重载,重写,多态,静态绑定、动态绑定的相关内容,具体如下。重载,英文名是overload,是指在一个类中定义了
- 背景在用了一阵子 Ktor 之后,深感基于协程的方便,但是公司的主要技术栈是 SpringBoot,虽然已经整合了 Kotlin,但是如果有
- 下面给大家介绍C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能,具体代码如下所示:using Syst
- 本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下:重力感应主要是依靠手机的加速度传感器(acceleromet
- 前言现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty...等等数都数不过来的软件,要满足通用性,
- 布局中listview要覆盖标题栏 int mTouchSlop = ViewConfiguration.get(this).getScal
- 本文为大家分享了CountDownTimer模拟短信验证倒计时的具体代码,供大家参考,具体内容如下内容:介绍倒计时CountDownTime
- Spring多配置文件有什么好处? 按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与