最近做项目的时候,遇到了用mybatis调用存储过程,觉得有必要所以就写下来了,如果有不对的地方,请大家多多指教!
下面用一个注册的例子来说明:
control中的方法:
@Resource
private IUserDetailInfoDao userDetailDao;
@RequestMapping("/regist.html")
public void regist(HttpServletResponse response,UserDetailInfo userdetail) throws IOException{
//当前时间的毫秒数作为对象的编号
UserInfo user=userdetail.getUserId();
user.setUserId(ObjectId.getId());
userdetail.setUserId(user);
userdetail.setDetailId(ObjectId.getId());
//调用存储过程执行注册
//创建一个Map集合
Map<String,String> userdetaillst=new HashMap<String, String>();
userdetaillst.put("ys","0");
userdetaillst.put("userId", userdetail.getUserId().getUserId());
userdetaillst.put("userName", userdetail.getUserId().getUserName());
userdetaillst.put("userPwd", userdetail.getUserId().getUserPwd());
userdetaillst.put("detailId",userdetail.getDetailId());
userdetaillst.put("email",userdetail.getEmail());
userdetaillst.put("address",userdetail.getAddress());
userdetaillst.put("phone",userdetail.getPhone());
//执行
userDetailDao.regist(userdetaillst);
//判断是否注册成功
//获取输出流对象
PrintWriter out=response.getWriter();
String str=userdetaillst.get("ys");
if("1".equals(str)){
//注册成功
out.print("1");
}else{
//注册失败
out.print("0");
}
}
mapper中的代码:
<!-- 用户注册 -->
<select id="regist" statementType="CALLABLE" parameterMap="registlist">
{call proc_regist(?,?,?,?,?,?,?,?)}
</select>
<!-- 针对用户注册调用存储过程,创建一个Map -->
<parameterMap type="java.util.Map" id="registlist">
<parameter property="ys" mode="OUT" jdbcType="VARCHAR"/>
<parameter property="userId" mode="IN"/>
<parameter property="userName" mode="IN"/>
<parameter property="userPwd" mode="IN"/>
<parameter property="detailId" mode="IN"/>
<parameter property="email" mode="IN"/>
<parameter property="address" mode="IN"/>
<parameter property="phone" mode="IN"/>
</parameterMap>
我在control中的方法里面,定义了一个Map集合,其中Key为“ys”的元素接受的是存储过程的输出参数,其他元素为输入参数,
在mapper中定义参数的Map集合,Property的值要与control中定义的元素相对应,mode为参数类型(就是说这个参数是输入参数还是输出参数)这里注意,如果是输出参数,则必须指定mode属性为“OUT”,jdbcType的值是指在存储过程中该参数的类型