存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中。现在要使用Mybatis调用数据库的存储过程。我们来看下如何实现。
一、新建一个存储过程:
dropPROCEDUREinsert_user; CREATEPROCEDUREinsert_user(INidINTEGER,INuserNameVARCHAR(20),INpassWordVARCHAR(20),INrealNameVARCHAR(20)) BEGININSERTINTOuser (id,userName,passWord,realName) VALUES (id,userName,passWord,realName); SETid=LAST_INSERT_ID(); END#调用下确认没问题callinsert_user(100,"存储过程","密码","存过");
二、在Mapper接口中新建一个方法:
packagecom.xing.mapper; importcom.xing.entity.UserEntity; importorg.apache.ibatis.annotations.*; importorg.springframework.stereotype.Repository; importjava.util.List; /*** 面向接口*/publicinterfaceUserMapper { /*** 存储过程 插入用户* @param user user*/voidinsertUserCG(UserEntityuser); }
三、XML中编写对应的标签语句:
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xing.mapper.UserMapper"><resultMapid="BaseResultMap"type="com.xing.entity.UserEntity"autoMapping="false"><resultcolumn="id"jdbcType="INTEGER"property="id"/><resultcolumn="userName"jdbcType="VARCHAR"property="userName"/><resultcolumn="passWord"jdbcType="VARCHAR"property="passWord"/><resultcolumn="realName"jdbcType="VARCHAR"property="realName"/></resultMap><selectid="getOne"resultType="com.xing.entity.UserEntity">select*fromuserwhereid=#{id} </select><insertid="insertUserCG"parameterType="com.xing.entity.UserEntity"statementType="CALLABLE"> { callinsert_user( #{id,mode=IN,jdbcType=INTEGER},#{userName,mode=IN},#{passWord,mode=IN},#{realName,mode=IN} ) } </insert></mapper>
四、测试下:
/*** 新增* @param user user* @return ok*/"/insertCG") (publicStringinsertUserCG(UserEntityuser){ userMapper.insertUserCD(user);return"ok"; }
结果:
我们发现成功的执行了存储过程,并把数据正确的插入了数据库。这里使用的是insert标签,如果换一个标签来执行同样的语句,会不会成功呢?
再建一个Mapper及对应XML标签:
/*** 试试select标签* @param user*/voidinsertUserCD2(UserEntityuser);
<selectid="insertUserCD2"parameterType="com.xing.entity.UserEntity"statementType="CALLABLE"> { callinsert_user( #{id,mode=IN,jdbcType=INTEGER},#{userName,mode=IN},#{passWord,mode=IN},#{realName,mode=IN} ) } </select>
结果:
可以看出,这里sql语句的执行和标签没有关系,insert换成select后,同样执行了该存储过程。那么换成Java API来执行应该也是能够成功的。
总结:
在代码开发中,使用Mybatis实现了存储过程的调用,本质上其实是用Mybatis执行了一句 call xxx存过();
END