MyBatis 示例之存储过程(一)

Parameter number 5 is not an OUT parameter java.sql.SQLException: Parameter number 5 is not an OUT parameter 阅读详情

本示例是《MyBatis 从入门到精通》书中第一个存储过程的例子,有关本示例的基础环境,可以从 http://mybatis.tk 或者 https://github.com/mybatis-book/book 获取,示例源码在 simple-all 中。

存储过程在数据库中比较常见,虽然大多数存储过程比较复杂,但是使用 MyBatis 调用时,用法都一样,因此我们这一节使用一个简单的存储过程来了解 MyBatis 中存储过程的使用方法。

基本准备

存储过程涉及表 sys_user,建表语句如下。

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `user_password` varchar(50) DEFAULT NULL COMMENT '密码',
  `user_email` varchar(50) DEFAULT 'test@mybatis.tk' COMMENT '邮箱',
  `user_info` text COMMENT '简介',
  `head_img` blob COMMENT '头像',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1035 DEFAULT CHARSET=utf8 COMMENT='用户表';
准备测试数据如下。

INSERT INTO `sys_user` VALUES ('1', 'admin', '123456', 'admin@mybatis.tk', '管理员用户', 0x1231231230, '2016-06-07 01:11:12');
INSERT INTO `sys_user` VALUES ('1001', 'test', '123456', 'test@mybatis.tk', '测试用户', 0x1231231230, '2016-06-07 00:00:00');
1
2
对应实体类SysUser如下:

/**
 * 用户表
 */
public class SysUser implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 用户ID
     */
    private Long id;
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String userPassword;
    /**
     * 邮箱
     */
    private String userEmail;
    /**
     * 简介
     */
    private String userInfo;
    /**
     * 头像
     */
    private byte[] headImg;
    /**
     * 创建时间
     */
    private Date createTime;
    //省略 getter 和 setter
}
建存储过程

我们先创建如下的存储过程。

# 第一个存储过程
# 根据用户 id 查询用户其他信息
# 方法看着很奇葩,但是展示了多个输出参数
DROP PROCEDURE IF EXISTS `select_user_by_id`;
DELIMITER ;;
CREATE PROCEDURE `select_user_by_id`(
IN userId BIGINT,
OUT userName VARCHAR(50),
OUT userPassword VARCHAR(50),
OUT userEmail VARCHAR(50),
OUT userInfo TEXT,
OUT headImg BLOB,
OUT createTime DATETIME)
BEGIN
# 根据用户 id 查询其他数据
select user_name,user_password,user_email,user_info,head_img,create_time
INTO userName,userPassword,userEmail,userInfo,headImg,createTime 
from sys_user
WHERE id = userId;
END
;;
DELIMITER ;
创建XML方法

<select id="selectUserById" statementType="CALLABLE" useCache="false">
    {call select_user_by_id(
        #{id, mode=IN}, 
        #{userName, mode=OUT, jdbcType=VARCHAR},
        #{userPassword, mode=OUT, jdbcType=VARCHAR},
        #{userEmail, mode=OUT, jdbcType=VARCHAR},
        #{userInfo, mode=OUT, jdbcType=VARCHAR},
        #{headImg, mode=OUT, jdbcType=BLOB, javaType=_byte[]},
        #{createTime, mode=OUT, jdbcType=TIMESTAMP}
    )}
</select>
在调用存储过程的方法中,我们需要把 statementType 设置为 CALLABLE,在使用 select 元素中调用存储过程时,由于存储过程方式不支持 MyBatis 的二级缓存(后面章节会介绍),为了避免缓存配置导致出错,我们直接将 select 元素的 useCache 属性设置为 false。

在存储过程中使用参数时,除了写上必要的属性名外,还必须指定参数的 mode(模式),可选值为 IN、OUT、INOUT 三种,入参使用 IN,出参使用 OUT,输入输出参数使用 INOUT。从上面代码可以轻易看出 IN 和 OUT 的两种模式的区别,那就是 OUT 模式的参数,必须指定 jdbcType。这是因为在 IN 模式下,MyBatis 提供了默认的 jdbcType,在 OUT 模式下没有提供,因此必须指定 jdbcType,另外在使用 Oracle 数据库时,如果入参存在 null 的情况,那么也必须指定 jdbcType。

除了上面提到的这几点外,headImg 还特别设置了 javaType。在 MyBatis 映射的 Java 类中我们都不推荐使用基本类型,但是数据库 BLOB 类型对应的 Java 类型我们通常都是写成 byte[] 字节数组,因为 byte[] 数组不会有默认值的问题,所以不会影响我们一般的使用。但是在不指定 javaType 的情况下,MyBatis 默认使用 Byte 类型。由于我们使用的 byte 是基本类型,所以设置 javaType 的时候,基本类型要使用带下划线方式的类型,在这里就是 byte[],_byte 对应的是基本类型,byte 对应的是 Byte 类型,在使用 javaType 时一定要注意。

创建接口

/**
 * 使用存储过程查询用户信息
 * 
 * @param user
 * @return
 */
void selectUserById(SysUser user);
1
2
3
4
5
6
7
因为我们这个存储过程没有返回值(不要和出参混淆),所以我们返回值类型使用 void,如果你把返回值设置为 SysUser 或 List<SysUser> 也不会报错,但是任何时候返回值都是 null。

编写测试

@Test
public void testSelectUserById(){
    SqlSession sqlSession = //获取SqlSession的方法
    try {
        //这个例子的XML和接口都定义在UserMapper中
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        SysUser user = new SysUser();
        user.setId(1L);
        userMapper.selectUserById(user);
        Assert.assertNotNull(user.getUserName());
        System.out.println("用户名:" + user.getUserName());
    } finally {
        sqlSession.close();
    }
}

执行测试,输出如下日志:

DEBUG [main] - ==>  Preparing: {call select_user_by_id( ?, ?, ?, ?, ?, ?, ? )} 
DEBUG [main] - ==> Parameters: 1(Long)
用户名:admin
使用出参方式的时候,通常情况下我们会使用对象中的属性接收出参的值,或者使用 Map 类型方法入参接收返回值。这两种情况下有很大的区别。当我们使用 POJO 对象接收出参时,我们必须保证所有出参在 POJO 中都有对应的属性存在,否则就会抛出类似 “Could not set property 'xxx'”的错误,这是由于 POJO 对象中不存在出参对应的 setter 方法导致的。使用 Map 类型时就不需要必须存在该属性,当 Map 接收了存储过程的出参时,可以通过 Map 对象的 get("属性名") 方法获取出参的值。

错误提示

除了上面提到的错误外,当你在执行存储过程时,还可能会遇到下面的错误:

Parameter number x is not an OUT parameter

这个错误可能的原因是因为你调用的存储过程不存在,或者 MyBatis 中写的出参和数据库存储过程的出参对应不上而导致的。
--------------------- 
作者:isea533 
来源:优快云 
原文:https://blog.youkuaiyun.com/isea533/article/details/76358365 
版权声明:本文为博主原创文章,转载请附上博文链接!

使用 MyBatis 注解方式调用存储过程! 在 MyBatis 中,调用存储过程有两种常用方式:通过 XML 配置文件的方式和通过注解的方式。对于更简洁的开发风格,可以使用 MyBatis 注解方式来调用存储过程。本文将介绍如何使用 MyBatis 注解来调用存储过程。通过 MyBatis 注解调用存储过程是非常简便的,尤其是对于简单的存储过程调用。我们可以使用@Select@Update和@Insert等注解来执行存储过程,利用@Param注解传递参数,并结合@ResultMap进行结果映射。使用@Select@Insert@Update。 阅读详情

相关推荐

MyBatis中调用MySQL存储过程的详细指南

在数据库管理系统中,存储过程是一组为了完成特定功能的SQL语句集,它们经过编译后被存储在数据库中,可以通过指定的名称来调用执行。存储过程可以接受输入参数,并可返回输出参数和结果集,使得数据操作更加模块化和可重用。MyBatis是一个半自动化的持久层框架,其优势在于对SQL的灵活掌握和轻量级操作。与JDBC相比,MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。

weixin_29476595的博客 1173

java.sql.SQLException: Parameter number 4 is not an OUT parameter

mysql存储过程不存在。 导入数据库的时候,不包含存储过程。 新建存储过程即可。

半僧 4714

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。

youzhangjing_的博客 1730

学习编程过程中-->遇到的错误

学习编程过程中–>遇到的错误(吕招焕) 1、java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1). (翻译:找到了1个问号,却插入了2个值,导致参数越界(根据得到的信息打印将很容易判断数据是否与数据库字段匹配等小问题)) 详情如下图所示 在查询了许多资料之后,大概都是说sql语句参数设置发生了错误 第1 种情况:就是当设置参数时,没有相应的问号与之匹配(或者根本就没

煮酒客的博客 1371

PCIE Lane Margining Linux 环境配置

Copy all the provided files in folder PYC38 or PYC310 to the created pcie_lmt folder. Index of /ftp/python/3.8.10/Copy below commands to a file and rename it as "scan_pcie.py", the commands are from "685662 PCIe-LMT-Gen4_Gen5-r0p77.pdf" in the lane margi

mysongshine的博客 1436

Android Qcom USB Driver学习(五)

在前面的第二期中,我们知道一些非标的USB的充电类型Floatingcharger,其具有和普通DCP相似的大电流能力,但在最初检测的时候会限制Inputcurrentlimit到100mA,来进行检测是否是SDP类型,所以要支持大电流输入就需要进行vote操作,前面的几篇都有涉及,所以本文学习一下pmicusbcharger都相关的vote机制。...

Android驱动开发 2901

mybatis IDEA——存储过程的使用以及 Parameter number x is not an OUT parameter错误

1、根据用户id查询用户其他信息 创建存储过程 CREATE PROCEDURE sp_query_by_id( IN i_userid BIGINT, OUT userName VARCHAR(50), OUT userPassword VARCHAR (50), OUT userEmail VARCHAR(50), OUT createTime DATETIME )...

Bruce_Json的博客 4064

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

Parameter number × is not an OUT parameter

试着从下面几个找一下: 1、你的数据库 或者表是否有了这个存储过程(我的就是存储过程搞错表了。。。翻了半天代码没问题 尴尬的找了半天)。 2、看你的存储过程名字写对没 3、看参数对不对 你是不是少传了还是多传了 附带查看存储过程与删除 show procedure status; -- 查看 DROP PROCEDURE IF EXISTS 存储过程名;(存储过程名记得带引号) -...

zhl_BeginLife的博客 1352

Prometheus+Grafana部署及企业微信邮件/群消息告警通知配置

本文详细介绍了在Ubuntu 22.04系统上部署普罗米修斯监控系统的完整流程。首先说明了系统配置要求(2核CPU、4G内存、100G硬盘),然后分步骤指导下载、解压和安装普罗米修斯服务。文章包含配置prometheus.yml文件、启动服务、设置系统服务等关键操作,并提供了访问9090端口验证服务的方法。接着介绍了通过node_exporter监控Linux主机的配置过程,包括安装、启动服务和修改普罗米修斯配置文件添加监控项。最后还涉及了mysqld_exporter的部署流程,用于监控MySQL数据库服

m0_58761900的博客 1638

DeerFlow 系列教程 第十六篇 | 实战案例一——用 DeerFlow 进行深度研究

在日常使用 AI Agent 时,最常见的需求之一就是对某个主题进行全面、系统的研究。多源信息采集——不能只依赖单次搜索,需要从多个角度搜索不同来源交叉验证——不同来源的信息需要相互印证,避免单一信源的偏差结构化输出——最终产出的不是零散的信息片段,而是有组织的研究报告传统做法是人工反复搜索、阅读、整理。传统手工研究: DeerFlow 深度研究:人工搜索 → 阅读页面 → 记笔记 提交研究主题│ │▼ ▼换关键词 → 再搜索 → 再阅读 ┌──────────────────┐。

weixin_43674738的博客 162

mybatis操作存储过程示例

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 一般mybatis自动生成策略会帮助...

qq_14926283的博客 462

AI一键生成带货短视频:电商直播的未来

随着电子商务行业的快速发展,直播带货已成为一种极为有效的营销手段。然而,传统的人工直播方式存在诸多局限性,如人力成本高、主播培训周期长等问题。为了解决这些挑战,一种基于AI技术的一键生成带货视频解决方案应运而生——这就是“Anchor Crafter”。这项创新技术不仅能够自动创建高质量的带货视频,而且还能实现人物与商品之间的自然交互,极大地提升了用户体验。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2202

MyBatis调用oracle存储过程

前言 存储过程书写要规范(IN 、OUT 参数一定要写上,例如:v_siteNo IN VARCHAR2),不然JAVA调用有问题,拿不到存储过程返回值 存储过程ONE create or replace procedure P_GetToken(v_siteNo IN VARCHAR2, tv OUT var...

thebigdipperbdx的博客 9788

YOLOv13改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)

本文记录的是改进YOLOv13的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 870

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MyBatis学习:存储过程

一、存储过程1 CREATE PROCEDURE `select_user_by_id`( IN userId BIGINT, OUT userName VARCHAR(50), OUT userPassword VARCHAR(50), OUT userEmail VARCHAR(50), OUT userInfo TEXT, OUT headImg BLOB, OUT createTime DATETIME) BEGIN -- 根据用户id查询数据 SELECT user_nam

sssxlxwbwz的博客 9359

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mybatis调用存储过程

MyBatis调用存储过程的方式,和普通的select查询方式用法相同,都可以接收方法入参(parameterType = String | Object | Map)、和方法返回值(resultType | resultMap)。--注意,在mapper-select节点配置时,需要增加一项设置:statementType=“CALLABLE",以表明这是一个存储过程 -->VALUES ('123456','京东金融','渐渐老了','100');//编写调用存储过程的DAO。//客户端调用存储过程。

HakuMaster的博客 8564

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mybatis使用存储过程

在讲解mybatis的存储过程调用之前谈谈存储过程的优劣: 优点 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行 增删改查 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 ...

m0_37561039的博客 1万+

MyBatis如何调用Mysql存储过程

文章目录数据库相关代码相关 阿里规约中不推荐使用存储过程。本文目的仅在于学习MyBatis如何调用存储过程。 本文以添加部门为例。 数据库相关 表结构 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYDHAALJ-1594201041199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200707113754574.png)] 添加部门的函数addDep()

臭小子的博客 1511

Mybatis调用存储过程

调用存储过程mybatis调用存储过程时需要指定statementType=”CALLABLE”,这样Mybatis内部中调用sql语句时将采用CallableStatementHandler,而CallableStatementHandler内部将使用CallableStatement来调用存储过程。如果存储过程是有参数的,需要指定mode属性,可选值有IN、OUT和INOUT。当mode为OUT

Elim的博客 6518

mybatis存储过程返回list

假设我们有一个名为的存储过程,它返回用户表中的所有用户信息。sql复制代码BEGINEND //DELIMITER;

weixin_41203765的博客 1028

mybatis怎么使用存储过程

MyBatis 会在存储过程执行后,将数据库中的 OUT 参数值设置回这些 Java 参数对象中。在 MyBatis 中使用存储过程需要一些特定的配置,因为存储过程的调用方式(使用。​ 需要仔细设计 Mapper 接口的返回值和参数,以接收所有需要的数据。:这是最重要的设置,告诉 MyBatis 这是一个对存储过程的调用。返回一个用户对象(结果集)和一个额外的计算值(OUT 参数)。​ 确保 XML 中参数的顺序与存储过程定义的参数顺序一致。​ 确保 XML 中参数的顺序与存储过程定义的顺序完全匹配。

zwh1zwh的博客 675
上一篇: mybatis中文网站
下一篇: MyBatis的discriminator鉴别器的作用
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值