mybatis傳入參及出參遊標,從map中獲得返回值List
阿新 • • 發佈:2019-01-26
實際開發中,什麼時候會用到儲存過程,像網上說的簡單求和?我覺得不是,那樣簡單的例子根本就不能拿來學習儲存過程,那是一條sql就能搞定的事,沒必要動儲存過程大駕,當我們開發的過程中,遇到很複雜的業務邏輯時,而我們只想傳些引數進去,想動態的得到返回結果,在儲存過程裡面去寫好實際的業務問題,動態的拼sql,執行得到結果.
下面舉個mybatis中用到儲存過程的例子:
儲存過程:
CREATE OR REPLACE Procedure getUSERINFOs(iName in varchar,cur_arg out Sys_Refcursor) is --vsql VARCHAR2(2000); begin open cur_arg for Select * From USERINFO t where t.NAME like '%'||iName||'%'; End;
我在拼上面sql時,總是執行報錯,||連線的必須是字元,但又不是在select前面開始加字元
以下以介面方式執行sql
public interface UserDao
{
public void getUserByProc(Map<String, Object> map);
}
userMapper.xml:
<resultMap type="user" id="getUserLists"> <id column="id" property="id" /> <result column="name" property="name" /> </resultMap> <select id="getUserByProc" statementType="CALLABLE" parameterType="map" > {call getUSERINFOs(#{iName,jdbcType=VARCHAR,mode=IN},#{cur_arg,jdbcType=CURSOR,javaType=ResultSet,mode=OUT,resultMap=getUserLists})} </select>
上面的jdbcType的值必須為大寫.
測試程式碼:
private static void selectOneUserByProc(SqlSession sqlSession, UserDao userDao) { Map<String, Object> map = new HashMap<String, Object>(); map.put("iName", "張");//模糊查詢 map.put("cur_arg", new ArrayList<User>()); userDao.getUserByProc(map); List<User> users = (List<User>) map.get("cur_arg"); for (User user : users) { System.out.println(user.getName()); } }
執行結果:
張四
張五
張三
上面是以map為引數來呼叫的,所有引數新增到裡面,從裡面得到封裝後的結果,也可以改為傳bean的方法,這樣,bean的屬性就是入參和要返回的list,不需要傳遊標引數