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);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
IntelliJ IDEA中Tomcat日志乱码问题的解决指南
在使用IntelliJ IDEA进行Java开发时,Tomcat作为常用的服务器,往往被集成在开发环境中,许多开发者可能会遇到这样一个问题:启动 Tomcat 服务器时,控制台的日志输出出现了乱码,本文将详细介绍如何通过修改IntelliJ IDEA和Tomcat的相关配置,彻底解决日志输出乱码的问题2024-10-10
SpringBoot开发项目,引入JPA找不到findOne方法的解决
这篇文章主要介绍了SpringBoot开发项目,引入JPA找不到findOne方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
spring中的注解@@Transactional失效的场景代码演示
这篇文章主要介绍了spring中的注解@@Transactional失效的场景代码演示,@Transactional注解是Spring框架提供的用于声明事务的注解,作用于类和方法上,需要的朋友可以参考下2024-01-01
基于Java的度分秒坐标转纯经纬度坐标的漂亮国基地信息管理的方法
本文以java语言为例,详细介绍如何管理漂亮国的基地信息,为下一步全球的空间可视化打下坚实的基础,首先介绍如何对数据进行去重处理,然后介绍在java当中如何进行度分秒位置的转换,最后结合实现原型进行详细的说明,感兴趣的朋友跟随小编一起看看吧2024-06-06


最新评论