### MyBatis 学习笔记:操作存储过程与返回数据类型 #### 一、概述 在实际项目开发中,为了提高数据库操作效率以及确保数据一致性,我们常常会使用存储过程来封装复杂的业务逻辑。MyBatis 作为一种优秀的 ORM 框架,在处理存储过程方面也提供了强大的支持。本文将详细介绍如何利用 MyBatis 来调用存储过程,并返回不同类型的数据。 #### 二、基础概念 1. **存储过程**:存储过程是预编译的一组 SQL 语句集合,可以接收输入参数并返回输出结果或状态值。它们存储在数据库中,可以被应用程序通过特定方式调用。 2. **MyBatis**:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,可以非常方便地配置和映射原生信息到 Java 对象和集合。 #### 三、存储过程创建与调用 ##### 3.1 创建存储过程(插入数据) - **存储过程定义**: ```sql CREATE OR REPLACE PROCEDURE pro_save_emp (r OUT NUMBER, empno VARCHAR2, ename VARCHAR2, sal NUMBER, job VARCHAR2) AS BEGIN INSERT INTO emp_info VALUES (empno, ename, sal, job); COMMIT; r := 1; EXCEPTION WHEN OTHERS THEN r := 0; ROLLBACK; END; ``` 上述存储过程实现了向 `emp_info` 表中插入一条记录的功能,并通过 `r` 参数返回操作是否成功。 - **MyBatis 映射文件**: ```xml <parameterMap type="java.util.Map" id="pm"> <parameter property="r" mode="OUT" jdbcType="DOUBLE" javaType="int"/> <parameter property="empno" mode="IN" javaType="int"/> <parameter property="ename" mode="IN" javaType="String"/> <parameter property="sal" mode="IN" javaType="double"/> <parameter property="job" mode="IN" javaType="String"/> </parameterMap> <select id="save_pro" resultType="int" parameterMap="pm" statementType="CALLABLE"> call pro_save_emp(?,?,?,?,?) </select> ``` - **Java 测试代码**: ```java private static void save_pro(SqlSession session) { String stmt = "com.mappers.emp_info_mapper.save_pro"; Map<String, Object> map = new HashMap<>(); map.put("r", -1); map.put("empno", 1234); map.put("ename", "zhangsan"); map.put("job", "java"); map.put("sal", 5000D); session.selectOne(stmt, map); int r = (int) map.get("r"); System.out.println(r); } ``` ##### 3.2 创建存储过程(返回游标) - **存储过程定义**: ```sql CREATE OR REPLACE PROCEDURE proc_search_emp (cur OUT SYS_REFCURSOR, e_min NUMBER, e_max NUMBER) AS BEGIN OPEN cur FOR SELECT * FROM emp_info WHERE sal BETWEEN e_min AND e_max; END; ``` 此存储过程用于根据薪资范围查询 `emp_info` 表中的记录,并通过游标 `cur` 返回查询结果。 - **MyBatis 映射文件**: ```xml <resultMap type="java.util.Map" id="rm"></resultMap> <parameterMap type="java.util.Map" id="pm_2"> <parameter property="cur" jdbcType="CURSOR" mode="OUT" resultMap="rm"/> <parameter property="e_min" jdbcType="DOUBLE" mode="IN"/> <parameter property="e_max" jdbcType="DOUBLE" mode="IN"/> </parameterMap> <select id="find_pro" parameterMap="pm_2" statementType="CALLABLE"> call proc_search_emp(?,?,?) </select> ``` - **Java 测试代码**: ```java private static void search_pro(SqlSession session) { String stmt = "com.mappers.emp_info_mapper.find_pro"; Map<String, Object> map = new HashMap<>(); map.put("cur", OracleTypes.CURSOR); map.put("e_min", 1000D); map.put("e_max", 3000D); session.selectOne(stmt, map); // 处理游标返回的结果 } ``` #### 四、注意事项 - 在使用 MyBatis 调用存储过程时,需要注意输入参数和输出参数的模式(`IN` 和 `OUT`),以及它们对应的 Java 类型和 JDBC 类型。 - 使用 `statementType="CALLABLE"` 指定 SQL 语句为可调用语句。 - 处理游标返回的数据时,需要正确解析结果集。 #### 五、总结 本文详细介绍了如何使用 MyBatis 调用存储过程并返回不同类型的数据。通过示例,我们了解了存储过程的创建方法,以及如何在 MyBatis 映射文件中定义参数映射和结果映射。这些知识对于提高应用程序性能和简化数据库操作具有重要意义。




















- 粉丝: 7
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 项目管理软技术题库.doc
- 电子商务项目管理期末复习重点总结.docx
- 综合布线设计方案.pptx
- 基于80C166单片机PEC服务的PROFIBUSFDL从站协议实现.doc
- 新版酵母基因工程.pptx
- 电子政务与智慧城市建设dataHub数据事例平台[1].ppt
- 简述Project在产品开发项目管理中的应用.doc
- 网络安全教育主题班会模板.doc
- 信息化技术在水电工程项目管理中的应用研究.doc
- 全国计算机等级考试三级数据库知识点总结.docx
- cad打印流程.doc
- 互联网与实体经济的关联探讨.doc
- 计算机硬件维护.ppt
- 电子商务师考试报名时间-报名入口-1.docx
- 软件应用质量体系确认程序.doc
- 网络市场调研与策划培训.pptx


