Mybatis调用Oracle存储过程,Oracle创建存储过程,Mybatis调用procedure
================================
©Copyright 蕃薯耀 2020-10-30
http://fanshuyao.iteye.com/
一、Oracle创建存储过程
1、Oracle创建无参数的存储过程procedure
--Oracle 创建无参数的存储过程 create or replace procedure csgx_proc_cmm_code_none as begin update CMM_CODE l set l.code_value='dd' where l.code_id='proc_01'; commit; end; / --建立同义词 create or replace public synonym csgx_proc_cmm_code_none for aaaUser.csgx_proc_cmm_code_none; --授权给用户bbbUser grant execute on csgx_proc_cmm_code_none to bbbUser; --PL/SQL调用存储过程 begin csgx_proc_cmm_code_none; end;
2、Oracle 创建有参数的存储过程
--Oracle 创建有参数的存储过程 --存储过程的参数名称不能和表的字段同名 create or replace procedure csgx_proc_cmm_code(p_code_id in varchar2, p_code_value in varchar2) as begin update CMM_CODE l set l.code_value=p_code_value where l.code_id=p_code_id; commit;--新增、修改、删除需要提交 end; / --建立同义词 create or replace public synonym csgx_proc_cmm_code for aaaUser.csgx_proc_cmm_code; --授权给用户 grant execute on csgx_proc_cmm_code to bbbUser; --PL/SQL调用存储过程 begin csgx_proc_cmm_code('proc_01', '4444'); end;
3、Oracle创建select查询的存储过程,Oracle创建带参数的游标存储过程(即创建select的存储过程,并返回查询结果)
--Oracle创建带参数的游标存储过程(即创建select的存储过程,并返回查询结果) --存储过程的参数名称不能和表的字段同名 create or replace procedure csgx_proc_cmm_code_select(p_class_type in varchar2, cur_result out Sys_Refcursor) as begin open cur_result for select * from CMM_CODE l where l.class_type=p_class_type; end;
/ --创建同义词 create or replace public synonym csgx_proc_cmm_code_select for aaaUser.csgx_proc_cmm_code_select; --授权给别的用户bbbUser grant execute on csgx_proc_cmm_code_select to bbbUser; --PL/SQL调用存储过程 暂时还不知道在PL/SQL如何调用
二、Mybatis调用存储过程
1、Mybatis调用无参数的存储过程
<update id="callProc" statementType="CALLABLE"> {call csgx_proc_cmm_code_none} </update>
statementType="CALLABLE":表示该调用是存储过程,使用select、update、delete标签都可以,但建议根据业务的实际使用标签。
2、Mybatis调用有参数的存储过程
<update id="callProcParams" statementType="CALLABLE" parameterType="map"> {call csgx_proc_cmm_code_none( #{aaa}, #{bbb}, #{bbb} )} </update>
参数可以设置成map,这样方便
3、Mybatis调用select查询的存储过程,Mybatis调用有参数且返回查询结果的存储过程
<resultMap id="myMap" type="java.util.Map"> </resultMap> 带游标的存储过程 <!--
javaType=ResultSet时,必须要有resultMap,不然会报错:
Caused by: java.lang.IllegalStateException: Missing resultmap in property 'cur_result'.
Parameters of type java.sql.ResultSet require a resultmap.
--> <select id="callProcSelect" statementType="CALLABLE" parameterType="map"> {call csgx_proc_cmm_code_select( #{p_class_type, jdbcType=VARCHAR}, #{cur_result, jdbcType=CURSOR, mode=OUT, javaType=ResultSet, resultMap=myMap} )} </select>
下面为对应的存储过程:
create or replace procedure csgx_proc_cmm_code_select(p_class_type in varchar2,cur_result out Sys_Refcursor)
parameterType="map":表示Dao类中的接口方法callProcSelect传进来的参数是一个map对象。注:map是简写,Mybatis自带的,实际是:java.util.Map
#{p_class_type, jdbcType=VARCHAR}:查询条件的参数,可以多个,看实际
#{cur_result, jdbcType=CURSOR, mode=OUT, javaType=ResultSet, resultMap=myMap}:查询返回的结果,查询返回的数据会被放到这个参数,其中:
jdbcType=CURSOR:表示使用游标
mode=OUT:表示输出
javaType=ResultSet:返回结果集
resultMap=myMap:返回结果集转换对应的resultMap,可以配置一个空的,不用映射,直接返回Map对象
三、Dao接口调用
Map<String, Object> callProcSelect(Map<String, Object> result);
Map<String, Object> result参数是没有@Param注解的。
如果加了这个注解,如:@Param("map") Map<String, Object> result,xml的参数就要变成map.p_class_type,map.cur_result,不然没有结果返回。
如果参数是map,参数就不要用@Param注解标识,尽量避免问题(反正我折腾了很久才发现这个问题,调用成功了,返回的结果是Null)
四、Service调用
1、普通的存储过程调用
procDao.callProc();
2、Java带select查询的存储过程调用,带游标的存储过程调用:
//声明map对象参数 Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("p_class_type", "proc"); //调用存储过程,将传map参数 procService.callProcSelect(resultMap); //接收返回的结果集,cur_result这个变量,对应的就是xml配置文件配置的参数 Object o = resultMap.get("cur_result"); //打印输出 log.info("ResultSet===" + JsonUtil.obj2String(o));
================================
©Copyright 蕃薯耀 2020-10-30
http://fanshuyao.iteye.com/
相关推荐
至此,我们就完成了Spring Boot整合MyBatis调用Oracle存储过程并处理游标返回数据的过程。在实际开发中,可以根据需求调整存储过程的逻辑和结果处理方式,以满足各种复杂业务场景。注意,对于大数据量的查询,使用...
本文将深入探讨如何在Spring和MyBatis集成环境中调用Oracle数据库的存储过程,包括无返回值、返回结果集以及返回多个结果的情况。 首先,让我们理解基础概念。Spring是一个全面的后端开发框架,它提供了依赖注入、...
Mybatis调用Oracle存储过程的方法详解 Mybatis是一款流行的持久层框架,广泛应用于Java企业级应用开发中。 Oracle存储过程是一种高效的数据库操作方式,通过存储过程可以实现复杂的业务逻辑操作。那么,如何使用...
下面将详细介绍如何使用MyBatis来调用Oracle存储过程。 ### 1. 创建Oracle存储过程 首先,我们需要在Oracle数据库中创建一个存储过程。例如,假设我们有一个名为`INSERT_EMPLOYEE`的存储过程,用于插入新的员工...
总结起来,Mybatis调用PostgreSQL存储过程并处理数组参数的关键步骤包括: 1. 在PostgreSQL中创建带有数组参数的存储过程。 2. 自定义一个TypeHandler,实现对数组类型的转换。 3. 在Mybatis的Mapper XML中配置`...
在Spring Boot应用中,调用Oracle数据库的存储过程有多种方式。本文主要介绍三种方法,包括使用`entityManagerFactory.unwrap(SessionFactory.class).openSession()`、直接使用`EntityManager`的`...
在MyBatis的映射文件(mapper.xml)中,我们需要为存储过程创建一个`<select>`标签,但与通常的查询不同,这里需要设置`id`(标识符)、`resultMap`(结果映射)以及`statementType="CALLABLE"`,这表明这是一个调用...
使用MyBatis框架配置Oracle和MySql中存储过程与函数的调用。 分别描述了两种方式的实现:基于XML方式和注解方式。 其中Oracle所使用版本为Oracle11g_XE版,MySQL为5.7版本
本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或数据操作时。本文将详细讲解如何使用Java调用Oracle存储过程,并提供示例代码。 首先,我们需要了解Java中用于与数据库交互的核心...
通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...
本篇文章将深入探讨如何在Oracle中通过调用存储过程实现分页功能。 首先,我们需要创建一个存储过程,这个过程将接收两个参数:起始记录编号(一般为当前页数乘以每页显示的记录数)和每页的记录数。存储过程内部会...
##### 创建存储过程 接下来定义一个存储过程`pro_wealth_deal_detail_array`,该过程接收五个输入参数和一个输出参数,其中输出参数类型为`WEALTH_DEAL_DETAIL_ARRAY`。 ```sql PROCEDURE pro_wealth_deal_detail_...
1. **创建存储过程**:在Oracle数据库中编写存储过程代码。例如,一个简单的增删改查操作的存储过程可能如下: ```sql CREATE OR REPLACE PROCEDURE insert_user (p_name IN VARCHAR2, p_age IN NUMBER) AS ...
本教程将深入探讨如何在Java中调用Oracle存储过程来执行分页查询。 首先,我们需要理解分页的基本概念。分页是将大结果集分割成多个小部分,每次只加载一部分数据到内存中,这样可以减少内存消耗,提高响应速度。在...
1. 在数据库中创建存储过程。 2. 在iBATIS映射文件中配置调用存储过程的SQL语句,指定`statementType=CALLABLE`。 3. 在Java代码中,通过`SqlSession`调用存储过程,使用`Map`对象存储输入和输出参数。 通过这种...
在 MyBatis 中,调用存储过程需要用到 `<select>` 标签的 `procedure` 属性,并通过 `parameterMap` 或 `params` 来传递输入参数和接收输出参数。 然后,`mybatis由简单到多元`这部分可能涵盖了从基本的单表操作到...
在实际项目中,你可以利用IDE(如IntelliJ IDEA或Eclipse)的代码补全功能简化存储过程的调用,或者使用ORM框架(如Hibernate或MyBatis)进一步抽象数据库操作。 综上所述,Java调用存储过程涉及到JDBC API的使用,...
使用`procedure`元素来调用存储过程,如: ```xml <procedure id="pro_test" parameterMap="pro_map"> {call user_account_proc(?,?,?,?)} </procedure> ``` 这表示将使用之前定义的`pro_map`参数映射来调用`user...