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,"注册成功");
    }

 

posted @ 2018-08-07 19:48  小哥z  阅读(221)  评论(0编辑  收藏  举报