一、
問題描述
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的源碼來進行調試,分析可能的問題原因,這個可以等周末有空了再來調整。
四、
分析
起始在上面的方法中,我感覺第一種、第二種從語法上來說都應該行得通的,但是實驗結果卻是又不行。