MyBatis中调用存储过程和函数
一.调用存储过程
1.首先在数据库中定义存储过程,定义的存储过程的代码如下:

//定义存储过程
create or replace procedure pag_add(p1 varchar2,p2 varchar2,p3 =p1+
create or replace function fun_add(p1 number ,p2 number)
return number
as
begin
return p1+p2;
end;

2.通过接口映射Sql,定义接口

package cn.et.mybatis.lesson02.func; import java.util.List;
import java.util.Map;public interface CallMapper {// public void queryEmp(Map map); //查询存储过程的方法
public void callProcedure(Map map); //查询函数的方法
public void callFunction(Map map);
}

3.定义映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 此文件主要用于编写sql语句
namespace是为了解决相同名字的sql操作问题 -->
<mapper namespace="cn.et.mybatis.lesson02.func.CallMapper">
<!-- statementType 声明指向的是什么类型,其中CALLABLE是执行存储过程和函数的-->
<select id="queryEmp" parameterType="map" statementType="CALLABLE">
{
call pag_add(
#{p1,mode=IN,jdbcType=NUMERIC},
#{p2,mode=IN,jdbcType=NUMERIC},
#{p3,mode=OUT,jdbcType=NUMERIC}
)
} </select>
<!-- 定义存储过程 -->
<select id="callProcedure" parameterType="map" statementType="CALLABLE" >
{
call prg_add(
#{p1,mode=IN,jdbcType=NUMERIC},
#{p2,mode=IN,jdbcType=NUMERIC},
#{p3,mode=OUT,jdbcType=NUMERIC}
)
} </select>
<!-- 定义函数 -->
<select id="callFunction" parameterType="map" statementType="CALLABLE">
{
#{p3,mode=OUT,jdbcType=NUMERIC}=call fun_add(
#{p1,mode=IN,jdbcType=NUMERIC},
#{p2,mode=IN,jdbcType=NUMERIC}
)
} </select>
</mapper>

4.定义主mybaits.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 说明mybatis的根节点 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的根标签configuration -->
<configuration>
<!-- 资源文件的路径配置 注:cn前面不能用/否则会抛出异常-->
<properties resource="cn/et/mybatis/lesson02/jdbc.properties">
</properties>
<!-- 配置连接数据库的环境,(开发环境) -->
<environments default="development">
<environment id="development">
<!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚) -->
<transactionManager type="JDBC"/>
<!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) -->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userAccount}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 包含隐射文件主要用于编写sql语句 -->
<mappers>
<!-- 隐射的资源文件 隐射文件主要编写sql语句 -->
<mapper resource="cn/et/mybatis/lesson02/func/call_mapper.xml"/>
</mappers>
</configuration>

5.定义测试类

package cn.et.mybatis.lesson02.func; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;public class TestMyBatis { //封装session的返回
public static SqlSession getSession(){
String resource = "/cn/et/mybatis/lesson02/mybatis.xml";
InputStream inputStream =TestMyBatis.class.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //操作数据库的类 SqlSession
SqlSession session=sqlSessionFactory.openSession(); return session;
} //调用存储过程
public static void main(String[] args) throws IOException {
SqlSession session=getSession();
CallMapper cm=session.getMapper(CallMapper.class);
Map map=new HashMap();
map.put("p1", 100);
map.put("p2", 200);
cm.callProcedure(map);
System.out.println(map.get("p3"));
}
@Test //调用函数
public void funTest(){
SqlSession session=getSession();
CallMapper cm=session.getMapper(CallMapper.class);
Map map=new HashMap();
map.put("p1", 100);
map.put("p2", 400);
cm.callFunction(map);
System.out.println(map.get("p3"));
}
}

以上为存储过程和函数的调用
//查询函数的方法public void callFunction(Map map);
MyBatis中调用存储过程和函数的更多相关文章
- Java中调用存储过程或函数
//?代表一个参数,多个参数用逗号隔开 CallableStatement cs = connect.prepareCall("{?=call 存储过程名称或函数名(?)}"); ...
- 在mybatis中调用存储过程的时候,不能加工语句
select count(0) from ({call pkg_business.P_ZZS_LYFPHJSKJQK ('2018-04')}) 这是错误的.
- ASP.NET中调用存储过程方法
两种不同的存储过程调用方法 为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法.另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明.本文所 ...
- java调用存储过程和函数
以对表test进行增,删,改,查进行说明:1.新建表test create table TEST ( TID NUMBER not null, TNAME VARCHAR2(32), TCODE VA ...
- 转:EF调用存储过程、函数
EF调用存储过程.函数 2014-04-02 09:12:20| 分类: ORM框架|举报|字号 订阅 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code ...
- SQL中的存储过程和函数
存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如 ...
- MySQL中的存储过程和函数
存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...
- MySQL学习笔记:调用存储过程或函数报1418错误
问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...
- oracle中存储过程中调用存储过程
存储过程中调用存储过程 create or replace package body PF_Role_Pack is procedure sp_GetPage_Role(pageSize_ in nu ...
随机推荐
- mysql的大量的sleep进程解决办法
mysql的大量的sleep进程解决办法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/liuyong0507/article/detai ...
- C#作为客户端调用gsoap生成的C++服务端
近日在学习C++,偶然遇到网友想用C#调用gsoap生成的C++服务的问题,遂决定研究一下,网上搜索了很久,大多数是C++调用C#的应用.... 经过本人的不断努力,终于找到一种解决问题的方法,总结如 ...
- Android 查看蓝牙hci日志
最近在调试android连接ble设备,需要查看hci日志.记录一下方法. 1. 开发者选项->启用蓝牙HCI信息收集日志. 2. android 8版本,默认位置/data/misc/blue ...
- [转]谈NAND Flash的底层结构和解析
这里我想以一个纯玩家的角度来谈谈关于NAND Flash的底层结构和解析,可能会有错误的地方,如果有这方面专家强烈欢迎指正. NAND Flash作为一种比较实用的固态硬盘存储介质,有自己的一些物理特 ...
- [tomcat启动报错]registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped
环境:一个tomcat ,一个工程配置了多数据源,在启动的时候报如下错误: SEVERE: The web application [/qdp-resource-job] registered the ...
- bootstrap 列表組
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 最新Java基础面试题及答案整理
最近在备战面试的过程中,整理一下面试题.大多数题目都是自己手敲的,网上也有很多这样的总结.自己感觉总是很乱,所以花了很久把自己觉得重要的东西总结了一下. 面向对象和面向过程的区别 面向过程: 优 ...
- Kafka认证权限配置(动态添加用户)
之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...
- cdh 安装调研
解决:No module named site http://blog.csdn.net/amgang/article/details/7030642 因为安装greenplum导致yum报如下错误: ...
- linux如何添加telnet服务
一.安装telnet 1.检测telnet-server的rpm包是否安装 [root@localhost ~]# rpm -qa telnet-server 若无输入内容,则表示没有安装.出于安全考 ...