使用场景
对于一个CRUD的操作需要涉及多条sql语句甚至多个表的关联,如果使用持久层框架去做一个个查询,会使得业务逻辑变得复杂冗余,这里我们可以使用mysql的存储过程对象(不同的数据库直接的存储过程函数有一定的语法差别),使用存储过程不仅可以简化我们后端业务逻辑操作,还可以通过使用mysql内置的函数去简化我们的sql之间的值传递的操作
比如 last_insert_id() 获取通过数据库主键自增策略插入数据的id(如果是自定义主键,手动输入,则last_insert_id() 依旧是上一次通过自增策略获取的id值)
项目使用
1、Controller层
@ApiOperation(value = "添加部门")
@PostMapping("/")
public RespBean addDep(@RequestBody Department dep){
return departmentService.addDep(dep);
}
2、serviceImpl
@Override
public RespBean addDep(Department dep) {
dep.setEnabled(true);
departmentMapper.addDep(dep);
if (dep.getResult() == 1) {
return RespBean.success("添加部门成功!", dep);
}
return RespBean.error("添加部门失败");
}
3、mapper.xml
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shuang.server.pojo.Department">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="parentId" property="parentId" />
<result column="depPath" property="depPath" />
<result column="enabled" property="enabled" />
<result column="isParent" property="isParent" />
</resultMap>
<resultMap id="DepartmentWithChildren" type="com.shuang.server.pojo.Department" extends="BaseResultMap">
<collection property="children" ofType="com.shuang.server.pojo.Department"
select="com.shuang.server.mapper.DepartmentMapper.getAllDepartments" column="id"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, parentId, depPath, enabled, isParent
</sql>
<!--获取所有部门-->
<select id="getAllDepartments" resultMap="DepartmentWithChildren">
select
<include refid="Base_Column_List"/>
from t_department
where parentId = #{parentId}
</select>
4、存储过程函数
CREATE DEFINER=`root`@`%` PROCEDURE `addDep`(in depName varchar(32),in parentId int,in enabled boolean,out result int,out result2 int)
begin
declare did int;
declare pDepPath varchar(64);
insert into t_department set name=depName,parentId=parentId,enabled=enabled;
select row_count() into result;
select last_insert_id() into did;
set result2=did;
select depPath into pDepPath from t_department where id=parentId;
update t_department set depPath=concat(pDepPath,'.',did) where id=did;
update t_department set isParent=true where id=parentId;
end