前端传参调用MyBatis执行MySQL存储过程及返回结果详解
本文详细解析如何在Vue前端页面输入参数,经过Java Controller和Service层,最终通过MyBatis以CALLABLE模式调用MySQL存储过程,并将执行后的数据结果返回至前端表格展示,解决前后端与数据库交互中关于存储过程调用的常见实现细节。
结果与目标
目标是实现一个完整的业务链路:用户在Web界面输入多个业务参数(如趟次编号、金额等),点击“执行”按钮触发后端逻辑,MyBatis接收这些参数并映射到MySQL存储过程进行计算或数据处理,随后将更新或生成的数据查询出来并在同一界面展示结果列表。
准备条件
在开始编码前,需确保数据库中存在对应的表结构和已定义的存储过程。可以通过以下SQL在数据库中查看已有的存储过程:
SELECT `name` FROM mysql.proc WHERE db = 'your_db_name' AND `type` = 'PROCEDURE';
SHOW PROCEDURE STATUS;
第1步:数据库准备
目的: 验证存储过程是否存在并可执行。
动作: 假设已建表 a_tmp 并定义了存储过程 bill_a_forbusiness。测试执行语句如下:
CALL bill_a_forbusiness(44,44,52,47,44,46,52,52,349171)
若需要调试存储过程的定义代码,可使用:SHOW CREATE PROCEDURE proc_name;
真实操作顺序
第1步:Java实体类定义(Domain)
入口: Controller接收JSON数据或URL参数。
动作: 创建一个与前端字段及数据库字段对应的Java实体类 StockProc。该类继承自 BaseEntity,包含所有存储过程所需的输入/输出属性。
public class StockProc extends BaseEntity {
private int id;
@Excel(name = "第一参数趟次") private int a;
@Excel(name = "第二参数趟次") private int b ;
@Excel(name = "第三参数趟次") private int c;
@Excel(name = "第四参数趟次") private int d;
// ... 省略其他字段 e, f, g, h, abc, t, tc, min1
}第2步:MyBatis Mapper接口与XML配置
重点: 区分普通查询与存储过程调用。
动作:
1. 在Mapper接口中定义两个方法:一个是普通SQL查询列表 selectStockProcList,另一个是调用存储过程 selectStockProcParamList。
2. 在XML文件中,调用存储过程必须指定 statementType="CALLABLE" 并使用 call 关键字。
<!-- MyBatis Mapper XML -->
<mapper namespace="com.ruoyi.stock.mapper.StockProcMapper">
<resultMap type="StockProc" id="StockProcResult">
<result property="Id" column="id"/>
<result property="a" column="a"/>
<result property="b" column="b"/>
<result property="c" column="c"/>
<result property="d" column="d"/>
<result property="e" column="e"/>
<result property="f" column="f"/>
<result property="g" column="g"/>
<result property="h" column="h"/>
<result property="abc" column="abc"/>
<result property="t" column="t"/>
<result property="tc" column="tc"/>
<result property="min1" column="min1"/>
</resultMap>
<!-- 调用存储过程 -->
<select id="selectStockProcParamList" parameterType="StockProc" resultMap="StockProcResult" statementType="CALLABLE">
call bill_a_forbusiness(#{a},#{b},#{c},#{d},#{e},#{f},#{g},#{h},#{abc})
</select>
<!-- 普通查询用于回填数据 -->
<select id="selectStockProcList" parameterType="StockProc" resultMap="StockProcResult">
SELECT a,b,c,d,e,f,g,h,abc,t,tc,min1 FROM a_tmp
</select>
</mapper>第3步:Service与Controller处理
入口: /stock/proc/list 和 /stock/proc/query 接口。
动作: Service层仅做简单的Mapper调用。Controller层需注意权限校验(如RuoYi框架的 @PreAuthorize)和分页处理(startPage())。
@RestController
@RequestMapping("/stock/proc")
public class StockProcController extends BaseController {
@Autowired
private IStockProcService stockProcService;
/** 触发存储过程执行 */
@GetMapping("/list")
public TableDataInfo list(StockProc stockProc) {
startPage();
// 注意:某些情况下执行后需查库而非直接返回Call结果,具体视DB驱动而定
List<StockProc> paramlist = stockProcService.selectStockProcParamList(stockProc);
return getDataTable(paramlist);
}
/** 查询执行后的数据结果 */
@GetMapping("/query")
public TableDataInfo getInfo(StockProc stockProc) {
startPage();
List<StockProc> list = stockProcService.selectStockProcList(stockProc);
return getDataTable(list);
}
}第4步:前端Vue组件与API交互
入口: Vue SFC文件中的模板、数据和方法。
动作:
1. **API定义**:使用 axios 封装请求。注意 returnProc 的 method 应正确传递参数。
2. **模板**:使用 Element UI 表单收集参数,绑定 queryParams。
3. **事件**:
- “执行”按钮调用 handleQuery,触发 listProc(关联存储过程)。
- “返回/查询”按钮调用 returnQuery,触发 returnProc(关联普通查库)。
// api/stock/proc.js
import request from '@/utils/request'
export function listProc(query) {
return request({ url: '/stock/proc/list', method: 'get', params: query })
}
export function returnProc(query) {
return request({ url: '/stock/proc/query', method: 'get', params: query }) // 修正 parameters 为 params
}
// Proc.vue (部分核心逻辑)
export default {
data() {
return {
queryParams: { pageNum: 1, pageSize: 10, a: null, b: null, ... }, // 包含存储过程参数
returnprocList: []
};
},
methods: {
handleQuery() {
this.queryParams.pageNum = 1;
// 1. 传入参数调用存储过程
listProc(this.queryParams).then((response) => {
// 如果存储过程直接返回游标,这里处理;通常执行后需再次查询
});
},
returnQuery() {
this.queryparameters.pageNum = 1;
// 2. 查询数据库最新数据展示
returnProc(this.queryparameters).then((response) => {
this.returnprocList = response.rows;
this.total = response.total;
});
}
}
}简要总结
通过以上步骤,实现了从前端输入多参数 -> Java Controller分发 -> MyBatis通过CALLABLE调用MySQL存储过程 -> 数据库执行逻辑 -> 最后重新查询数据并展示的全流程。关键点在于MyBatis XML中必须配置 statementType="CALLABLE",且前后端参数名称需严格对应存储过程定义的参数顺序。
以上就是前端传参数进行Mybatis调用mysql存储过程执行返回值的详细内容,更多关于Mybatis调用mysql存储过程前端传参与返回值配置的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













