Mybatis源码分析之存储过程调用和运行流程_java

这一篇我们学习一下Mybatis调用存储过程的使用和运行流程。首先我们先创建一个简单的存储过程

DELIMITER $
CREATE PROCEDURE mybatis.ges_user_count(IN age INT, OUT user_count INT)
BEGIN
SELECT COUNT(*) FROM users WHERE users.age=age INTO user_count;
END
$ 

这个存储过程的含义其实比较简单的,就是输入age,然后执行select count(*) from users where users.age = age into user_count;获得年龄等于age的人数赋值给user_count,还是比较简单的。

接下来是存储过程的调用,执行如下命令就可以完成存储过程的调用。

接下来我们看看利用Mybatis是如何调用存储过程的。

userMapper.xml添加存储过程调用配置:

<select id="count" statementType="CALLABLE" parameterMap="getUserCountMap">
  CALL mybatis.ges_user_count(?,?)
</select> 

Main函数:

public class Learn1Main {
 public static void main(String [] args){
  //mybatis的配置文件
  String resource = "learn/mybatis-config.xml";
  //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
  InputStream is = Learn1Main.class.getClassLoader().getResourceAsStream(resource);
  //构建sqlSession的工厂
  SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
  SqlSession session = sessionFactory.openSession();
  Map<String, Integer> parameterMap = new HashMap<String, Integer>();
  parameterMap.put("age", 12);
  parameterMap.put("user_count", -1);
  session.selectOne("com.tianjunwei.learn.learn1.entity.User.count", parameterMap);
  Integer result = parameterMap.get("user_count");
  System.out.println(result);
 }
} 

运行结果:

其最终的执行过程在DefaultResultSetHandler中,调用普通的sql和存储过程之间还是有所区别的,Sql语句的执行是使用CallableStatement。

//
// HANDLE OUTPUT PARAMETER
//
//调用存储过程返回结果,将结果值放在参数中
@Override
public void handleOutputParameters(CallableStatement cs) throws SQLException {
 final Object parameterObject = parameterHandler.getParameterObject();
 final MetaObject metaParam = configuration.newMetaObject(parameterObject);
 final List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
/循环处理每个参数
 for (int i = 0; i < parameterMappings.size(); i++) {
 final ParameterMapping parameterMapping = parameterMappings.get(i);
 //判断参数的模式
 if (parameterMapping.getMode() == ParameterMode.OUT || parameterMapping.getMode() == ParameterMode.INOUT) {
  if (ResultSet.class.equals(parameterMapping.getJavaType())) {
  handleRefCursorOutputParameter((ResultSet) cs.getObject(i + 1), parameterMapping, metaParam);
  } else {
  final TypeHandler<?> typeHandler = parameterMapping.getTypeHandler();
  metaParam.setValue(parameterMapping.getProperty(), typeHandler.getResult(cs, i + 1));
  }
 }
 }
}
private void handleRefCursorOutputParameter(ResultSet rs, ParameterMapping parameterMapping, MetaObject metaParam) throws SQLException {
 try {
 final String resultMapId = parameterMapping.getResultMapId();
 final ResultMap resultMap = configuration.getResultMap(resultMapId);
 final DefaultResultHandler resultHandler = new DefaultResultHandler(objectFactory);
 final ResultSetWrapper rsw = new ResultSetWrapper(rs, configuration);
 handleRowValues(rsw, resultMap, resultHandler, new RowBounds(), null);
 metaParam.setValue(parameterMapping.getProperty(), resultHandler.getResultList());
 } finally {
 // issue #228 (close resultsets)
 closeResultSet(rs);
 }
} 

以上所述是小编给大家介绍的Mybatis源码分析之存储过程调用和运行流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mybatis
调用存储过程
mybatis 调用存储过程、mybatis 调用存储函数、mybatis 调用存储、mybatis 源码分析、mybatis 源码下载,以便于您获取更多的相关知识。

时间: 2024-10-31 10:28:38

Mybatis源码分析之存储过程调用和运行流程_java的相关文章

Openstack Nova 源码分析 — RPC 远程调用过程

目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacomputemanager 模块 最后 Nova Project Services nova-api:捕获novaclient发送过来的HTTP请求,并且将它转换为AMQP消息,通过Queue来与别的services通信. nova-conductor:为数据库访问提供了一层安全保障. NOTE:除了nova-

MyBatis源码分析:Configuration

MyBatis依赖的jar不多,而且代码行数也没多少,其中使用了大量的设计模式,值得好好学习.下图是MyBatis的一张架构图,来自Java框架篇-Mybatis 入门. Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. 数据处理层:负责具体的SQL查找.SQL解析.SQL执行和执行结果映射处理等.它主要的目的是根据调用的请求完成一次数据库操作. 基础支撑层:负责最

《深入理解Spark:核心思想与源码分析》——1.1节运行环境准备

1.1 运行环境准备 考虑到大部分公司的开发和生成环境都采用Linux操作系统,所以笔者选用了64位的Linux.在正式安装Spark之前,先要找台好机器.为什么?因为笔者在安装.编译.调试的过程中发现Spark非常耗费内存,如果机器配置太低,恐怕会跑不起来.Spark的开发语言是Scala,而Scala需要运行在JVM之上,因而搭建Spark的运行环境应该包括JDK和Scala. 1.1.1 安装JDK 使用命令getconf LONG_BIT查看Linux机器是32位还是64位,然后下载相应

React源码分析5 -- 组件通信,refs,key,ReactDOM

React源码系列文章,请多支持:React源码分析1 - 组件和对象的创建(createClass,createElement)React源码分析2 - React组件插入DOM流程React源码分析3 - React生命周期详解React源码分析4 - setState机制React源码分析5 -- 组件通信,refs,key,ReactDOMReact源码分析6 - React合成事件系统 1 组件间通信 父组件向子组件通信 React规定了明确的单向数据流,利用props将数据从父组件传

React源码分析4 — setState机制

React源码系列文章,请多支持:React源码分析1 - 组件和对象的创建(createClass,createElement)React源码分析2 - React组件插入DOM流程React源码分析3 - React生命周期详解React源码分析4 - setState机制React源码分析5 -- 组件通信,refs,key,ReactDOMReact源码分析6 - React合成事件系统 1 概述 React作为一门前端框架,虽然只是focus在MVVM中的View部分,但还是实现了Vi

React源码分析6 — React合成事件系统

React源码系列文章,请多支持:React源码分析1 - 组件和对象的创建(createClass,createElement)React源码分析2 - React组件插入DOM流程React源码分析3 - React生命周期详解React源码分析4 - setState机制React源码分析5 -- 组件通信,refs,key,ReactDOMReact源码分析6 - React合成事件系统 1 React合成事件特点 React自己实现了一套高效的事件注册,存储,分发和重用逻辑,在DOM事

WebWork2源码分析

web Author: zhuam   昨晚一口气看完了夏昕写的<<Webwork2_Guide>>,虽然文档资料很简洁,但仍不失为一本好的WebWork2书籍,看的出作者的经验和能力都是非常的老道,在此向作者的开源精神致敬,并在此引用夏昕的那句话So many open source projects, Why not Open your Documents?   今天下载了最新的WebWork2版本, 开始了源码分析,这份文档只能算是我的个人笔记,也没时间细细校对,且个人能力有

JUnir源码分析(一)

一.引子 JUnit源码是我仔细阅读过的第一个开源项目源码.阅读高手写的代码能学到一些好的编程风格和实现思路,这是提高自己编程水平行之有效的方法,因此早就想看看这些赫赫有名的框架是怎么回事了.今天就拿最简单的JUnit下手,也算开始自己的源码分析之路.   JUnit作为最著名的单元测试框架,由两位业界有名人士协力完成,已经经历了多次版本升级(了解JUnit基础.JUnit实践).JUnit总体来说短小而精悍,有不少值得我们借鉴的经验在里面:但是也有一些不足存在,当然这对于任何程序来说都是难免的

java io学习(三) 管道的简介,源码分析和示例

管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例 本章,我们对java 管道进行学习. java 管道介绍 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流. 它们的作用是让多线程可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用. 使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStr