mybatis之数据统计与自定义异常处理
文章目录
- 需求描述
- 定义实体
- 方式一、mybatisPlus实现
- 方式二、自定义SQL实现
- 简单查询
- 过滤查询
- 异常处理
- 1、SQL拼写异常
在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进行数据统计。
需求描述
计算各个店铺每日销量的总金额。
定义实体
首先定义order实体,有金额amount,店铺shop_id等字段,如下图所示。
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;public class Order implements Serializable{/*** 序列化*/private static final long serialVersionUID = 6652550451095312169L;/*** 订单号*/private String orderNo;/*** 订单日期*/private LocalDateTime orderDate;/*** ֧支付金额*/private Long payAmount;/*** 税额*/private Long rateAmount;/*** 订单数量*/private Long skuNum;/*** 不含税金额*/private Long taxtedAmount;/*** 订单明细*/private List<OrderDetail> orderDetailList;private String orderStartDate;private String orderEndDate;public Long getTaxtedAmount() {return taxtedAmount;}public void setTaxtedAmount(Long taxtedAmount) {this.taxtedAmount = taxtedAmount;}public List<OrderDetail> getOrderDetailList() {return orderDetailList;}public void setOrderDetailList(List<OrderDetail> orderDetailList) {this.orderDetailList = orderDetailList;}public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public Long getPayAmount() {return payAmount;}public void setPayAmount(Long payAmount) {this.payAmount = payAmount;}public Long getRateAmount() {return rateAmount;}public void setRateAmount(Long rateAmount) {this.rateAmount = rateAmount;}public Long getSkuNum() {return skuNum;}public void setSkuNum(Long skuNum) {this.skuNum = skuNum;}public LocalDateTime getOrderDate() {return orderDate;}public void setOrderDate(LocalDateTime orderDate) {this.orderDate = orderDate;}public String getOrderStartDate() {return orderStartDate;}public void setOrderStartDate(String orderStartDate) {this.orderStartDate = orderStartDate;}public String getOrderEndDate() {return orderEndDate;}public void setOrderEndDate(String orderEndDate) {this.orderEndDate = orderEndDate;}
}
方式一、mybatisPlus实现
使用 QueryWrapper 构建查询条件,并使用 groupBy 方法指定分组字段
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.henu.mapper.OrderMapper;
import com.henu.dao.Order;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
import java.util.Map;
public static void main(String[] args) {SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();try {// 获取Mapper接口OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);Order orderQuery = new Order();orderQuery.setOrderStartDate("2024-12-06 23:59:59");orderQuery.setOrderEndDate("2024-12-07 23:59:59");// 创建QueryWrapperQueryWrapper<Order> queryWrapper = new QueryWrapper<>();queryWrapper.select("ifnull(sum(total_amount),0) AS totalAmount,count(*) AS orderCount,shop_id from tb_order").ge("order_date ",orderQuery.getOrderStartDate()).lt("order_date ",orderQuery.getOrderEndDate()).groupBy("shop_id");// 执行查询List<Map<String, Object>> results = mapper.selectMaps(queryWrapper);// 处理查询结果for (Map<String, Object> result : results) {System.out.println(result);}} finally {sqlSession.close();}
}

方式二、自定义SQL实现
对于复杂场景,可采用自定义SQL的方式,在 Java的mapper类中,自定义SQL,进行数据统计。
简单查询
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface OrderMapper extends BaseMapper<Order>{
@Select({"SELECT ","ifnull(sum(total_amount),0) AS totalAmount, ","count(*) AS orderCount, ","shop_id","FROM ","tb_order","WHERE ","1 = 1","AND order_date >= #{orderStartDate,jdbcType=VARCHAR}","AND order_date <= #{orderEndDate,jdbcType=VARCHAR}","GROUP BY","shop_id"})
}
过滤查询
若存在条件判断,则使用 if 标签,Java的mapper文件中 使用script 标签,如下所示。
@Select({"<script>","SELECT ","ifnull(sum(total_amount),0) AS totalAmount, ","count(*) AS orderCount, ","shop_id","FROM ","tb_order","<where> ","1 = 1","<if test='shopId != null '>","AND shop_id = #{shopId,jdbcType=VARCHAR}","</if>","AND order_date >= #{orderStartDate,jdbcType=VARCHAR}","AND order_date <= #{orderEndDate,jdbcType=VARCHAR}","</where>","GROUP BY","shop_id","</script>"
})
异常处理
1、SQL拼写异常
错误信息:
Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 286; 元素内容必须由格式正确的字符数据或标记组成
异常原因
mapper对大于、小于号进行转义
处理方案
即将符号进行转义处理,如下所示。
将 大于号 改写为 >
小于号 改写为 <
相关文章:
mybatis之数据统计与自定义异常处理
文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...
qt creator使用taglib读取音频元信息,windows平台vcpkg安装
注意:qt creator用的构建组件是qt 6.2.3 MSVC2019 64bit 安装vcpkg // 我的安装位置C:\vcpkg git clone https://github.com/microsoft/vcpkg.git C:\vcpkg cd C:\vcpkg .\bootstrap-vcpkg.bat// 设置系统环境变量 VCPKG_ROOT C:/vcpkg用vcpkg安装taglib vcpkg …...
设计模式之生成器模式
目录 1.简介 2.结构 3.使用场景 4.实例 5.优缺点 6.与其他模式的关系 7.总结 1.简介 生成器模式(Builder Pattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该…...
python学opencv|读取图像(三)放大和缩小图像
【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…...
1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面
文章目录 前言一、数据库相关的概念二、MySQL概述1 MySQL的安装和配置2 MySQL登录、退出(1)mysql -uroot -p1234 或者mysql -uroot -p ---- 登录(2)exit或者quit ---- 退出 3 远程登录服务器上的MySQL命令mysql -hip地址 -P3306 -…...
C++初阶—类与对象(中篇)
第一章:类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现&a…...
Leetcode15. 三数之和(HOT100)
链接 一般这种三数之和,四数之和都使用双指针,复杂度最优,次一级可使用哈希表。前者要求有序,后者空间上有花费。 题目: 题目要求答案中不能出现重复vector,比如{-1 1 0}和{-1 0 1}; 这两个…...
Oracle数据库小白备忘
sqlplus相关 导入sql文件 在sqlplus中,导入一个sql文件,是使用或者start。 如当前目录下有一个hello.sql,则可以使用 hello.sql 或者 start hello.sql 来进行导入,功能类似于mysql里面的source。 退出编辑模式 当使用sqlplus…...
DDR4与DDR3服务器内存的关键区别有哪些?
内存作为服务器性能的关键组件之一,已经经历了从DDR3到DDR4的过渡。DDR4内存相较于DDR3在多个方面有所提升,包括速度、带宽、功耗以及数据传输效率等。然而,尽管DDR4内存在性能上占有优势,DDR3内存依然在一些特定场景中得到了广泛…...
Linux: shell: bash: set -x;调试使用
man bash set -x -x After expanding each simple command, for command, case command, select command, or arithmetic for command, display the expanded value of PS4, followed by the command and its expanded arguments or associated word list. 这个可以帮助将变量…...
Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署
文章目录 前言一、Hbase伪分布式部署(手动部署)1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.jar…...
自定义指令,全局,局部,注册
让输入框自动获取焦点(每次刷新自动获取焦点) <template><div><h3>自定义指令</h3><input ref"inp" type"text"></div> </template><script> export default {mounted(){this.$refs.inp.focus…...
静坐修心.
文章目录 打坐的历史文化渊源东方的起源与传承西方的接受与演变现代生活中的打坐 盘腿坐对身体的影响促进脊椎健康改善呼吸系统功能增强消化系统机能改善血液循环调节神经系统错误姿势及其他潜在危害 盘腿坐对心理的作用促进内心平静与放松提升自我觉察与内在探索培养专注力与精…...
设计模式c++(一)
文章目录 一、面向对象设计原则二、模版方法三、策略模式四、观察者模式五、装饰模式六、桥模式七、工厂方法_Factory Method八、抽象工厂_Abstract Factory九、原型模式十、构建器_builder十一、单件模式_Singleton十二、享元模式_Flyweight 一、面向对象设计原则 设计模式的…...
核密度估计——从直方图到核密度(核函数)估计_带宽选择
参考 核密度估计(KDE)原理及实现-CSDN博客 机器学习算法(二十一):核密度估计 Kernel Density Estimation(KDE)_算法_意念回复-GitCode 开源社区 引言 在统计学中,概率密度估计是一种重要的方法࿰…...
Vant UI Axure移动端元件库:提升移动端原型设计效率
UI框架的选择对于提升开发效率和用户体验至关重要。Vant UI,作为一款基于Vue.js的轻量、可靠的移动端组件库,自2017年开源以来,凭借其丰富的组件库、良好的性能以及广泛的兼容性,在移动端开发领域崭露头角,赢得了众多开…...
如何用 JavaScript 操作 DOM 元素?
如何用 JavaScript 操作 DOM 元素?——结合实际项目代码示例讲解 在前端开发中,DOM(文档对象模型)操作是与页面交互的核心。通过 DOM 操作,开发者可以动态地修改页面内容、响应用户交互、控制样式等。JavaScript 提供…...
【Ubuntu】URDC(Ubuntu远程桌面助手)安装、用法,及莫名其妙进入全黑模式的处理
1、简述 URDC是Ubuntu远程桌面助手的简称。 它可以: 实时显示桌面:URDC支持通过Windows连接至Ubuntu设备(包括x86和ARM架构,例如Jetson系列、树莓派等)的桌面及光标。远程操控双向同步剪切板多客户端连接:同一Ubuntu设备最多可同时被三台Windows客户端连接和操控,适用于…...
ES-DSL查询
term查询 因为精确查询的字段搜是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。 语法说明: // term查询 GET /index…...
npm 设置镜像
要在npm中设置镜像,你可以使用npm config命令。以下是设置npm镜像的步骤: 临时使用淘宝镜像: npm --registry https://registry.npmmirror.com install package-name 永久设置镜像: npm config set registry https://registry…...
5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命
5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命 【免费下载链接】PptxGenJS Create PowerPoint presentations with a powerful, concise JavaScript API. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS PptxGenJS是一款基于JavaScript的开源…...
Rufus高效使用实战指南:精通ext2/ext3/ext4文件系统格式化
Rufus高效使用实战指南:精通ext2/ext3/ext4文件系统格式化 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 在Linux系统管理和开发工作中,USB设备的格式化与启动盘制作是一…...
如何3步搞定黑苹果?这款零代码工具让你告别3天煎熬
如何3步搞定黑苹果?这款零代码工具让你告别3天煎熬 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是不是也曾被黑苹果配置折磨得焦头烂…...
从二极管到MOS管:工程师实测对比三种防反接电路的效率与成本(含数据)
从二极管到MOS管:三种防反接电路的全维度工程评估手册 当你的电路板因为电源反接冒出一缕青烟时,那种混合着焦味和绝望的体验,相信每个硬件工程师都记忆犹新。防反接电路看似简单,却直接影响着产品的可靠性、成本和能效表现。本文…...
从Demo到生产级:免费开源Agentic RAG实战课程,手把手教你构建智能系统!
Production Agentic RAG Course是一个免费开源课程,旨在帮助开发者从零构建生产级Agentic RAG系统。课程分为5个模块,共17节课,涵盖架构设计、工具集成、性能优化和生产部署等关键内容。Agentic RAG通过引入Agent能力,实现主动规划…...
LeetCode 283. Move Zeroes 题解
LeetCode 283. Move Zeroes 题解 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输…...
保姆级教程:用Python和Open3D玩转激光雷达点云与图像融合(附KITTI数据集实战)
从零实现激光雷达与相机融合:Open3DKITTI实战指南 当激光雷达的精确测距遇上相机的丰富纹理,自动驾驶感知系统便拥有了"立体视觉"——这正是多模态融合技术的魅力所在。本文将带您用Python和Open3D构建一个完整的点云-图像融合流水线ÿ…...
抖音内容高效下载实战:从单视频到批量采集的完整指南
抖音内容高效下载实战:从单视频到批量采集的完整指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为无法保存喜欢的抖音内容而烦恼吗?是否经常遇到需要批量下载用户主页所有作…...
如何用Binance Trade Bot实现加密货币交易自动化?从配置到运行的完整路径
如何用Binance Trade Bot实现加密货币交易自动化?从配置到运行的完整路径 【免费下载链接】binance-trade-bot Automated cryptocurrency trading bot 项目地址: https://gitcode.com/gh_mirrors/bi/binance-trade-bot 在加密货币交易领域,手动操…...
Python AI用例生成效率提升300%:从零搭建可复用的Prompt工程流水线
第一章:Python AI用例生成效率提升300%:从零搭建可复用的Prompt工程流水线在AI应用开发中,重复编写、调试和验证Prompt严重拖慢用例迭代速度。本章介绍一种基于Python的轻量级Prompt工程流水线,通过模板化、版本化与自动化执行三重…...
