mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程
使用InsertProvider注解報(bào)錯(cuò)解決
目前項(xiàng)目在使用mybatis,并且是使用注解的方式。
在使用InsertProvider注解的時(shí)候報(bào)了一下的錯(cuò)誤:
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........
注解是如下這個(gè)樣子的
@InsertProvider(method = "insertlist",type=SqlProvider.class) ?public int insertInnerTable(List list,String dbTable);
思路是要寫一個(gè)通用的插入一個(gè)集合的方法,但是在執(zhí)行的時(shí)候就報(bào)了上面的錯(cuò)誤。
在網(wǎng)上查資料未果。
于是只能自己動(dòng)手,豐衣足食了。
一步步跟斷點(diǎn),跟到mybatis了報(bào)錯(cuò)的方法中,發(fā)現(xiàn)了如下的代碼
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); ? ? }
注意標(biāo)黃的位置,終于發(fā)現(xiàn)導(dǎo)致錯(cuò)誤的罪魁禍?zhǔn)琢耍瓉硎沁@里限制了參數(shù)的個(gè)數(shù),不能操作兩個(gè)參數(shù)的啊。
于是將方法以及注解改為如下形式
@InsertProvider(method = "insert",type=SqlProvider.class) ?public int insert(SqlContext sqlContext); 在SqlProvider中對(duì)應(yīng)的方法為 public String insert(SqlContext sqlContext){ ? ? ? ........ }
至此問題解決
mybatis注解開發(fā)@InsertProvider
插入一條user的數(shù)據(jù),可以直接根據(jù)username和password插入
//insert into user(username,password) values(?,?) @Insert("insert into user(username,password) values(#{username},#{password})") void save(User user);
但是如果有一個(gè)需求,要求傳入username和password能正常輸入,傳入username、password、id也能夠正常插入,這個(gè)時(shí)候就可以使用Provider注解。
這個(gè)的用法就是可以創(chuàng)建一個(gè)方法類,在類里面做判斷,讓mapper里面的查詢方法根據(jù)寫的方法來選擇需要的sql語(yǔ)句。
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})"; ?? ??? ?} ?? ?}?? ? }
在這個(gè)類里面我們做判斷,選擇需要的sql語(yǔ)句。
mapper的書寫
@InsertProvider(type = Userprovider.class,method="saveUser") void save (User user);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼2016-11-11idea創(chuàng)建springboot項(xiàng)目(版本只能選擇17和21)的解決方法
idea2023創(chuàng)建spring boot項(xiàng)目時(shí),java版本無法選擇11,本文主要介紹了idea創(chuàng)建springboot項(xiàng)目(版本只能選擇17和21),下面就來介紹一下解決方法,感興趣的可以了解一下2024-01-01MybatisPlus整合Flowable出現(xiàn)的坑及解決
這篇文章主要介紹了MybatisPlus整合Flowable出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03通過實(shí)例了解Java Integer類和int的區(qū)別
這篇文章主要介紹了通過實(shí)例了解Java Integer類和int的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03idea2023設(shè)置啟動(dòng)參數(shù)、單元測(cè)試啟動(dòng)參數(shù)
在使用IDEA進(jìn)行開發(fā)時(shí),我們可以通過設(shè)置一些啟動(dòng)參數(shù)來優(yōu)化開發(fā)環(huán)境的性能和體驗(yàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11springboot項(xiàng)目整合mybatis并配置mybatis中間件的實(shí)現(xiàn)
這篇文章主要介紹了springboot項(xiàng)目整合mybatis并配置mybatis中間件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04