MyBatis 调用数据库存储过程

使用 MyBatis 调用数据库的存储过程。

项目中有个需求:调用数据库中已有的存储过程实现用户登录业务,此存储过程接收 3 个参数,两个入参:username/password,一个出参:result,登录成功 result 为 1,失败为 0。

创建存储过程

这里简单创建一个存储过程,模拟登录,当用户名不为空且密码为 123456,则认为登录成功,否则认为登录失败。

create or replace procedure login_wzw(username in varchar2,password in varchar2, result out int)
as
begin
    if username is null or username = '' then
        select 0 into result from dual;
        return ;
    end if;
    if password = '123456' then
        select 1 into result from dual;
    else
        select 0 into result from dual;
    end if;
end;

测试存储过程

  • 测试用户名为空,输出:result=0
declare
    username varchar2(100);
    password varchar2(100);
    result int;
begin
    username := '';
    password := '123456';
    login_wzw(username, password, result);
    dbms_output.put_line('result='||result);
end;
  • 测试密码错误,输出:result=0
declare
    username varchar2(100);
    password varchar2(100);
    result int;
begin
    username := 'zhangsan';
    password := '1234567';
    login_wzw(username, password, result);
    dbms_output.put_line('result='||result);
end;
  • 测试密码正确,输出:result=1
declare
    username varchar2(100);
    password varchar2(100);
    result int;
begin
    username := 'zhangsan';
    password := '123456';
    login_wzw(username, password, result);
    dbms_output.put_line('result='||result);
end;

MyBatis 调用

使用 MyBatis 调用存储过程。

参数为实体类

  • UserLogin.java
public class UserLogin {

    private String username;
    private String password;
    private Integer result;

    //省略 setter/getter
}
  • Mapper.java
void loginWzw(UserLogin userLogin);
  • Mapper.xml
<select id="loginWzw" statementType="CALLABLE" useCache="false">
  {call LOGIN_WZW(
      #{username,jdbcType=VARCHAR,mode=IN},
      #{password,jdbcType=VARCHAR,mode=IN},
      #{result,jdbcType=INTEGER,mode=OUT}
    )}
</select>
  • 执行结果:
ProcedureLoginVo{username='admin', password='123456', result=null}
13:54:37.307 [main] DEBUG c.r.p.s.m.S.loginWzw - [debug,137] - ==>  Preparing: {call LOGIN_WZW( ?, ?, ? )}
13:54:37.318 [main] DEBUG c.r.p.s.m.S.loginWzw - [debug,137] - ==> Parameters: admin(String), 123456(String)
ProcedureLoginVo{username='admin', password='123456', result=1}

参数为 Map

  • Mapper.java
void loginWzw2(Map<String,Object> param);
  • Mapper.xml
<select id="loginWzw2" statementType="CALLABLE" parameterType="map" useCache="false">
  {call LOGIN_WZW(
      #{username,jdbcType=VARCHAR,mode=IN},
      #{password,jdbcType=VARCHAR,mode=IN},
      #{result,jdbcType=INTEGER,mode=OUT}
    )}
</select>
  • 执行结果
{password=1234567, username=admin}
13:54:37.335 [main] DEBUG c.r.p.s.m.S.loginWzw2 - [debug,137] - ==>  Preparing: {call LOGIN_WZW( ?, ?, ? )}
13:54:37.335 [main] DEBUG c.r.p.s.m.S.loginWzw2 - [debug,137] - ==> Parameters: admin(String), 1234567(String)
{result=0, password=1234567, username=admin}

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。