基于Mybatis使用MySql存储过程,实现数据统计功能

news2024/9/24 1:16:41

1、前言

  作为一个工作了很多年的程序员来说,没有在实际工作中真正使用过存储过程,其实对存储过程本身有过了解和学习,在日常的学习中,也会看过一些存储过程的相关介绍,不过“纸上得来终是浅”,正好这次做统计分析的业务功能时,适合使用存储过程的机会,就搞起来了,顺便记录一些遇见的一些问题,方便后续查看和学习。

业务场景

  根据一个时间区间(startTime,endTime)和机构编码(orgCode)从不同维度查询一类数据的多个指标项(num1,num2,num3,num4等),每个数据项都对应一个SQL查询语句。

2、使用Navicat创建存储过程

  下面是完整的创建存储过程的SQL语句(直接在Navicat执行会出现报错)。

CREATE PROCEDURE queryNumByCounty(
IN startTime Date,
IN endTime Date,
IN orgCode VARCHAR(20),
OUT num1 INT, -- 指标1
OUT num2 INT,    -- 指标2
OUT num3 INT, -- 指标3
OUT num4 INT) -- 指标4
BEGIN
	-- 指标1
	SELECT
		count(T.id) INTO num2
	FROM
		t_test T
	WHERE
		T.is_chg != 2
	AND STATUS = '0'
	AND T.county_id = orgCode
	AND T.create_time BETWEEN startTime AND endTime
	AND T.phase_type = 6
	-- 指标2
	SELECT
		count(T.id) INTO num2
	FROM
		t_test T
	WHERE
		T.is_chg != 2
	AND STATUS = '0'
	AND T.county_id = orgCode
	AND T.create_time BETWEEN startTime AND endTime
	AND T.phase_type = 6 AND T.count > 0
	-- 指标3
	SELECT
		count(T.id) INTO num3
	FROM
		t_test T
	WHERE
		T.is_chg != 2
	AND STATUS = '0'
	AND T.county_id = orgCode
	AND T.create_time BETWEEN startTime AND endTime
	AND T.phase_type = 6 AND T.postpone_status = 2
	-- 指标4
	SELECT
		count(T.id) INTO num4
	FROM
		t_test T
	WHERE
		T.is_chg != 2
	AND STATUS = '0'
	AND T.county_id = orgCode
	AND T.create_time BETWEEN startTime AND endTime
	AND T.phase_type = 6 AND T.third_count > 0
END;

  上述存储过程的SQL语句直接在Navicat执行会出现报错“Can’t create a PROCEDURE from within another stored routine”。原因是因为:在Navicat中创建存储过程,不需要声明事件类型,事件名称、参数等,直接begin~end就可以了,即不需要上述SQL中的前8行代码

  在Navicat上测试和验证存储过程,点击“运行”,需要输入参数,包括入参和出参,其中入参直接输入参数值即可,出参输入“@参数名”,各参数间“,”分隔即可,效果如下:
在这里插入图片描述

3、Mybatis中的调用

  下面是在Mybatis中调用存储过程的代码:

XML配置文件
注意一定要添加statementType="CALLABLE"属性。

<select id="queryNumByCounty" resultType="map" statementType="CALLABLE">
	{call queryCaseNumByCounty(
		#{startTime,mode=IN},
		#{endTime,mode=IN},
		#{orgCode,mode=IN},
		#{num1,mode=OUT,jdbcType=INTEGER},
		#{num2,mode=OUT,jdbcType=INTEGER},
		#{num3,mode=OUT,jdbcType=INTEGER},
		#{num4,mode=OUT,jdbcType=INTEGER}
	)}
</select>

Java代码
这里的返回值,没有作用,我们需要的返回值都在参数param中。这里省略了Service、Controller层的代码,和平常的编程没有区别。

	/**
     * 指标统计 存储过程实现,
     * @param param
     * @return
     */
    public Map<String,Object> queryNumByCounty(Map<String,Object> param);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 利用网络同步时间

yum -y install ntp ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ntpdate ntp1.aliyun.com 创建加入crontab echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null &" >> /var/spool/cron/rootntp常用服务器 中国国家授…

力扣sql中等篇练习(十三)

力扣sql中等篇练习(十三) 1 每位学生的最高成绩 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 #先找到最大的元素 然后分组即可,不用管某些字段(grade)是不是聚合字段 SELECT e1.student_id,min(e1.course_id) course_id,e1.grade FROM Enrollment…

setup.py方式打包自己的python代码并可以用pip install安装

setup.py方式打包自己的python代码并可以用pip install安装 所需文件及目录规范示例演示引用自己打的包 所需文件及目录规范 注意setup.py文件和MANIFEST.in文件需要放在和你需要打包的目录同一级下&#xff0c;例如我这里需要打包的就是webconsole文件夹&#xff08;这里webc…

gl-opendrive插件(车俩3D仿真模拟自动驾驶)

简介 本插件基于免费opendrive开源插件、Threejs和Webgl三维技术、vue前端框架&#xff0c;blender开源建模工具等进行二次开发。该插件由本人独立开发以及负责&#xff0c;目前处于demo阶段&#xff0c;功能还需待完善&#xff0c;由于开发仓促代码还需优化。 因此&#xff…

35岁测试人,面临职场危机,打了一场漂亮的翻身仗...

“夜深知雪重&#xff0c;时闻折竹声”。雪折&#xff0c;一种在雪的载荷下&#xff0c;植物&#xff08;多指树&#xff09;的躯干或枝条被不断堆积的雪花压断的现象。我的刚刚经历了人生的第一次“雪折”。 我是一个有点聪明且勤奋好学的人&#xff0c;从考入省重点大学起&a…

Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)

参考文章https://blog.csdn.net/xray2/article/details/120497146 之所以多次一举自己写多一篇文章&#xff0c;主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 1.首先确认一下自己的代码是Win32的还是Win64的&#xff0c;我操作系统是64的&#xff0c;忘…

java websocket实现聊天室 附源码

目录 1.Socket基础知识 2.socket代码实现 2.1 引入依赖 2.2 配置websocket 2.3 websocket的使用 2.4 webSocket服务端模块 2.5 前端代码 3.测试发送消息 4.websocket源码地址 1.Socket基础知识 Socket&#xff08;套接字&#xff09;用于描述IP地址和端口&#xff0c…

4年测试工作经验,跳槽之后面试20余家公司的总结

先说一下自己的个人情况&#xff0c;普通二本计算机专业毕业&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而离职后到今天都没有收到一份offer&#xff01;一直在待业中&#xff0c;从离职第一天就开始准备简历&#xff0c…

【Vue 基础】尚品汇项目-02-路由组件的搭建

项目路由说明&#xff1a; 前端的路由&#xff1a;Key-Value键值对 Key&#xff1a;URL&#xff08;地址栏中的路径&#xff09; Value&#xff1a;相应的路由组件 作用&#xff1a;设定访问路径&#xff0c;并将路径和组件映射起来&#xff08;就是用于局部刷新页面&#xff0…

Vue+Openlayers+proj4实现坐标系转换

场景 Vue中使用Openlayers加载Geoserver发布的TileWMS&#xff1a; Vue中使用Openlayers加载Geoserver发布的TileWMS_霸道流氓气质的博客-CSDN博客 在上面的基础上实现不同坐标系坐标数据的转换。 Openlayers中默认的坐标系是EPSG:900913 EPSG:900913等效于EPSG:3857 可在…

kafka集群压测与优化

影响kafka集群性能的因数有多个&#xff0c;网络带宽、cpu、内存、磁盘读写速度、副本数、分区数、broker数量、内存缓存等因素都会影响kafka集群的性能 1.优化kafka集群配置 server.properties配置文件优化 num.network.threads4 num.io.threads4 socket.send.buffer.bytes…

提升供应链运营效率:企业如何规范化供应商关系?

在现代企业运营中&#xff0c;采购和供应链管理已成为至关重要的环节。企业尤其需要管理好自身供应商&#xff0c;才能够获得优质的原材料和零部件&#xff0c;并确保生产和销售的正常进行。本文将从供应商的筛选、双方合作的流程管理、团队建设等方面&#xff0c;为大家介绍如…

腾讯云COS+SpringBOot实现文件上传下载功能

文章目录 第一步&#xff1a;在.yml文件中配置对应秘钥内容第二步&#xff1a;完成COSConfig类编写第三步&#xff1a;编写Controller类Bug提示&#xff1a; 最近一直在做一个项目&#xff0c;需要支持视频&#xff0c;音频&#xff0c;图片的上传&#xff0c;前面介绍的都是把…

新一代边缘计算盒子,英码科技边缘计算盒子SY-E160

SY-E160 是英码科技推出的新一代智能工作站&#xff0c;内部集成了 4 核强悍处理器 A551.5 GHz&#xff0c;其内置的算力核拥有 16Tops 超强算力。SY-E160 工作站采用低功耗技术设计&#xff0c;支持 宽温度环境工作&#xff0c;可以灵活部署于各种 AI 场景中。 SY-E160 深元 A…

在SaleSmartly管理客户互动的 3 个好处

交互是关系的小组成部分。随着时间的推移&#xff0c;互动的质量决定了人们对这段关系的投入程度&#xff0c;同样的动态也适用于客户和品牌。在跨境电商业务中&#xff0c;每一次互动都是建立信任或失望的机会。 对于许多公司来说&#xff0c;客户互动的主要领域是客户服务功能…

机器学习 - Seaborn 练习, 常见功能查阅

机器学习记录 Seaborn Seaborn 是一个基于 Matplotlib 的 Python 可视化库,提供了一些内置数据集以及进行统计数据可视化和模型现场的 API。 sns.get_dataset_names() 方法会返回一个字符串列表,包含所有内置数据集的名称 练习 Seaborn 依赖Matplotlib, NumPy, SciPy, Pan…

python装不上库的心得

如果在相同的环境下别人能安装上&#xff0c;但你安装不上&#xff0c;可以考虑下面几点 目录 1 升级pip 2 有的包不用刻意装&#xff0c;它跟着别的就一起装了 3 缺少外部依赖 4 有的库用conda安装要方便一点 5 导入名不一定是包名 6 编译安装 7 安装包时&…

西门子S7-1500与FANUC机器人进行EtherNetIP通信的具体方法示例

西门子S7-1500与FANUC机器人进行EtherNetIP通信的具体方法示例 具体方法可参考以下内容: 以下示例中TIA博途的版本为V17,本例中PLC做主站,机器人做从站 一、 西门子PLC一侧的组态设置和编程 首先,我们需要到下载所需的EtherNetIP通信库文件,大家可自行百度获取或者从以下链…

Kafka的核心概念

一、消息&#xff08;Record&#xff09; 消息是 Kafka 中最基本的数据单元。消息由一串字节构成&#xff0c;其中主要由 key 和 value 构成&#xff0c;key 和 value 也都是 byte 数组。消息的真正有效负载是 value 部分的数据。为了提高网络和存储的利用率&#xff0c;生产者…

TCP流量控制与拥塞控制

什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段&#xff0c;就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多&#xff0c;而接收方的应用程序从缓冲区读取的速度较慢&…