關於用mybatis調用存儲過程時的入參和出參的傳遞方法


一、 問題描述

a)         目前調用讀的存儲過程的接口定義一般是:void  ReadDatalogs(Map<String,Object> map);,入參和出參都在這個map里面,這樣用起來就很麻煩,我希望的是可以定義成:list<TimeData> ReadDataLogs(int stationId, int deviceId, Date startTime, Date endTime);

二、 已經嘗試的方法

a)         改變入參的傳遞方式:

                         i.              改變入參的傳遞方式: void  ReadDatalogs(int stationId, int deviceId, int dataId, Date startTime, Date endTime, List<TimeData> datas);

                       ii.              改變映射文件:

<select id="ReadDatalogs" statementType="CALLABLE" parameterType="java.lang.Object">

{call readdatalogs(#{0,mode=IN},#{1,mode=IN},#{2,mode=IN},#{3,mode=IN},#{4,mode=IN}, #{5, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData})}  

</select>

                      iii.              這種方式,通過Postgresql的調試跟蹤,可以發現,入參是傳遞成功了,但是通過單元測試可以發現,結果集沒有返回回來。

b)         調用存儲過程的時候使用返回值,既然第一種方法已經可以正確傳遞入參了,那么剩下的就是如何獲取返回值的問題了,通過文章(http://www.faceye.net/search/186828.html)的提醒,可以考慮使用如下方式來接收返回值:

                         i.              修改mapper接口如下:

List<TimeData> datas  ReadDatalogs(int stationId, int deviceId, int dataId, Date startTime, Date endTime);

                       ii.              修改映射文件如下:

<select id="ReadDatalogs" statementType="CALLABLE" parameterType="java.lang.Object">

{ #{mm, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData}=call readdatalogs(#{0,mode=IN},#{1,mode=IN},#{2,mode=IN},#{3,mode=IN},#{4,mode=IN})}   

</select>

                      iii.              測試結果也是不行,程序沒有報錯,但是接收不到結果集。

c)         改用一個對象來作為入參:

                         i.              定義一個pojo類,如下:

public class DataLogQueryParam {

 

         public DataLogQueryParam() {

                   // TODO Auto-generated constructor stub

         }

 

         public DataLogQueryParam(int stationId, int deviceId, int dataId, Date startTime, Date endTime) {

                   this.stationId = stationId;

                   this.deviceId = deviceId;

                   this.dataId = dataId;

                   this.startTime = startTime;

                   this.endTime = endTime;

                   list = new LinkedList<TimeData>();

         }

         int stationId;

         int deviceId;

         int dataId;

         Date startTime;

         Date endTime;

                  List<TimeData> list;

                   …

                   //geter, setter

}

                       ii.              修改map接口定義如下:void ReadDatalogs(DataLogQueryParam param);

                      iii.              修改映射文件如下:

<select id="ReadDatalogs" statementType="CALLABLE" parameterType="com.huajie.persistence.pojo.DataLogQueryParam">

                   {call readdatalogs(#{stationId,mode=IN},#{deviceId,mode=IN},#{dataId,mode=IN},#{startTime,mode=IN},#{endTime,mode=IN},#{list, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData})}  

</select>

                      iv.              這種方式可以調用成功,並且結果可以正確的存儲到param.list成員中。

三、 可能還可以嘗試的方法

a)         由於實驗的時候比較匆忙,難免出錯,所以可以考慮把以上的第一種和第二種方法再嘗試一遍。

b)         參考https://m.oschina.net/blog/267432 https://github.com/miemiedev/mybatis-callable  ,自己寫一個mybatis的插件,當然,這里的前提是要看懂這個插件的實現

c)         結合mybatis的源碼來進行調試,分析可能的問題原因,這個可以等周末有空了再來調整。

四、 分析

起始在上面的方法中,我感覺第一種、第二種從語法上來說都應該行得通的,但是實驗結果卻是又不行。

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM