Ibatis调用存储过程(笔记)
????? 众所周知,Ibatis的核心就在于映射文件(Data Map XML File),在调用存储过程返回取得返回参数的过程中,最有可能出错的地方,就是映身文件的配置.
???? 调用存储过程只能用到<procedure>(当然,我在博客园也见到一些朋友介绍说可以使用<statement>标签,但经过小弟在测试调用Oracle数据库一直报错String类型没有长度限制,后来改成<procedure>就正常了)
<statements><procedure id="testProcedure" parametersMap="paramMap"> Test.TestProcedure</procedure></statements><parameterMaps> <parameterMap id="paramMap" column="PS_ID" /> <parameter property="UserName" column="PS_USERNAME" /> <parameter property="PassWord" column="PS_PASSWORD" /> <parameter property="returnValue" column="PS_RETURNVALUE" direction="Output" /> </parameterMap></parameterMaps>
?
class一定设置name="code">Hashtable map = new Hashtable();map.Add("ID", 1);map.Add("UserName", "user");map.Add("PassWord", "pwd");map.Add("returnValue", -1);mapper.Insert("testProcedure", map);Console.WriteLine(map["returnValue"].ToString());
?
Ibatis使用简单,就是配置要注意,注意大小写敏感,一般是不会出错的~
?
1、更新类型的存储过程
sp_InsertAccount:
CREATE PROCEDURE [dbo].[sp_InsertAccount] -- Add the parameters for the stored procedure here @Account_ID int, @Account_FirstName varchar(32), @Account_LastName varchar(32)ASBEGINinsert into accounts (account_id, account_firstname, account_lastname) values (@Account_ID,@Account_FirstName,@Account_LastName )END
?Map配置文件:
?
<procedure id="InsertAccountViaStoreProcedure" parameterMap="insert-params_new"> sp_InsertAccount </procedure> <parameterMap id="insert-params_new" /> <parameter property="FirstName" /> <parameter property="LastName" /> </parameterMap>
?
这里要注意的就是ParameterMap中的参数个数和顺序要和sp_InsertAccount存储过程中的一致
Ado中的调用代码:
public void InsertAccountViaStoreProcedure(Account account) { try { sqlMap.Insert("InsertAccountViaStoreProcedure", account); } catch (DataAccessException ex) { throw new DataAccessException("Error executing InsertAccountViaStoreProcedure. Cause :" + ex.Message, ex); } }
?
这里使用的是sqlMap.Insert的方法,为了看起来直观一点,其实使用sqlMap.QueryForObject方法的话效果也是一样的:)
2、查询类型的存储过程
GetAccountByName:
?
CREATE PROCEDURE [dbo].[GetAccountByName] @name varchar(32)ASBEGINselect * from accounts where Account_FirstName like '%' + @name + '%'END
?Map配置文件:
?
<procedure id="GetAccountByNameViaStoreProcedure" resultMap="account-result" parameterMap="selectpro-params"> GetAccountByName </procedure> <parameterMap id="selectpro-params" name="code"> public ArrayList GetAccountByNameViaStoreProcedure(string strName) { try { ArrayList list = (ArrayList)sqlMap.QueryForList("GetAccountByNameViaStoreProcedure", strName); return list; } catch (DataAccessException ex) { throw new DataAccessException("Error executing SqlAccountViaSqlMapDao.GetAccountById. Cause :" + ex.Message, ex); } }
?