@UpdateProvider註解中遇到的問題

weixin_34162695發表於2018-11-09

      忙碌了兩週,忙裡投個閒,記錄一下這兩天實習遇到的幾個小問題。

      工作中遇到MyBatis資料庫儲存的問題,主要是為了以id更新同一張表的欄位,最早嘗試直接在mapper層打@update註解,寫入要實現的sql語句,然後在service層呼叫mapper,controller層中呼叫service,最後以這種方式直接實現了。

        後面需求變更為更新多條記錄為多個欄位為不同的值,我師傅給我指導的時候建議我用mybatis 的@UpdateProvider註解方式,但是因為看太久單欄位的方式,同時看@UpdateProvider註解,鑽入了牛角尖,一直實現不了,又嘗試@update的方式。

       用兩個@update來使用資料庫語句  (UPDATE table_name SET field1=new-value1 WHERE ID IN ();)即兩個update註解,兩個service呼叫。和其他同事聊天說了一下這個事情,認為這種方式對於有很多更新語句和資料庫呼叫的系統來說繁雜,不靈活。

     但是網上大多是@SelectProvider,看了很多沒有@UpdateProvider的,也沒有看懂裡面的呼叫關係。 諮詢同事後,瞭解到呼叫關係如下,Controller呼叫Service,Service呼叫Mapper,Mapper呼叫Provider,關係瞭解後,去看了網上關於@SelectProvider註解的使用講解,我嘗試著做了如下步驟,在Mapper層:

   @UpdateProvider(type = SqlProvider.class, method ="updateSta")

       Integer   updateSta(Map param);

    type對應的provider檔案,這個檔案的作用是你可以自己定義很多sql語句,我用的直接返回拼接的sql語句的方式,還有其他方式,詳情見百度,這是我拼接的sql語句

(菜鳥,見笑了,拼接的時候建議對應關係寫完整後,執行測試,如果報出語法錯誤,複製錯誤到資料庫管理工具如DG裡執行一下,看下錯誤,在DG裡拼成正確的,可以執行的,再在Java中拼接):

public class SqlProvider {

public StringupdateStatus(Map param) {

return "UPDATE table SET sta='" + param.get("sta") +"' WHERE id IN " +"("+ param.get("Ids")+")";

    }

這樣Mapper可以呼叫provider的內容。

service層中:使用@Resource註解,注入對應的Mapper資源,對應mapper的方法和傳入資料,呼叫Mapper的方法:

   @Resource

   private Mapper   mapper;

             public Integer     updateSta(Map param) {

             return mapper.updateSta(param);          }

      要注意的事,採用直接返回的方式,如果是String 型別,我學習過程中發現@SelectProvider註解是不支援的String,改為void 或Integer的方式是可以的。現在service已經成功呼叫Mapper,在Controller層,我們要做的就是注入Service,然後呼叫Service裡的對應的方法,傳入引數。

@Autowired

private   Service   service;

有一個問題,provider好像傳入的都是Map,,這個有時間我仔細研究一下:

這個是我的傳值處理:

Map param =new HashMap<>();

       param.put("sta", sta);

      param.put("Ids", Ids);

        service.updateSta(param);

       這裡的key值用於在provider通過get(key)的方式獲取對應的key的value值,詳情見我的SQL拼接。

         結束!

相關文章