mybatis中调用存储过程

1 篇文章 0 订阅

service层

@Override
public Result initAppCategory(String tenantName) {
    //获取租户
    List<String> tenantIdList = appCategoryMapper.listTenantByTenantName(tenantName);
    if(CollectionUtil.isEmpty(tenantIdList)) {
        return ResultBuilder.createErrorParam().setMsg("该租户不存在,请联系管理员!").build();
    }
    if(tenantIdList.size() > 1) {
        return ResultBuilder.createErrorParam().setMsg("系统存在两个以上相同名字的租户,请联系管理员处理!").build();
    }
    //即将要初始化的租户id为:
    String tenantId = tenantIdList.get(0);

    //调用存储过程初始化租户应用分类信息
    Map<String, Object> param = new HashMap<>(2);
    param.put("tenantId", tenantId);
	
	//这里注意,存储过程的返回结果,返回到了参数param中
    appCategoryMapper.initTenantAppCategoryData(param);
    return ResultBuilder.createSuccess().setData(param).build();
}

mapper.xml

<!--根据租户id初始化应用分类信息-->
<select id="initTenantAppCategoryData"  statementType="CALLABLE">
{
  call init_app_category(
    #{tenantId, mode=IN, jdbcType=VARCHAR},
    #{result, mode=OUT, jdbcType=INTEGER},
    #{msg, mode=OUT, jdbcType=VARCHAR}
  )
}
</select>

解惑

存储过程的出参,返回到了调用参数的map中,这里需要注意!!!

附上我的存储过程

DROP PROCEDURE IF EXISTS init_app_category;
-- ----------------------------
--  指定版本信息 :V1.0
--  新增租户基础数据初始化化
--  tenant_id 租户id
--  o_result 返回结果状态,0表示成功,1表示失败
--  o_errMsg 返回结果错误信息
-- ----------------------------
CREATE PROCEDURE init_app_category(IN tenantId VARCHAR(36),OUT o_result INT,OUT o_errMsg VARCHAR(250))
BEGIN
		-- 定义变量,必须在开头
		-- 定义管理员角色id
		declare admin_role_id varchar(64);
    
		-- 异常捕获
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
		
		-- 事务回复
		ROLLBACK;
		-- 异常返回值
		SET o_result :=1;
		-- 以下错误根据不同模块自定义
		SET o_errMsg :='初始化自定义菜单失败';
    END;
	-- 开始事务
	START TRANSACTION;
	-- 初始化返回值
	SET o_result :=0;
	SET o_errMsg :='初始化自定义菜单成功';
	-- (1)初始化平台基础数据
	-- 以下编写需要初始化的SQL
  -- 清理数据
	delete ac, acr
	from pf_app_category ac
	left join pf_app_category_relation acr on acr.category_id = ac.id
	where ac.tenant_id = tenantId;
	
	-- 给管理员设置应用分类
	set admin_role_id=(select id from pf_role where tenant_id = tenantId and record_status = 0 and role_name = '系统管理员');
	insert into pf_app_category values 
		(replace(uuid(), '-', ''), null, admin_role_id, '系统管理员', '管理类', now(), '系统初始化', now(), '系统初始化', tenantId, 0),
		(replace(uuid(), '-', ''), null, admin_role_id, '系统管理员', '办公类', now(), '系统初始化', now(), '系统初始化', tenantId, 0),
		(replace(uuid(), '-', ''), null, admin_role_id, '系统管理员', '教学类', now(), '系统初始化', now(), '系统初始化', tenantId, 0),
		(replace(uuid(), '-', ''), null, admin_role_id, '系统管理员', '后勤类', now(), '系统初始化', now(), '系统初始化', tenantId, 0);
  -- 给管理员的管理类分类加应用
	alter table pf_app_category_relation modify column id varchar(64);
	insert into pf_app_category_relation
	select 
		uuid() as id, admin_role_id as role_id, (select id from pf_app_category where record_status = 0 and tenant_id = tenantId and role_id = admin_role_id and category_name = '管理类') as category_id,
		'管理类' as category_name, id as app_id, now() as create_time, '系统' as create_by, now() as modified_time, '系统' as modified_by, 0 as record_status  
	from pf_app 
	where record_status = 0 and tenant_id = tenantId and app_name in ('管理平台','基础数据平台');
	
	-- 事务结束,统一提交
	COMMIT;
END

最后

代码中的复杂逻辑最好还是不要在存储过程中处理,1是不便于维护,2是存储过程并不是每个人都熟练掌握的,目前我主要是用存储过程来做一些数据初始化的工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值