Mybatis调用存储过程完成用户注册
需求:用户注册时检测用户名是否已存在,不存在从序列中生成一个序号进行注册,存在返回失败。
对存储过程了解的比较少,尝试写的存储过程。
存储过程
最初版
create or replace PROCEDURE XTEL_ADD_USERINFO ( UNAME IN VARCHAR2 , PWD IN VARCHAR2 , ADD_RET OUT INTEGER ) AS curTimestamp INTEGER; BEGIN -- 查询表中是否有UNAME的记录 select -1 into ADD_RET from XTEL_USERINFOTABLE where XTEL_USERINFOTABLE.USERNAME=UNAME; exception when no_data_found then begin -- 没有查到相应记录,则会进入这里。 -- 为其新增一条记录,并为其创建一张对应的历史消息记录表 ADD_RET := USERINFO_SQ.NEXTVAL; GET_CURTIMESTAMP(curTimestamp); insert into XTEL_USERINFOTABLE(USERNAME, USERID, GROUPID, REGISTTIME, PURCHASEDCOURSE, PASSCOURSE, EXCELLENTCOURSE, LEARNINGCOURSE, COMPLETECOURSE, LECTURES, ISONLINE, LOGINTIME, "PASSWORD", STATUS, NICKNAME) values(UNAME, ADD_RET, 0, curTimestamp, 0, 0, 0, 0, 0, 0, 0, 0, PWD, 0, UNAME); end; -- insert or update之后必须Commit,这样才能将操作实际性的应用到表上。 Commit; END XTEL_ADD_USERINFO;
修改版。
create or replace PROCEDURE XTEL_ADD_USERINFO ( UNAME IN VARCHAR2 , PWD IN VARCHAR2 , ADD_RET OUT INTEGER ) AS curTimestamp INTEGER; BEGIN -- 查询表中是否有UNAME的记录 select -1 into ADD_RET from XTEL_USERINFOTABLE where XTEL_USERINFOTABLE.USERNAME=UNAME; exception when no_data_found then begin -- 没有查到相应记录,则会进入这里。 -- 为其新增一条记录,并为其创建一张对应的历史消息记录表 ADD_RET := USERINFO_SQ.NEXTVAL; GET_CURTIMESTAMP(curTimestamp); insert into XTEL_USERINFOTABLE(USERNAME, USERID, GROUPID, REGISTTIME, PURCHASEDCOURSE, PASSCOURSE, EXCELLENTCOURSE, LEARNINGCOURSE, COMPLETECOURSE, LECTURES, ISONLINE, LOGINTIME, "PASSWORD", STATUS, NICKNAME) values(UNAME, ADD_RET, 0, curTimestamp, 0, 0, 0, 0, 0, 0, 0, 0, PWD, 0, UNAME); end; -- insert or update之后必须Commit,这样才能将操作实际性的应用到表上。 Commit; END XTEL_ADD_USERINFO;
mybatis 调用
<!-- 新增用户,调用存储过程 --> <select id="addUser" statementType="CALLABLE" parameterType="java.util.HashMap" > <![CDATA[ {call US246.XTEL_SIGUP( #{uName,mode=IN,jdbcType=VARCHAR}, #{pwd,mode=IN,jdbcType=VARCHAR}, #{returnValue,mode=OUT,jdbcType=INTEGER} )} ]]>
注意:返回的结果是返回到paramMap中,开始一直以为是存储过程写错了,然后试着写了function函数,一样没有返回值。最终发现它返回到了传递的参数map中
Map<String, Object> paramMap = new HashMap<String, Object>(); //把密码进行加密处理 password = MD5.toMD5(password); paramMap.put("uName", userName); paramMap.put("pwd", password); paramMap.put("returnValue", 1); userDao.addUser(paramMap); if((int)paramMap.get("returnValue")==0){ return new ResJson(SysConstants.STRING_ZERO,"用户名已存在"); } return new ResJson(SysConstants.STRING_ONE,"注册成功"); }