參數形式: java
- create procedure sptest.adder(in addend1 integer, in addend2 integer, out theSum integer)
- begin atomic
- set theSum = addend1 + addend2;
- end
- go
- <parameterMap type="map" id="testParameterMap">
- <parameter property="addend1" jdbcType="INTEGER" mode="IN"/>
- <parameter property="addend2" jdbcType="INTEGER" mode="IN"/>
- <parameter property="sum" jdbcType="INTEGER" mode="OUT"/>
- </parameterMap>
- lt;update id="adderWithParameterMap" parameterMap="testParameterMap" statementType="CALLABLE">
- {call sptest.adder(?, ?, ?)}
- </update>
- public void testAdderAsUpdateWithParameterMap() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- Map<String, Object> parms = new HashMap<String, Object>();
- parms.put("addend1", 3);
- parms.put("addend2", 4);
-
- SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
-
- spMapper.adderWithParameterMap(parms);
- assertEquals(7, parms.get("sum"));
-
- parms = new HashMap<String, Object>();
- parms.put("addend1", 2);
- parms.put("addend2", 3);
- spMapper.adderWithParameterMap(parms);
- assertEquals(5, parms.get("sum"));
-
- } finally {
- sqlSession.close();
- }
帶輸入輸出參數的存儲過程:
sql代碼:sql
- create procedure sptest.getnames(in lowestId int, out totalrows integer)
- reads sql data
- dynamic result sets 1
- BEGIN ATOMIC
- declare cur cursor for select * from sptest.names where id >= lowestId;
- select count(*) into totalrows from sptest.names where id >= lowestId;
- open cur;
- END
- go
- <select id="getNamesAndItems" statementType="CALLABLE"
- <select id="getNames" parameterType="java.util.Map" statementType="CALLABLE"
- resultMap="nameResult">
- {call sptest.getnames(
- #{lowestId,jdbcType=INTEGER,mode=IN},
- #{totalRows,jdbcType=INTEGER,mode=OUT})}
- </select>
- </select>
- public void testCallWithResultSet2_a1() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
-
- Map<String, Object> parms = new HashMap<String, Object>();
- parms.put("lowestId", 1);
- List<Name> names = spMapper.getNamesAnnotated(parms);
- assertEquals(3, names.size());
- assertEquals(3, parms.get("totalRows"));
- } finally {
- sqlSession.close();
- }
- }
返回多個結果集
sql代碼:apache
- create procedure sptest.getnamesanditems()
- reads sql data
- dynamic result sets 2
- BEGIN ATOMIC
- declare cur1 cursor for select * from sptest.names;
- declare cur2 cursor for select * from sptest.items;
- open cur1;
- open cur2;
- END
- go
- <resultMap type="org.apache.ibatis.submitted.sptests.Name" id="nameResult">
- <result column="ID" property="id"/>
- <result column="FIRST_NAME" property="firstName"/>
- <result column="LAST_NAME" property="lastName"/>
- </resultMap>
-
- <resultMap type="org.apache.ibatis.submitted.sptests.Item" id="itemResult">
- <result column="ID" property="id"/>
- <result column="ITEM" property="item"/>
- </resultMap>
-
- <select id="getNamesAndItems" statementType="CALLABLE"
- resultMap="nameResult,itemResult">
- {call sptest.getnamesanditems()}
- </select>
- @Test
- public void testGetNamesAndItems() throws SQLException {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
-
- List<List<?>> results = spMapper.getNamesAndItems();
- assertEquals(2, results.size());
- assertEquals(4, results.get(0).size());
- assertEquals(3, results.get(1).size());
- } finally {
- sqlSession.close();
- }
- }
注意:
上面就是幾種經常使用的了。
1 sqlserver oracle sqlserver返回結果集是能夠不要out參數的。若是sql中用的是select出結果,不須要配置out參數。多個結果集/結果集能夠配置resultMap 來返回LIST,主要是調用selectList方法會自動把結果集加入到list中去的。
2 sql有返回值 用select標籤
3 注意sql參數和mybatis參數的對應關係,這個這裏就不講了。
4 注意參數個數
我遇到的異常:
參數不匹配的緣由,由於sqlserver 中我是直接返回select臨時表結果,不須要配置存儲過程輸出參數。
list中的內容形式:
mybatis