本文主要说明mybatis调用oracle存储过程的两种方法(HashMap&Entity),创建oracle的表以及搭建springBoot项目过程已经忽略。
1.创建存储过程
1.1 oracle 数据库中表的格式如下图所示
1.2 存储过程要实现的要求:
三个输入参数:用户名 密码 姓名
一个输出参数:用户的id
1.3 数据库中创建存储过程代码如下
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;
2.springBoot项目中MyBatis调用存储过程
2.1 在mapper中添加接口
在接口中,两个接口的返回类型不同,但是都能够获取存储过程的输出参数。
因为存储过程的的“返回值”是将存储过程产生的结果放到参数的对象中,获取的返回值是从这个参数对象中获取。
public interface UserinfoMapper extends BaseMapper<Userinfo> {
//通过HashMap 作为参数实现
void addUser(HashMap user);
//通过实体类作为参数实现
Integer addUser2(Userinfo userinfo);
}
2.2 通过MyBatis创建对应的方法
<!-- 通过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>
2.3 直接调用mapper进行测试
@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());
}
测试之后,两个测试方法都能够获得存储过程的输入参数的值。