एक प्रक्रिया तालिका प्रकार पैरामीटर ले सकती है और आप एक कस्टम प्रकार हैंडलर लिख सकते हैं जो रूपांतरण करता है।
ठोस वस्तुओं का उपयोग करके व्याख्या करना आसान हो सकता है।MY_TYPE
के बजाय , मैं S_USER_OBJ
का उपयोग करूंगा ...
S_USER_OBJ को ऑब्जेक्ट के रूप में बनाएं या बदलें (आईडी पूर्णांक, नाम varchar(20));
...एक टेबल...
तालिका उपयोगकर्ता बनाएं (आईडी पूर्णांक, नाम varchar(20));
...और एक पीओजेओ।
सार्वजनिक वर्ग उपयोगकर्ता { निजी पूर्णांक आईडी; निजी स्ट्रिंग नाम; // सेटर/गेट्टर}
यहाँ नया प्रकार है जो S_USER_OBJ
. का संग्रह है ।
S_USER_OBJ_LIST प्रकार को S_USER_OBJ की तालिका के रूप में बनाएं या बदलें;
प्रक्रिया तालिका प्रकार को पैरामीटर के रूप में ले सकती है। उदा.
प्रक्रिया बनाएं या बदलें doUpdate(user_list in S_USER_OBJ_LIST, user_out out S_USER_OBJ_LIST) isbegin -- process IN param for i in user_list.first .. user_list.last loop update users set name =user_list(i).name) जहां id =user_list(i).id; अंत लूप; -- सेट आउट परम चयन * बल्क कलेक्ट इन यूजर_आउट (यूज़र्स यू से S_USER_OBJ(u.id, u.name) चुनें);अंत;
मैपर इस तरह दिखेगा:
void doUpdate( @Param("users") List Users, @Param("outParam") Map outParam);
{कॉल doUpdate(#{users,typeHandler=pkg.UserListTypeHandler}, #{outParam.outUsers,jdbcType=ARRAY,jdbcTypeName=S_USER_OBJ_LIST,mode=OUT, टाइपहैंडलर=pkg.UserListTypeHandler} )}अपडेट>
UserListTypeHandler
एक कस्टम प्रकार का हैंडलर है जो सूची<उपयोगकर्ता>
. को कनवर्ट करता है एक ARRAY
. से/में STRUCT
. का ।
- >{@Override public void setNonNullParameter(ReadedStatement ps, int i, List
विधि का उपयोग करने वाला कोड कुछ इस तरह दिखाई देगा।
मानचित्र<स्ट्रिंग, ?> outParam =new HashMap<>();mapper.doUpdate(userList, outParam); List outUsers =outParam.get("outUsers");
बाहर
के लिए पैरामीटर, refcursor और परिणाम मानचित्र का उपयोग करने का एक और तरीका भी है।
मैपर स्टेटमेंट में, OUT पैरामीटर को निम्नानुसार निर्दिष्ट करें।
#{outParam.outUsers,jdbcType=CURSOR,javaType=java.sql.ResultSet,mode=OUT,resultMap=userRM}
परिणाम नक्शा बहुत सीधा है।
इस प्रक्रिया में, OUT पैरामीटर को SYS_REFCURSOR
. के रूप में घोषित करें
अपडेट करने की प्रक्रिया बनाएं या बदलें (S_USER_OBJ_LIST में user_list, SYS_REFCURSOR से user_out बाहर) isbegin ... -- सेट आउट परम खुले user_out के लिए चुनिंदा * उपयोगकर्ताओं से; अंत;
यहां एक निष्पादन योग्य डेमो है:
https://github .com/harawata/mybatis-issues/tree/master/so-56834806