mybatis中使用InsertProvider注解报错解决全过程
作者:fhqfjfh 时间:2021-06-25 18:36:42
使用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
标签:mybatis,InsertProvider,注解,报错
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Spring自动装配之方法、构造器位置的自动注入操作
2021-11-30 23:28:40
Java查找不重复无序数组中是否存在两个数字的和为某个值
2023-08-22 16:44:40
Java8 Comparator源码演示及解析
2023-09-18 10:51:12
![](https://img.aspxhome.com/file/2023/1/58581_0s.png)
Java读取txt文件中的数据赋给String变量方法
2022-08-04 22:32:19
Java BufferWriter写文件写不进去或缺失数据的解决
2023-07-20 14:57:02
Java SpringMVC数据响应超详细讲解
2022-04-08 15:10:26
![](https://img.aspxhome.com/file/2023/1/63161_0s.png)
Java利用POI读取、写入Excel的方法指南
2023-11-23 15:39:23
![](https://img.aspxhome.com/file/2023/9/59899_0s.png)
基于Java GUI 事件处理方式
2023-11-25 13:08:55
![](https://img.aspxhome.com/file/2023/9/60079_0s.png)
Java常用类String的面试题汇总(java面试题)
2023-11-23 20:40:45
怎么把本地jar包放入本地maven仓库和远程私服仓库
2023-12-05 20:13:00
![](https://img.aspxhome.com/file/2023/8/63088_0s.png)
java生成图片验证码示例程序
2023-09-13 10:17:57
java数据库唯一id生成工具类
2023-04-04 22:53:34
详解Java使用Jsch与sftp服务器实现ssh免密登录
2023-11-24 18:34:18
JavaWeb中使用JavaMail实现发送邮件功能实例详解
2023-01-07 13:54:37
![](https://img.aspxhome.com/file/2023/1/60821_0s.png)
在IDEA中maven配置MyBatis的流程详解
2021-08-26 17:02:27
![](https://img.aspxhome.com/file/2023/8/60468_0s.png)
Java数据结构超详细分析二叉搜索树
2022-12-01 01:34:20
![](https://img.aspxhome.com/file/2023/3/61023_0s.jpg)
JavaWeb实现文件上传下载功能实例解析
2023-10-07 17:41:39
![](https://img.aspxhome.com/file/2023/9/62629_0s.png)
Zookeeper和Eureka哪个更好?
2023-11-10 02:57:35
JAVA基础之一些不为人知的那些秘密
2023-11-29 07:49:29
![](https://img.aspxhome.com/file/2023/8/59748_0s.jpg)
JAVA提高第八篇 动态代理技术
2023-07-19 07:13:12
![](https://img.aspxhome.com/file/2023/9/62829_0s.jpg)