1. 程式人生 > >mybatis傳入參及出參遊標,從map中獲得返回值List

mybatis傳入參及出參遊標,從map中獲得返回值List

      實際開發中,什麼時候會用到儲存過程,像網上說的簡單求和?我覺得不是,那樣簡單的例子根本就不能拿來學習儲存過程,那是一條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,不需要傳遊標引數