Java日常探秘-从小疑问到实践智慧的编程之旅(2)

文章目录

  • 前言
  • 一、常见错误
    • 400错误
    • 401错误
    • 404错误
    • MismatchedInputException
    • Mybatis的NumberFormatException
    • Mybatis的Available parameters are [collection,list]]报错
    • Mybatis之Double类型的字段的值为0.0传入不了sql中
  • 二、SQL效率
    • 数据库字段类型和传入参数类型不匹配
    • 小表驱动大表
    • 减少与数据库之间的连接
  • 总结


前言

所有分享的内容源于日常思考和实践,探讨Java编程中的小知识点和实用场景,加深自己对编程技巧和理解Java深层次的原理,期待发现妙招和解决实际问题的新思路。


一、常见错误

400错误

也称400 Bad Request,是一种HTTP状态码,表示客户端发送给服务器的请求在语法上存在问题,导致服务器无法理解或处理该请求。

在进行web开发中,参数错误是导致400 Bad Request错误的常见原因之一:

  1. 参数错误:缺少必要参数,客户端未提供必要的参数,导致服务器无法处理请求。
  2. 参数格式不正确:客户端提供的参数格式不符合服务器的要求。

举例说明:

//后端接口
public AjaxResult check(@RequestParam("ids")List<Long>ids){
   //执行业务代码
}

前端在传递ids参数时,不小心传成了[5,6,7]这种列表形式,服务器报400错误,后来对于ids参数传成5,6,7的形式,服务器成功处理该请求


401错误

401错误(未授权):未授权访问的提示,那就意味着你被挡在了门外,没有得到进入的许可。就像是你去参加一个派对,却被门口的保安拦住了,因为你没有邀请函或者身份验证。

常见原因:
1.缺少身份验证信息:请求未包含身份验证信息或身份验证信息不完整。通常,身份验证信息应该包含在请求的头部字段Authorization中。
2.无效的身份验证信息:请求包含的身份验证信息无效,可能是由于凭据错误、过期的凭据、无效的令牌等导致的。


404错误

404错误信息通常是在目标页面被更改或移除,或客户端输入页面地址错误后显示的页面,或者浏览器请求后端地址时路径没对应上。
前端js请求

function exportDetail(crossId){
    return request({
        url: '/system/cross/exportDetail/'+crossId,
        method: 'get'
    })
}

后端控制层代码

//后端接口
@GetMapping(value = "/system/cross/{crossId}")
public AjaxResult exportDetail(Pathvariable("crossId")String crossId){
   //执行业务代码
}

这时请求就会报404 Not Found错误,将后端接口路径修改为和前端js一致即可。

@GetMapping方法修改为

//后端接口
@GetMapping(value = "/system/cross/exportDetail/{crossId}")
public AjaxResult exportDetail(Pathvariable("crossId")String crossId){
   //执行业务代码
}

MismatchedInputException

MismatchedInputException是Java中Jackson库在反序列化过程中抛出的异常。Jackson是一个快速的JSON处理库,用于将Java对象转换成JSON格式,以及将JSON转换成Java对象。当Jackson尝试将JSON数据转换为Java对象时,如果JSON的结构与目标Java类的结构不匹配,就会抛出MismatchedInputException: Cannot deserialize instance of

通过一个简单的例子来解析Jackson的反序列化过程

public class TaskResp {
    private String id;
    private String name;
    // getters and setters
}

public class Main {
    public static void main(String[] args) {
        String json = "[{\"id\":\"1\",\"name\":\"Task1\"},{\"id\":\"2\",\"name\":\"Task2\"}]";
        ObjectMapper mapper = new ObjectMapper();
        try {
            // 错误:尝试将数组反序列化为单个对象
            TaskResp taskResp = mapper.readValue(json, TaskResp.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

我们尝试将一个包含多个TaskResp对象的JSON数组反序列化为单个TaskResp对象,,因此会抛出MismatchedInputException。


Mybatis的NumberFormatException

<where>
  <if test="isExpired != null and isExpired=='Y'">and msg.expire_time &lt; now() </if>
</where>

mybatis使用字符串参数的时候 mybatis java.lang.NumberFormatException: For input string: ‘Y’

报错原因:mybatis是用OGNL表达式来解析的,在OGNL的表达式中,'Y’会被解析成字符,Java是强类型的,char和一个string会导致不等,所以if标签中的sql不会被解析。在做字符串的比较的情况下,需要将字符转为字符串类型。

<where>
  <if test="isExpired != null and isExpired=='Y'.toString()">and msg.expire_time &lt; now() </if>
</where>

Mybatis的Available parameters are [collection,list]]报错

mybatis可以支持多种传参模式,主要讲解mybatis的list集合或数组传参时遇到的一个问题。

<select id="queryImIdByEmails" parameterType="java.util.List" resultType="java.lang.String">
        select uid from employee where email in
        <foreach collection="param1" item="item"  separator="," open="(" close=")" index="">  
              #{item}    
        </foreach> 
</select>

本地调试时报了这个错误:org.apache.ibatis.binding.BindingException: Parameter ‘customerIdList’ not found. Available parameters are [collection, list]

报错原因:集合或者数组传参给mybatis时,mybatis会使用map来封装参数,如果是list传参时,map的默认key为list,数组传参时,map默认key为array,在不指定传参名称时,必须使用默认的key为sql中collection的值

将collection="param1"改为collection=“list”

<select id="queryImIdByEmails" parameterType="java.util.List" resultType="java.lang.String">
        select uid from employee where email in
        <foreach collection="list" item="item"  separator="," open="(" close=")" index="">  
              #{item}    
        </foreach> 
</select>

Mybatis之Double类型的字段的值为0.0传入不了sql中

原因:Mybatis对于数值型的参数,如果是0会被转换成空字符串, 所以动态条件不成立无法拼接后续条件。

解决方法:如果是数值型吗,判断0.0,需要加 .toString()进行判断。

dto接收前端传入进来的0的数字,经过后端的dto接收后,变成了0.0Double类型的数据。

 @ApiModelProperty("绩点")
 @JsonProperty(value="GPAValue")
 private java.lang.Double GPAValue;

在xml文件需要加上’0’.toString()如:

<if test="GPAValue != null and GPAValue != '' or GPAValue == '0'.toString() ">
         and  JD = #{GPAValue,jdbcType=NUMERIC}
</if>

最好的处理方式:保持好习惯,不要乱写判断,数字类型不会出现空字符串就不要去判断,String类型才需要有空字符串判断。


二、SQL效率

数据库字段类型和传入参数类型不匹配

给employee表的name字段加上索引

CREATE TABLE `employee` (
  `name` varchar(30)  DEFAULT NULL COMMENT '姓名',
  KEY `index_name` (`name`)
) ENGINE=InnoDB;

1.查询name为数字时(全表扫描-发生了隐式类型转换,索引失效)

explain select * from employee where name=1

2.查询name为字符串时,成功走了索引

explain select * from employee where name='1'

所以在开发时一定要注意参数的类型和数据库的类型是否匹配的问题,不然一不小心就可能会导致索引失效。


小表驱动大表

小表驱动大表,也就是说用小表的数据集驱动大表的数据集。

假如有order和user两张表,其中order表有10000条数据,而user表有100条数据,现在想查询所有有效的用户下过的订单列表

可以使用in关键字实现,因为如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句,然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更快。

select * from order 
where user_id in (select id from user where status=1)

而如果sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。

select * from order 
where exists (select 1 from user where order.user_id = user.id and status=1)

思考:为什么小表驱动大表会提高效率,不管大表是驱动表还是小表是驱动表,单纯的分析指令执行次数,都是相同的,那提效在哪里?

//小表驱动大表
for(i = 0; i < 100; i++){
	for(j = 0; j < 10000; j++){
	 //处理业务逻辑代码
	}
}

//大表驱动小表
for(i = 0; i < 10000; i++){
	for(j = 0; j < 100; j++){
	 //处理业务逻辑代码
	}
}

看以上两个for循环,总共循环的次数是一样的。但是对于mysql数据库而言,并不是这样了,我们尽量选择第②个for循环,也就是小表驱动大表。数据库最伤神的就是跟程序链接释放,第一个建立了10000次链接,第二个建立了50次。假设链接了两次,每次做上百万次的数据集查询,查完就走,这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,这样系统就受不了了。


减少与数据库之间的连接

1.业务中出现在循环中频繁查询数据库对比数据,频繁连接数据库耗费资源。
优化方法:可以将数据取出放进list进行操作。

List<A> listA = dao.getAlist();
Map<String,Object> mapA = new HashMap<String,Object>();
//将a放进map中
for(A a : listA){
 mapA.put(a.getId(),a);
}

List<B> listB =  dao.getBlist();
Map<String, Object> A_B = new HashMap<String, Object>();
for(B b : listB){
   A a = mapA.get(b.getAId());
   //业务代码
}

2.随着业务需要,有时我们需要将数据批量添加到数据库,mybatis提供了将list集合循环添加到数据库的方法,以减少频繁连接数据库。

<insert id="insertBatch">
    INSERT INTO t_user (name, del_flag)
    VALUES
    <foreach collection ="list" item="user" separator =",">
         (#{user.name}, #{user.delFlag})
    </foreach >
</insert>

总结

本文介绍了几种常见的HTTP状态码、Mybatis的易报错场景、数据库效率的优化。以上文索引失效的场景为例,只有我们明确了什么情况下索引会失效,才不会发生我们添加了索引,不仅占用了资源,还没有生效的场景出现。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型AI技术实现语言规范练习

人工智能技术可以为语言规范练习提供多种有效的解决方案&#xff0c;帮助学习者更有效地掌握语言规范。以下是一些常见的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 智能纠错 利用自然语言处理技术&#xff0c;可以…

代码随想录-Day42

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

定制型汽车传感器在汽车中的应用

定制型汽车霍尔传感器在汽车中的应用及功能 曲轴和凸轮轴位置传感器&#xff1a; 这些传感器用于监测发动机的曲轴和凸轮轴的位置&#xff0c;帮助发动机管理系统精确控制点火时机和燃油喷射&#xff0c;提高发动机效率。 变速器控制系统&#xff1a; 在自动变速器中&#xf…

通达信短线抄底主升浪幅图指标公式源码

通达信短线抄底主升浪幅图指标公式源码&#xff1a; A1:REF(C,1); A2:SMA(MAX(C-A1,0),5,1)/SMA(ABS(C-A1),5,1)*1000; A3:BARSLAST(REF(CROSS("RSI.RSI1"(6,12,24),"RSI.RSI2"(6,12,24)),1)); A4:A2-LLV(A2,10); A5:(MA(A4,2)*3A4*13)/16; A6:IF(A5>1…

PTE-靶场训练-1

PTE-靶场训练实战笔记 靶场搭建 靶场下载链接&#xff1a; https://pan.baidu.com/s/1ce1Kk0hSYlxrUoRTnNsiKA?pwdha1x vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好后reboot重启一下即可&#xff0c;然后访问81-85端口&#xff0c;共5题。 因为靶场出了问题&a…

学生信息管理系统

DDL和DML -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CREA…

酷瓜云课堂(内网版)v1.1.5 发布,局域网在线学习+考试系统

更新内容 更新layui-v2.9.10更新docker国内镜像地址增加导入镜像构建容器的方式教师不批阅非首次考试试卷轮播图增加专栏类型目标链接增加课程能否发布检查去除初始化kindeditor语言文件去除选择题EF选项优化富文本内容显示样式优化内容图片点击放大监听优化试题题干答案等图片…

基于STM32的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现&#xff1a;实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;水质管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水质监测系统通过使用STM32嵌…

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…

Pycharm主题切换(禁用)导致UI界面显示异常解决

安装其他主题 Material Theme UI One Dark theme One Dark theme安装 (Material Theme UI主题同理) Pycharm 打开 Settings > Plugins&#xff0c;搜索One Dark theme 安装即可 One Dark theme 效果显示 问题记录 UI显示异常 安装多个主题时&#xff0c;当禁用某些主题&…

通信协议总结

IIC 基本特点 同步&#xff0c;半双工 标准100KHz&#xff0c;最高400KHz&#xff08;IIC主要应用于低速设备&#xff09; 硬件组成 需外接上拉电阻 通信过程 空闲状态 SDA和SCL都处于高电平 开始信号S和终止信号P 在数据传输过程中&#xff0c;当SCL0时&#xff0c;SDA才…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

高中数学:不等式-常见题型解题技巧

一、“1”的代换 练习 例题1 例题2 解 二、基本不等式中的“变形” 就是&#xff0c;一般情况下&#xff0c;我们在题目中&#xff0c;是不能够直接使用基本不等式进行求解的。 而是要对条件等式进行变形&#xff0c;满足基本不等式的使用条件 练习 例题1 解析 两边同…

002关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra&#xff1f; 因为和MatLab的科学计算相比&#xff0c;GeoGebra重点突出教学展示&#xff0c;对于教师、学生人群来讲再合适不过了&#xff0c;尤其是可以融入到PPT里边呈现交互式动画&#xff0c;想想听众的表情&#xff01;这不就弥补了看到PPT播放数学公…

关于ONLYOFFICE8.1版本桌面编辑器测评——AI时代的领跑者

关于作者&#xff1a;个人主页 目录 一.产品介绍 1.关于ONLYOFFICE 2.关于产品的多元化功能 二.关于产品体验方式 1.关于套件的使用网页版登录 2.关于ONLYOFFICE本地版 三.关于产品界面设计 四.关于产品文字处理器&#xff08;Document Editor&#xff09; 1.电子表格&a…

1954springboot VUE 天然气系统隐患管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE天然气系统隐患管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC 模式开发&#xff09;&#xff0c;系统具有完整的…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十九)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 29 节&#xff09; P29《28.网络连接-第三方库axios》 要想使用第三方库axios&#xff0c;需要先安装ohpm&#xff0c;因为 axios…

Jupyter Notebook 说明 和 安装教程【WIN MAC】

一、Jupyter Notebook 简介&#xff08;来源百度百科&#xff09; Jupyter Notebook&#xff08;此前被称为 Python notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行40多种编程语言。 Jupyter Notebook 的本质是一个Web应用程序&#xff0c;便于创建和共享程序文…

git基本使用(二):git分支的操作命令

Git 的多分支管理是指在同一个仓库中创建和管理多个分支&#xff0c;每个分支可以独立开发&#xff0c;互不干扰。分支是 Git 中的一种强大功能&#xff0c;允许开发人员同时在多个不同的功能、修复或实验上工作&#xff0c;而不会影响主分支或其他分支。通过多分支管理&#x…

240627_关于CNN中图像维度变化问题

240627_关于CNN中图像维度变化问题 在学习一些经典模型时&#xff0c;其中得维度变化关系总搞不太明白&#xff0c;集中学习了以下&#xff0c;在此作以梳理总结&#xff1a; 一般来说涉及到的维度变换都是四个维度&#xff0c;当batch size4&#xff0c;图像尺寸为640*640&a…