本文主要说明mybatis调用oracle存储过程的两种方法(HashMap&Entity),创建oracle的表以及搭建springBoot项目过程已经忽略。
三个输入参数:用户名 密码 姓名
一个输出参数:用户的id
create or replace procedure PR_addUser( v_username userinfo.username%type, v_password userinfo.password%type, v_name userinfo.name%type, v_out_id out userinfo.user_id%type) as begin --插入 insert into userinfo (username,password,name) values (v_username,v_password,v_name); --返回最大的id select max(userinfo.user_id) from userinfo; commit; EXCEPTION WHEN OTHERS THEN v_out_id :=-1; ROLLBACK; end PR_addUser;
在接口中,两个接口的返回类型不同,但是都能够获取存储过程的输出参数。
因为存储过程的的“返回值”是将存储过程产生的结果放到参数的对象中,获取的返回值是从这个参数对象中获取。
public interface UserinfoMapper extends BaseMapper<Userinfo> { //通过HashMap 作为参数实现 void addUser(HashMap user); //通过实体类作为参数实现 Integer addUser2(Userinfo userinfo); }
<!-- 通过HashMap 作为参数实现 --> <select id="addUser" statementType="CALLABLE" parameterMap="userInfomation" resultType="java.lang.Integer"> {call PR_ADDUSER(?,?,?,?)} </select> <parameterMap id="userInfomation" type="java.util.HashMap"> <parameter property="username" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/> </parameterMap> <!-- 通过实体类作为参数实现 --> <select id="addUser2" statementType="CALLABLE" parameterType="com.wanmait.oracledemo.pojo.Userinfo" resultType="java.lang.Integer"> {call PR_ADDUSER(#{username,mode=IN,jdbcType=VARCHAR}, #{password,mode=IN,jdbcType=VARCHAR}, #{name,mode=IN,jdbcType=VARCHAR}, #{userId,mode=OUT,jdbcType=INTEGER} )} </select>
@SpringBootTest public class UserinfoMapperTest { @Resource private UserinfoMapper userinfoMapper; @Test public void testAddUser(){ HashMap user=new HashMap(); user.put("username","lishi"); user.put("password","lishi"); user.put("name","lishi"); user.put("id",0); userinfoMapper.addUser(user); System.out.println("该用户的ID为:"+user.get("id")); } @Test public void testAddUser2(){ Integer v_out_id = null; Userinfo userinfo = new Userinfo(); userinfo.setUsername("李四"); userinfo.setPassword("asdfa"); userinfo.setName("lisi"); System.out.println(userinfo.toString()); userinfoMapper.addUser2(userinfo); System.out.println("该用户的ID为:"+userinfo.getUserId()); }
测试之后,两个测试方法都能够获得存储过程的输入参数的值。