- 博客(61)
- 收藏
- 关注

原创 Spring企业开发核心框架-下
日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都如此,这种散布在各处的无关的代码被称为横切,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。但是,提前剧透,我们在实际开发中,不需要编写代理代码,我们可以使用SpringAOP框架,它会简化代理的实现!就拿日志功能来说,将其他地方也需要附加日志,那还得再声明更多个静态代理类,那就生产了大量重复代码,日志功能还是分散的,没有统一管理。1)面向切面编程思想AOP。
2024-06-30 16:09:44
905

原创 Spring企业开发核心框架-上
单一架构一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one.单一架构,项目主要应用技术框架为:Spring,SpringMVC,Mybatis等分布式架构一个项目(对应IDEA中的一个 project),拆分成很多个模块,每个模块是一个IDEA中的一个module。每一个工程都是运行在自己的Tomcat上。模块之间可以互相调用。每一个模块内部可以看成是一个单一架构的应用。
2024-06-22 16:42:31
1636
原创 HashMap为什么扩容为原来2倍呢?
由于newCap = oldCap << 1,newCap - 1 比 oldCap - 1 多一个高位1。核心原因:HashMap的所有设计都依赖于数组长度为2的幂次方这一前提。新索引 = e.hash & (newCap - 1)1则索引 = 原索引 + oldCap。
2025-04-10 21:58:15
66
原创 聚簇索引(聚集索引)、非聚簇索引、二级索引(辅助索引)、回表、联合索引(复合索引)、覆盖索引、hash索引、全文索引
在使用二级索引时,由于二级索引存储的是对应字段值和主键值,这时需要查询数据行其他数据,就必须通过主键再次查询获取完整的数据行。如果一个联合索引包含多个列,查询条件必须包含必须包含第一个列的条件,然后是第二个列,以此类推。非聚簇索引叶子节点存储的是对应的字段值和主键值,如果要访问数据行别的数据就得回表查询,一张表可以有多个非聚簇索引,适合快速查找特定列的值。聚簇索引叶子节点存储的是完整数据行,可以访问完整的数据行,每张表只能有一个聚簇索引,一般都是主键索引,适合范围查询和排序。设计,不支持范围查询。
2025-03-27 16:07:46
280
原创 MySQL中B+树索引
因此,三层 B+ 树大致能存储的数据总量为:1170 * 1170 * 16 = 21902400,一颗三层的 B+ 树在 MySQL 中可以存储大约 2000万条记录。B+树是一种自平衡树,每个叶子节点到根节点的路径长度相同,B+ 树在插入和删除节点时会进行分裂和并操作,以保证树的平衡,但它又会有一定的冗余节点。因为叶子节点通过链表链接,从根节点定位到叶子查找到范围的起点之后,只需要顺序扫描链表即可遍历后续的数据,非常高效。,确定数据落在哪个区间,从而确定分支,从上到下最终定位到叶子节点。
2025-03-27 09:48:43
392
原创 MySQL 事务隔离级别
例如,事务 A 查询所有年龄大于 20 岁的用户,得到 10 条数据,在事务 A 未结束时,事务 B 插入了一条年龄大于 20 岁的用户记录并提交,事务 A 再次执行相同的查询时,得到 11 条记录,就好像出现了“幻影”一样。比如,事务 A 第一次读取某条记录的金额为 100,在事务 A 未结束时,事务 B 将该记录的金额更新为 200 并提交,事务 A 再次读取该记录时,金额变为 200,与第一次读取的结果不同。,避免了脏读,但仍可能出现不可重复读和幻读问题。,避免了脏读、不可重复读和幻读问题。
2025-03-24 18:22:22
467
原创 MySQL事务
什么是事务事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再分割),由一个有限的数据库操作序列构成(多个DML语句,select 语句不包含事务),要么全部成功,要么全部失败。一组有限个操作的集合,要么全部成功,要么全部失败。
2025-03-24 15:44:42
245
原创 苍穹外卖新增员工
总的来说,这段代码的目的是从HTTP请求头中获取一个JWT令牌,校验其有效性,并根据校验结果决定是否放行该请求。这个方法需要两个参数:一个是密钥(用于验证令牌的签名),另一个是待校验的令牌。如果令牌是有效的,并且签名匹配,该方法将返回一个。块,用于尝试执行可能会抛出异常的代码。首先,它记录一条日志,表明开始进行JWT(JSON Web Token)的校验,并打印出待校验的令牌。,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。对象,其中包含了令牌中的声明(例如,用户的ID、角色等)。
2024-08-29 14:25:23
935
原创 MyBatis 持久层框架-上
MyBatis 是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和Java POJO 为数据库中的记录。MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。
2024-07-21 17:38:03
721
原创 SpringMVC 控制层框架-下
因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。如果张三负责的模块按照 A 方案处理异常,李四负责的模块按照 B 方案处理异常...各个模块处理异常的思路、代码、命名细节都不一样,那么就会让整个项目非常混乱。在Web 应用三层架构体系中,表述层负责接收浏览器提交的数据,业务逻辑层负责数据的处理。一个网站有 5、6个资源,其中有一个为登录资源,两个无需登录即可访问,另外三个需要登录后才能访问,如果不登录就访问那三个资源,需要拦截,并且提示登录后访问。
2024-07-20 21:56:23
2087
原创 SpringMVC 控制层框架-上
Spring Web MVC 是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework 中。在控制层框架经历Srust、WebWork、Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC 作为Java EE项目表述层开发的首选方案。Spring 家族原生产品,与IOC容器等基础设施无缝对接表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案代码清新简洁,大幅度提升开发效率。
2024-07-16 15:35:24
965
原创 maven
Maven是一款为 Java 项目构建、依赖管理的工具(软件),使用Maven可以自动构建、测试、打包和发布项目,大大提高了开发效率和质量。①依赖管理:②构建项目: ①配置maven_home ②配置path①配置本地仓库地址②配置国内阿里镜像③配置jdk17版本项目构建4、idea配置本地Maven软件
2024-06-18 19:02:44
426
原创 Java_se注解
1、作用:说明:对代码进行说明,生成doc文档☆检查:检查代码是否符合条件 例:@Override☆分析:对代码进行分析,起到了代替配置文件的作用1.定义:public @interface 注解名{2.定义属性:增强注解的作用数据类型 属性名() -> 此属性没有默认值,需要在使用注解的时候为其赋值数据类型 属性名() default 值 -> 此属性没有默认值,如果有需要,也可以二次赋值3.注解中能定义什么数据类型?a.8种基本类型。
2024-05-21 18:59:27
631
原创 Java_se反射
1、反射:是一种解剖class对象的技术2、能解剖出点啥来?a.成员变量 --> 赋值取值b.构造方法 --> new对象c.成员方法 --> 调用执行3、反射的作用:写出来的代码更灵活,通用4、反射是解剖 class 对象的,所以玩反射第一步要干嘛?获取 class 对象5、class对象:class文件对应的对象class类:描述 class 对象的类叫做 class 类。
2024-05-19 09:47:55
325
原创 Thymeleaf
概念:Thymeleaf是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 JSP、Velocity、FreeMaker等,他也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。它的主要作用是在静态页面上渲染显示动态数据。SpringBoot官方推荐使用的视图模板技术,和SpringBoot完美结合不经过服务器运算仍然可以直接查看原始数据,对前端工程师更友好
2024-05-15 20:43:51
960
原创 Tomcat
接收客户端发来的请求响应客服端请求安装配置完后,其结构:bin 命令文件存放的目录(服务器的启动和停止)conf 配置文件存放的目录(server.xml)lib tomcat运行需要的jar包logs 日志文件村存放的目录temp 临时文件。
2024-05-12 17:00:15
818
原创 JDBC技术-1
通俗点说,在Java代码中,使用JDBC提供的方法,可以发送字符串类型的SQL语句到数据库管理软件(Mysql,Oracle等),并且获取语句执行结果!进而实现数据库数据CRUD操作的技术!
2024-05-09 15:37:25
904
1
原创 前端HTML
html>内容语法:通过标签的形式展示。①超文本 图片、音频、视频、普通文本。标签可以嵌套但不能交叉嵌套。无论是双标签还是单标签都必须正确关闭。跟标签(html)有且只能有一个。-- 注释内容 --!标签不区分大小写但建议使用小写。①新建网页文件(后缀为.html的文件)③通过开发工具IDEA。②创建网页的基本结构。
2024-05-06 20:12:35
509
1
原创 XML解析
XML是可扩展标记语言(Extensible Markup Language)可扩展:标签并不止一套(可以扩展)web.xml 有一套标签 servlet servlet-name servlet-class ...约束:由组织去定义,看约束文件如何规定用途异步系统之间进行数据传输的媒介(json代替)配置文件。
2024-05-04 17:31:37
274
原创 初识Servlet
引入Servlet:问题,浏览器可以通过http协议请求web服务器,访问web服务器上的web资源,web资源又分为静态资源和动态资源,静态资源可以直接存储在web服务器上供浏览器访问,动态资源该如何访问呢?Servlet是服务器端的java程序、能够接收HTTP请求、处理HTTP请求、并对HTTP请求进行响应的动态网页技术。Servlet是javaEE(javaWeb)规范的一个重要组成部分。Servlet的作用:接收客户端的HTTP请求(浏览器)根据用户请求进行数据处理。
2024-01-02 10:34:39
442
原创 初识HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)(浏览器---->web服务器)TCP协议,基于连接的安全传输协议(客服端和服务器先建立连接,再通过连接发送数据)UDP协议,基于广播/分发的非安全传输协议(不建立网络连接)HTTP超文本传输协议是运行于TCP协议的基础之上、基于请求与响应模式、无状态的应用层协议,是互联网中应用最为广泛的一种协议。
2024-01-01 21:12:15
1173
原创 初识Web服务器
web服务器就是web项目的容器,我们将开发好的web项目部署到web容器中,才能使用网络中的用户通过浏览器进行访问。一张图带你了解web服务器有啥作用:在我的电脑上有一个已经做好的项目,但是只能我自己访问别人的计算机是访问不到的。这时我们就得把项目放到web服务器上面,当访问者输入地址就能被访问到了,并响应数据给客户端。
2023-12-31 22:03:06
1825
原创 初识javaWeb
javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。①Java ME 嵌入式应用程序(老款手机的游戏——贪吃蛇)②Java SE 窗体应用程序(下载--安装--双击打开)⑤Java EE 企业级项目开发(Web项目)-Web前端——在浏览器中用户可以看到的网页。④HarmonyOS SDK 移动应用开发。③Android SDK 移动应用开发。Web项目——使用浏览器访问的软件系统。-Web后端——为前端提供数据的程序。
2023-12-30 11:32:37
880
原创 java并发3之停止线程
所以当再次运行到while时,由于中断的效果已经被清除,检查不到任何被中断的迹象。其实,想要停止线程就是用interrupt来通知那个线程,以及被通知的那个线程如何配合。恢复中断的方式也就是在catch子语句中调用Thread.currentThread().interrupt() 来恢复设置中断状态。在这个throwInMethod()方法,它是低层次的相对run()方法,在检测到异常时,抛出异常,这时这个异常就会被吞掉。让run()方法(更高级的函数)去处理这个异常,就不会导致这个异常被吞掉。
2023-08-20 23:12:49
107
原创 977. 有序数组的平方
①在一个非递减顺序排序的数组中,考虑到负数和正数,所以平方的最大值要么在数组的最左边,和最右边。创建一个一样大小的新数组。②一个指针指着数组的最左边,另一个指针指向数组的最右边,在循环里,比较两指针的数的平法,谁大就放在新数组的右端。解释:平方后,数组变为 [16,1,0,9,100]输入:nums = [-4,-1,0,3,10]输入:nums = [-7,-3,2,3,11]排序后,数组变为 [0,1,9,16,100]输出:[0,1,9,16,100]输出:[4,9,9,49,121]
2023-07-23 16:11:14
91
原创 java并发2之启动线程
run()方法的执行线程是主线程。要启动线程,要调用start()来间接调用run()方法。调用start()方法,将通知JVM在有空余时间时候创建新线程,调用start()方法的顺序并不能决定执行线程的顺序。既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?不能重复调用start()方法,在每次启动旧的线程之前,都应该检查线程状态。源码:1)启动新线程检查线程状态,加入线程组,调用start0()。1、start()和run()方法的比较。
2023-07-20 14:36:04
98
原创 704.二分查找、27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。二分查找思想:在一有限个且有序的数列中,将要查找的数与该数列的中值比较,若大于中值则目标数在数列的右半段,再取右半段的中值再与目标数比较,一直循环下去,最终会找到目标数的位置。运用暴力,直接遍历数组,若nums[i] == val,则将val后面的所有值都往前移一位。=val的值赋给慢指针所指的数组位置。
2023-07-03 23:06:44
68
原创 java并发1之实现多线程
②从资源节约的角度:每次我们新建一个任务,我都得新建一个独立的线程,而新建一个独立的线程的损耗是比较大的。如果我们使用Runnable,就可以使用后续的线程池工具,而这些工具大大减小创建线程和销毁线程带来的损耗。①从代码的架构角度:具体执行的这个任务也就是run方法应该和我们线程的创建机制,也就是Thread类,它应该是解耦的。③从继承的角度:java不支持多继承,继承了Thread类,就不能继承别的类了,大大的削减了程序的扩展性。继承Thread类:run()方法整个被重写。一、启动线程的两种方式。
2023-07-01 20:58:40
94
原创 LeetCode:704.二分查找
注:①while(letf < right),这里使用“ < ” 是因为left 与 right 相同的情况在[ left , right )区间是没有意义的 ②如果nums [ mid ] 大于target ,则更新搜索范围有下标right 为mid ,因为当前nums[ mid ] 不等于 target ,那么去左区间继续寻找,而寻找的区间是左闭右开区间,所以 right 更新为mid,即在下一个查询区间不会比较 nums[ mid ]。,如果目标值存在返回下标,否则返回。
2023-06-28 23:50:37
116
原创 java-多线程基础1
什么是进程:我们可以任意正在执行的app看成一个进程,进程是操作系统中资源分分配调度的基本单位,进程是拥有自己的地址空间的,进程中至少有一条线程,线程共享着进程的地址空间,可以把进程看成线程的容器。时间分片是指操作系统将CPU时间分为多个时间片,每个时间片分配给一个任务使用,任务在时间片结束前执行完毕或自行放弃CPU的使用,然后CPU将时间片分配给下一个任务。什么是线程:是指在java程序中同时执行多个任务的机制,每个线程都是独立的执行路径,可以同时执行不同的任务或者处理不同的数据。一、进程和线程的关系。
2023-03-26 14:21:59
81
原创 java-小游戏之计时任务、双缓冲绘图和移动背景设置
我们所看到的图像是由显示缓冲区和显示器共同完成的,两者是一起的,显示器只负责从显示缓冲区取数据显示。双缓冲原理:我们创建一个自定义缓冲区,将要画的图像先前存入该缓冲区,再将这个自定义缓冲区的数据传入显示缓冲区,这样就避免了你还没绘制完图片,显示器就从显示缓冲区取数据显示图形。不使用双缓冲我们会在窗体看到闪烁,这是因为程序还没来得及运行,显示器就将还没画好图形显示在显示器上了,你所看到的效果可能是一部分一部分地显示出来,造成闪烁。我们的窗体大小是900*900的,m为移动的像素点。我们为啥要用双缓冲绘图呢?
2023-03-14 18:23:25
377
原创 小球乱撞游戏
顾名思义,就是获取你需要操作的对象将它“聚焦”,例如:平时你在登陆qq界面时,有个账号输入框和密码输入框,假如你先鼠标点击了电脑桌面的app,这时聚焦点不在qq账号输入框那,你需要用鼠标点击一下(聚焦一下),才能输入。在小球类中,我们实现了小球撞墙反弹功能,在这里我们有设置小球speedX,speedY的关于x,y轴上的速度,只要当球碰撞到边界时,把速度修改为负的就好了。④我们实现小球添加是通过创建一个动态数组,点击一下“添加”就新建一个小球对象,后面画的时候再遍历它。1、用一个线程控制所有的小球对象。
2023-03-09 19:06:22
219
原创 java-再习多线程
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中不可缺少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。由于某种原因线程放弃CPU执行权,暂停自己的执行。
2023-03-05 09:24:22
66
原创 java单链表实现一个ListMap
思路:我们在写增逻辑时,其实是将增改放在一起的,我们先判断传入的key值是否为空,是否存在ListMap中,若存在就将原有的key节点修改val值,并将原来的val值返回,若不存在LsitMap中,咋们就创建一个节点接在头节点head后面(在链表里添加元素模块,我们必须找到前驱节点,head最好找到),最后将size++,别忘记了。思路:我们创建链表节点去实现Map.Entry接口,这个接口是标准库里的,你只要实现这里面的方法就可以称之为Map.主要就是存储键值对,即K,V。
2023-02-16 20:58:52
221
原创 java多线程之流水线工厂模式
在主函数里我们创建一个队列来储存任务,并将任务传到每一个线程里来完成加工操作,然后调用start方法开起线程,再调用join方法等待所有线程都完成之后将每个成品打印出来。当第一个产品到第一个工作间用时1个单位时间,再接着进入第二个工作间依次下去,就当第一个产品完成第一个工作间任务时,第二个进入一个工作间。当我们需要对一个产品进行多次不同的操作时,比如我们要对一个队列List 进行加工,先将List传入T1工作间,加工完后,再传入T2、T3进行加工,最后得到成品。这时我们就用到流水线工厂模式进行加工。
2023-02-09 18:59:51
611
原创 java多线程之线程安全问题
操作系统中线程的调度是抢占式执行的,或者说是随机的,这就造成线程调度执行时线程的执行顺序是不确定的,有一些代码执行顺序不同不影响程序运行的结果,但也有一些代码执行顺序发生改变了重写的运行结果会受影响,这就造成程序会出现bug,对于多线程并发时会使程序出现bug的代码称作线程不安全的代码,这就是线程安全问题。~弊:当线程很多时,因为每个线程都会去判断同步上的锁,这是很浪费资源的,无行中会降低程序的运行效率。默认情况是打开的,只要有一个线程进去执行代码了,锁就会关闭,当线程执行玩了出来了,锁才会自动打开。
2023-02-08 18:28:05
282
原创 java数组/链表实现栈和队列
栈(stack) 是限定仅在表尾进行插入或删除操作和线性表(只有一端口能进出数据),对栈来说表尾和表头有特殊含义,表尾被称为栈顶,表头被称为栈底,没有元素的空表称为空栈,元素数量达到栈的容量称为满栈,数据添加到栈中叫入栈、压栈,数据从栈中删除叫出栈、弹栈,由于栈元素特殊添加和删除的规则,所以栈的元素会先进后出的现象,简称为LIFO(Last in first out)。入栈的思路就是先将栈顶指针向上移一位,再直接赋值,前提需判断该栈是否满,当然栈满了,是不允许再进栈的。链表——实现队列:(双链表)
2023-02-07 15:03:52
614
原创 多线程——飞机大战
2、接下来我们先设置飞机类,想想你的飞机有啥属性,有啥方法,首先你会想到你飞机得动吧,动的时候还得有速度吧,你的飞机有多大呢,你的飞机是怎么一个飞机(战斗机、直升机),最后可能后续才考虑到:该飞机是否还存活,换句话来说就是说这架飞机被子弹击落了没。飞机移动的,发出移动的子弹其原理就是先前设置好飞机运动规则,然后计算出其属性,再将这些计算出来的属性存入队列中,在线程每大约30ms(自己可以设置)(相当于帧)遍历一次,也就是把那个时间点的图片画出来。
2023-02-05 20:21:10
409
原创 java实现链表
由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。4、我们在写一个数据结构时无非就是 增、删、查、改,还有一些像获取长度,判断是否为空的功能函数,我们在这添加两个检查索引是否越界函数。5、在链表中访问一个index 位置的节点值会很困难,必须遍历链表,我们将或取index位置的节点设置一个函数。3、设置头、尾节点和长度变量。
2023-02-05 15:49:15
890
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人