Navicat for MySQL创建存储过程及MyBatis调用存储过程
问题描述
一条语句实现向两个表中添加数据
前段时间遇到需求,向一个表中添加数据,获取新增主键值。再向另一个表添加数据,其中一个字段为前一个表的主键值。并返回第二次添加的表的自增主键值。上网查到的一个方法为使用存储过程,便按照这个思路试着实现一下,现将过程回忆记录下来。
项目环境
SSM框架项目+Navicat管理MySQL数据库
解决问题
一、Navicat for MySQL创建存储过程
1.新建函数→选择“过程”
2.添加参数
模式:
IN:输入参数
OUT:输出参数
INOUT:既作为输入参数,也作为输出参数
3.写存储过程里面要执行的内容
CREATE DEFINER=`root`@`%` PROCEDURE `InsertNewConsultation`(IN `user_id` int,IN `doc_id` int,IN `now_time` datetime,IN `disease_id` int,IN `patient_id` int,IN `patient_speak_text` text,OUT `patient_speak_id` int)
BEGIN
--声明变量
DECLARE consultation_id INT;
insert into
consultation_basic
(user_id,last_reply_text,last_reply_time,consultation_status,doctor_unread_number,disease_id,patient_unread_number,patient_id,doc_id)
values
(user_id,patient_speak_text,now_time,1,1,disease_id,0,patient_id,doc_id);
SET consultation_id = @@identity;
insert into
patient_speak
(patient_speak_text,patient_user_id,patient_speak_time,isread,consultation_id)
values
(patient_speak_text,user_id,now_time,0,consultation_id);
SET patient_speak_id = @@identity;
END
4.保存即可
二、MyBatis调用存储过程
<select id="insertConsultationBasic" parameterType="com.xxx.platform.entity.NewConsultationCustom"
resultType="com.xxx.platform.entity.NewConsultationCustom" statementType="CALLABLE">
{
CALL InsertNewConsultation(
#{user_id,jdbcType=INTEGER,mode=IN},
#{doc_id,jdbcType=INTEGER,mode=IN},
#{last_reply_time,jdbcType=TIMESTAMP,mode=IN},
#{disease_type_id,jdbcType=INTEGER,mode=IN},
#{patient_id,jdbcType=INTEGER,mode=IN},
#{patient_speak_text,jdbcType=VARCHAR,mode=IN},
#{patient_speak_id,jdbcType=INTEGER,mode=OUT}
)
}
</select>
注:调用存储过程时,注意参数顺序不能错。