根据上文,我们采用了resultMap,parameterClass的办法使用参数和返回。
删除的时候:
sqlMap.delete("Contact.deleteAll", contct);
更新的时候:
sqlMap.delete("Contact.updateById",contactId);
(注意,虽然句柄是delete,实际上映射的SQL是更新,只是不要求有返回值,用delete省些事)
插入的时候:
sqlMap.insert("Contact.insert", contact);
还需要注意:
I (List<Contact>) sqlMap.queryForList("Contact.getAll", null);
II (Contact) sqlMap.queryForObject("Contact.getById",new Integer(1));
但我们在映射文件中配置的是 resultClass="com.sk.ibatis.model.Contact" 时 ,使用第一种语法。
映射结果为 resultMap="result" (result为自定义的resultMap,请回去详细的看看这里)时,使用第二种语法。
其中的要义就是:
最终执行的SQL语句不同,让我们得到结果的方式就不同,select没有多加限制条件,它有可能会返回多条记录的,就用List,而如果确定它只返回一个记录的,比如getById(),就直接使用POJO实例化了。
对于在存储过程中的参数使用,其实方法还有另外一种,对于两种选择,我觉得上面的那种使用resultMap会更好一些,因为get/set直接注入了结果中,我们直接强制类型转化就得到结果了,不过这不是大多数的场合都是最好的。
在存储过程中,我们还会用到 OUT IN 和INOUT参数,其中,只有INOUT和OUT参数可以更改,而IN不能被更改,无法取回。
<parameterMap class="map" id="swapParameters">
<parameter property="namestr" javaType="java.lang.String" jdbcType="varchar" mode="IN"/>
<parameter property="returnid" javaType="java.lang.Integer" jdbcType="int" mode="OUT"/>
</parameterMap>
<procedure id="insertNameByProcedure" parameterMap="swapParameters">
{call UP_GETINSERTEDIDENTITY_TT(?,?)}
</procedure>
我们在参数列表中指定了三种类型分的数据:
在调用的时候,就需要生成一个Map:
HashMap<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("namestr", insertname);
paramMap.put("returnid", returnid);
接返回值:
this.getSqlMapClientTemplate().queryForObject("insertNameByProcedure", paramMap);
return (Integer)paramMap.get("returnid");