Mybatis3 调用存储过程
1. 数据库MySQL,user表
CREATE TABLE `user` (`USER_ID` int NOT NULL AUTO_INCREMENT,`USER_NAME` varchar(100) NOT NULL COMMENT '用户姓名',`AGE` int NOT NULL COMMENT '年龄',`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',PRIMARY KEY (`USER_ID`)) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb3

2.使用Mybatis-generator生成POJO等对象
具体使用方法参考文章:Mybatis Generator 使用手册-CSDN博客
User.java
package com.derek.model;import java.util.Date;public class User {/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.USER_ID** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private Integer userId;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.USER_NAME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private String userName;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.AGE** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private Integer age;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.CREATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private Date createdTime;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.CREATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private String createdBy;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.UPDATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private Date updatedTime;/**** This field was generated by MyBatis Generator.* This field corresponds to the database column user.UPDATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/private String updatedBy;/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.USER_ID** @return the value of user.USER_ID** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Integer getUserId() {return userId;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.USER_ID** @param userId the value for user.USER_ID** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setUserId(Integer userId) {this.userId = userId;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.USER_NAME** @return the value of user.USER_NAME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public String getUserName() {return userName;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.USER_NAME** @param userName the value for user.USER_NAME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setUserName(String userName) {this.userName = userName;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.AGE** @return the value of user.AGE** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Integer getAge() {return age;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.AGE** @param age the value for user.AGE** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setAge(Integer age) {this.age = age;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.CREATED_TIME** @return the value of user.CREATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Date getCreatedTime() {return createdTime;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.CREATED_TIME** @param createdTime the value for user.CREATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setCreatedTime(Date createdTime) {this.createdTime = createdTime;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.CREATED_BY** @return the value of user.CREATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public String getCreatedBy() {return createdBy;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.CREATED_BY** @param createdBy the value for user.CREATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setCreatedBy(String createdBy) {this.createdBy = createdBy;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.UPDATED_TIME** @return the value of user.UPDATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Date getUpdatedTime() {return updatedTime;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.UPDATED_TIME** @param updatedTime the value for user.UPDATED_TIME** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setUpdatedTime(Date updatedTime) {this.updatedTime = updatedTime;}/*** This method was generated by MyBatis Generator.* This method returns the value of the database column user.UPDATED_BY** @return the value of user.UPDATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public String getUpdatedBy() {return updatedBy;}/*** This method was generated by MyBatis Generator.* This method sets the value of the database column user.UPDATED_BY** @param updatedBy the value for user.UPDATED_BY** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setUpdatedBy(String updatedBy) {this.updatedBy = updatedBy;}@Overridepublic String toString() {return "User{" +"userId=" + userId +", userName='" + userName + '\'' +", age=" + age +", createdTime=" + createdTime +", createdBy='" + createdBy ;}
}
其他的类就不逐一介绍了,这里只列出User对象,后面会使用。
3.定义存储过程
这里的存储过程为了展示功能,使用了IN和OUT类型两种参数。
具体的功能为:根据输入的页面编号和页面数据量参数,返回总的页数和总数据量。同时返回查询的页面数据集合。
DELIMITER $$
CREATE PROCEDURE query_user_by_page(IN page_num INTEGER,IN page_size INTEGER,OUT total_count INTEGER,OUT total_page INTEGER
)
BEGINDECLARE start_pos INT;SET start_pos = (page_num - 1) * page_size;-- compute total count SELECT COUNT(1) INTO total_countFROM user;-- compute total pageSET total_page = CEILING(total_count/page_size);SELECT * FROM user LIMIT start_pos, page_size;
END
$$ DELIMITER ;
MySQL workbench console调用,检查procedure正确性
call query_user_by_page(2, 2, @total_count, @total_page);
select @total_count, @total_page;
小提示:MySQL 存储过程局部变量和全局变量区别和使用
1. 局部变量
局部变量是在存储过程或函数中声明的变量,其作用域仅限于该存储过程或函数内部。
声明局部变量
局部变量必须在存储过程的开头声明,且在 BEGIN 语句之后。使用 DECLARE 语句声明局部变量。
DELIMITER //CREATE PROCEDURE ExampleProcedure()
BEGINDECLARE var1 INT DEFAULT 0; -- 声明一个整型变量,默认值为 0DECLARE var2 VARCHAR(50); -- 声明一个字符串变量DECLARE var3 DATE; -- 声明一个日期变量-- 变量赋值SET var2 = 'Hello, World!';SET var3 = '2025-04-14';-- 使用变量SELECT var1, var2, var3;
END //DELIMITER ;
2. 全局变量
全局变量的作用范围是整个数据库会话,可以在多个存储过程或会话中使用。MySQL 提供了一些预定义的全局变量,也可以通过 SET 语句设置自定义全局变量。
预定义的全局变量
MySQL 提供了一些系统全局变量,可以通过 SHOW VARIABLES 或 SELECT @@variable_name 查看其值。
sql复制
SHOW VARIABLES LIKE 'max_connections'; -- 查看系统变量
SELECT @@max_connections; -- 查看系统变量
自定义全局变量
可以通过 SET 语句设置自定义全局变量。自定义全局变量的作用范围是整个会话。
SET @global_var = 'Hello, Global!'; -- 设置全局变量DELIMITER //CREATE PROCEDURE UseGlobalVariable()
BEGINSELECT @global_var; -- 在存储过程中使用全局变量
END //DELIMITER ;CALL UseGlobalVariable(); -- 调用存储过程
4.编写Mapper.xml中存储过程调用
<select id="queryUserByPage" statementType="CALLABLE" parameterType="map" resultType="com.derek.model.User">{call query_user_by_page(#{pageNum, mode=IN, javaType=INTEGER},#{pageSize, mode=IN, javaType=INTEGER},#{totalCount, mode=OUT, jdbcType=INTEGER},#{totalPage, mode=OUT, jdbcType=INTEGER})}
</select>
这里注意statementType选择“CALLABLE”,表示调用存储过程。一般使用map来传递IN, OUT 参数。
特别注意: 存储过程的名字要写对,不然查错误❌特别费劲。我曾经名字写错了,写成了调用方法的名字queryByPage。报错Parameter number 3 is not OUT parameter。被整得懵懵的,找了很久才发现错误。
5. Mapper.java中接口定义
public interface UserMapperExt extends UserMapper {List<User> queryUserByPage(Map<String,Object> map);}
这里使用Map<String,Object>来接收和存储OUT对象。
6.编写单元测试
package com.derek.mapper;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;public class UserMapperExtTest {private static SqlSession sqlSession;private static UserMapperExt userMapperExt;@BeforeAllpublic static void setUp() throws IOException {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");sqlSession = new org.apache.ibatis.session.SqlSessionFactoryBuilder().build(reader).openSession();userMapperExt = sqlSession.getMapper(UserMapperExt.class);}@AfterAllpublic static void tearDown() {userMapperExt = null;sqlSession.close();}@Testpublic void testQueryByPage() {Map<String,Object> map = new HashMap<>();map.put("pageNum", 1);map.put("pageSize", 2);userMapperExt.queryUserByPage(map).forEach(System.out::println);sqlSession.commit();System.out.println("totalCount:" + map.get("totalCount"));System.out.println("totalPage:" + map.get("totalPage"));}}
我的数据库中User表有11条数据,查询接入如下:
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@76012793]
==> Preparing: { call query_user_by_page( ?, ?, ?, ? ) }
==> Parameters: 1(Integer), 2(Integer)
<== Columns: USER_ID, USER_NAME, AGE, CREATED_TIME, CREATED_BY, UPDATED_TIME, UPDATED_BY
<== Row: 1, derek, 20, 2025-02-14 13:34:01, UNKNOWN, 2025-03-01 21:47:07, derek
<== Row: 3, adore, 34, 2025-03-08 03:07:39, jack.zhang, 2025-03-08 03:07:39, jack.zhang
<== Total: 2
<== Updates: 0
User{userId=1, userName='derek', age=20, createdTime=Fri Feb 14 21:34:01 CST 2025, createdBy='UNKNOWN
User{userId=3, userName='adore', age=34, createdTime=Sat Mar 08 11:07:39 CST 2025, createdBy='jack.zhang
totalCount:11
totalPage:6
到此为止,Mybatis3调用存储过程结束。
相关文章:
Mybatis3 调用存储过程
1. 数据库MySQL,user表 CREATE TABLE user (USER_ID int NOT NULL AUTO_INCREMENT,USER_NAME varchar(100) NOT NULL COMMENT 用户姓名,AGE int NOT NULL COMMENT 年龄,CREATED_TIME datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,CREATED_BY varchar(100) NOT NUL…...
解决 openeuler 系统 docker 下载慢,docker 镜像加速
一、步骤说明 1. 编辑 Docker 配置文件 Docker 的镜像源配置文件路径为 /etc/docker/daemon.json。如果该文件不存在,则需要先创建目录和文件。 # 创建目录(如果不存在) sudo mkdir -p /etc/docker# 编辑配置文件(使用 nano 或…...
HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型
一、软件介绍 文末提供程序和源码下载 HiPixel是一个开源程序基于SwiftUI构建的macOS原生应用程序,用于AI驱动的图像超分辨率,并利用Upscayl的强大AI模型。 二、软件特征 具有 SwiftUI 界面的原生 macOS 应用程序使用 AI 模型进行高质量图像放大通过 G…...
Python 正则表达式模块 re
Python 正则表达式模块 re flyfish 一、正则表达式基础 1. 什么是正则表达式? 正则表达式(Regular Expression, RE)是一种用于匹配、查找和替换文本模式的工具,由普通字符(如字母、数字)和特殊字符&…...
[RN 实践有效]Expo+cross-env配置项目环境变量
首先,从中可以看出,cross-env的主要作用是跨平台设置环境变量,而Expo项目通常通过app.config.js或.env文件来管理这些变量。需要强调安装cross-env的必要性,以及如何在package.json中正确配置脚本命令。 接下来,用户的问题是关于Expo中cross-env的详细配置,因此需要分步骤…...
缓存和客户端数据存储体系(Ark Data Kit)--- 应用数据持久化(首选项持久化、K-V、关系型数据库)持续更新中...
Core File Kit做怎删改查操作不便,用Ark Data Kit。 功能介绍 ArkData (方舟数据管理)为开发者提供数据存储、数据管理和数据同步能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全、可靠以及共享访问等管…...
ES 使用geo point 查询离目标地址最近的数据
需求描述:项目中需要通过经纬度坐标查询目标地所在的行政区。 解决思路大致有种,使用es和mysql分别查询。 1、使用es进行查询 将带有经纬度坐标的省市区数据存入es中,mappings字段使用geo point类型,索引及查询dsl如下。 geo p…...
本地部署OpenManus及原理介绍
概述: 最近Minaus特别火,随后开源社区就有项目尝试复刻Minaus,项目名称为OpenManus,原理是用推理模型为决策者,将我们输入的问题进行分解后调用本地工具执行。 OpenManus安装: 本人在Ubuntu桌面版本上安装…...
高效手机检测:视觉分析技术的优势
在当今社会,手机已成为人们日常生活和工作中不可或缺的工具。然而,在某些特定场合,如考场、工作场所等,手机的使用却可能带来负面影响。因此,如何有效监测和防止在这些场合偷用手机的行为,成为了一个亟待解…...
Java 多线程编程:提升系统并发处理能力!
多线程是 Java 中实现并发任务执行的关键技术,能够显著提升程序在多核处理器上的性能以及处理多任务的能力。本文面向初级到中级开发者,从多线程的基本定义开始,逐步讲解线程创建、状态管理、同步机制、并发工具以及新兴的虚拟线程技术。每部…...
Linux实时内核稳定性案例
稳定性问题分析 RT_RUNTIME_SHARE案例死锁问题Linux-rt下卡死之hrtimer分析Linux内核宕机案例 -mmap空指针Linux Hung Task分析过程...
解决 VSCode SSH 连接报错:“REMOTE HOST IDENTIFICATION HAS CHANGED” 的问题
问题描述 在使用 VSCode 通过 SSH 连接远程服务器时,我们可能会遇到类似如下的错误日志: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! ... Offending ED25519 key in C:\Users\DELL/…...
Spring Boot配置类原理、Spring Boot核心机制理解,以及实现自动装置的底层原理
目的:从底层源码角度分析 Spring Boot 配置类以及自动装载的底层原理 文章目录 1. Spring Boot 配置类实现自动装载1.1 @Configuration注解1.2 @Configuration 注解完成 bean 注入流程图1.3 @ConfigurationProperties注解赋值2. Spring Boot的核心机制:自动装配2.1 @SpringBo…...
淘宝API vs 爬虫:合规获取实时商品数据的成本与效率对比
以下是淘宝 API 和爬虫在合规获取实时商品数据方面的成本与效率对比: 成本对比 淘宝 API 开发成本:需要申请开发者账号并获取 API 权限,部分敏感或高频访问的接口可能需要额外的审核或付费。开发过程中需要按照平台规定进行编程,相…...
01-Canvas-使用fabric初始
fabric官网: https://fabric5.fabricjs.com/demos/ 创建画布并绘制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…...
CMake简单入门
简介 CMake 是一个开源的跨平台构建系统生成工具,旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程,特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接,而是生成本地构建系统所需的文件࿰…...
树莓派 连接 PlutoSDR 教程
在树莓派5上安装PlutoSDR(ADALM-Pluto)的驱动程序,主要需要安装相关的库和工具,以便与PlutoSDR通信,比如libiio和libad9361,并确保系统能够识别设备。由于树莓派5运行的是基于Linux的系统(通常是…...
【时时三省】(C语言基础)用printf函数输出数据3
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 ( 5 ) e格式符。 用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编译系统(如VisualC)会自动给出数字部分…...
Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境
在日常的开发过程中,使用版本控制工具 Git 是一个非常重要的技能,特别是对于管理和协作开发。通过 GitHub,我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…...
在Pycharm配置conda虚拟环境的Python解释器
〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后,终于找到的解决的方案,遂将该方法简要的记录下来,以备后用,并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下,假…...
CURL一文通
文章目录 1.什么是curl2.curl可以发送什么请求3.常见curl发http相关请求怎么写4.curl带上的参数分别有什么,可以怎么用5.进阶用法6.常见错误以及学习指导建议 1.什么是curl 是利用URL语法在命令行下工作的开源文件传输工具。尤其被广泛应用的在linux系统下。 2.cu…...
零基础keil:设置注释快捷键
1.打开快捷键设置: 在Keil中,选择菜单栏中的“Settings”,然后选择“Shortcuts”来打开快捷键设置界面。 2.选择注释命令: 在快捷键设置界面中,找到与注释相关的命令,如“Comment Selection”࿰…...
Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别
文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用:避免空指针异常2.3 为什么要用?2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明: orElse 如何使用orElseGet 如何使用两者的…...
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...
python学智能算法(八)|决策树
【1】引言 前序学习进程中,已经对KNN邻近算法有了探索,相关文章链接为: python学智能算法(七)|KNN邻近算法-CSDN博客 但KNN邻近算法有一个特点是:它在分类的时候,不能知晓每个类别内事物的具…...
【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC
1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...
【QT:控件】
目录 控件状态:编辑 geometry : window frame windowlcon: qrc机制 qrc的使用方式: window opacity cursor font: ToolTip focusPolicy: styleSheet: 按钮类控件: PushButton: 给按钮添加图标: 给按钮添加快捷键…...
Python(最新版)集成开发环境PyCharm下载安装详细教程
Python 下载和安装 1.进入Python官网 Download Python | Python.org,点击Downloads,这里以Windows为例 2.选择下载Python 3.13.2 Windows 64位的版本。注意:不能在Windows 7 或更早的版本上使用。 3.打开文件,会自动出现安装界…...
PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码
以下是一个使用 PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码。该代码包含训练和可视化部分,假设输入为图片和 4 个工艺参数,根据这些输入生成相应的图片。 1. 导入必要的库 import …...
【BERT和GPT的区别】
BERT采用完形填空(Masked Language Modeling, MLM)与GPT采用自回归生成(Autoregressive Generation)的差异,本质源于两者对语言建模的不同哲学导向与技术目标的根本分歧。这种选择不仅塑造了模型的架构特性,…...
