mybatis中使用InsertProvider注解報錯解決全過程

 更新時間:2022年07月06日 09:38:10   作者:fhqfjfh  
這篇文章主要介紹了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);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 解決JSONObject.toJSONString()輸出null的問題

    解決JSONObject.toJSONString()輸出null的問題

    這篇文章主要介紹了解決JSONObject.toJSONString()輸出null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java建立子類方法總結

    java建立子類方法總結

    在本篇文章里小編給大家分享了關于java建子類的步驟和方法,需要的朋友們跟著學習下。
    2019-05-05
  • 詳解JAVA里面獲取map的key和value的方法

    詳解JAVA里面獲取map的key和value的方法

    這篇文章主要介紹了詳解JAVA里面獲取map的key和value的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • springboot項目啟動慢的問題排查方式

    springboot項目啟動慢的問題排查方式

    這篇文章主要介紹了springboot項目啟動慢的問題排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 實戰項目錘煉之醫院門診收費管理系統的實現流程

    Java 實戰項目錘煉之醫院門診收費管理系統的實現流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰中才能獲得能力的提升,本篇文章手把手帶你用java+html+jdbc+mysql實現一個醫院門診收費管理系統,大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • java發送短信系列之同步、異步發送短信

    java發送短信系列之同步、異步發送短信

    這篇文章主要介紹了java發送短信系列之同步、異步發送短信的相關資料,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現

    SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現

    今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應用最廣的測試框架,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatis是如何實現日志模塊的詳解

    MyBatis是如何實現日志模塊的詳解

    這篇文章主要給大家介紹了關于MyBatis是如何實現日志模塊的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用MyBatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-10-10
  • 淺談Java鎖機制

    淺談Java鎖機制

    在多線程環境下,程序往往會出現一些線程安全問題,為此,Java提供了一些線程的同步機制來解決安全問題,比如:synchronized鎖和Lock鎖都能解決線程安全問題。下面小編就來詳細介紹該知識點,需要的朋友可以參考一下
    2021-09-09
  • Spring實現一個簡單的SpringIOC容器

    Spring實現一個簡單的SpringIOC容器

    本篇文章主要介紹了Spring實現一個簡單的SpringIOC容器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04

最新評論

美丽人妻被按摩中出中文字幕