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是存储过程并不是每个人都熟练掌握的,目前我主要是用存储过程来做一些数据初始化的工作。