自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 收藏
  • 关注

原创 redis--黑马点评--用户签到模块详解

我们按照月来统计用户签到信息,签到记录为1,未签到记录为0,这样我们只需要最多31bit就可以表示一个用户一个月的签到情况,非常节省空间,这种做法的核心思想就是把每一个比特位对应当月的每一天,形成了映射关系,用0和1表示业务状态。在请求解析中,我们发现请求参数与返回值都为空,这是因为我们签到所需的用户以及当天日期都可以在后端直接获取,因此不需要前端传参,也不需要返回值,但如果是补签功能的话,就需要前端传递日期参数了。方法2:从最后一个比特位开始遍历,并定义一个计数器,为1则加一,为0则终止。

2025-08-07 21:28:10 1165

原创 redis--黑马点评--附近商户搜索功能详解

在微信中有附近的人的功能,在外卖软件中就会有附近商户的功能,打车软件中会有附近的车的功能等等,这些功能的底层都是基于地理坐标进行搜索,支持地理坐标的技术很多,redis就是其中之一,在这里主要学习基于Redis实现地理坐标的搜索功能。实现思路:前端发送请求,请求中的typeID到数据库中过滤,找到对应的店铺,做分页返回前端,而将商户id与经纬度使用GEO数据结构存入redis中,将来在收到请求时就按照经纬度来筛选,得到商户id,在拿id来数据库查询商户具体信息。

2025-08-06 15:48:32 689

原创 springboot --大事件--文章管理接口开发

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验,(自定义校验注解)实现步骤自定义注解state自定义校验数据的State Validation实现ConstraintValidator接口在需要校验的地方使用自定义注解代码展示:@State​​​//在属性上生效//在运行时阶段保留// 自定义注解 提供校验规则//提供校验失败后的提示信息String message() default "文章状态只能是:已发布或者草稿";//指定分组。

2025-07-20 17:46:13 858

原创 Redis--黑马点评--好友关注功能实现

举例说明:为每个博主准备一个发件箱,发送消息到邮箱,消息需要带上时间戳,timeline的核心是按时间排序,因此需要带上时间戳,其他人在发消息时,时间戳就会递增,而为粉丝准备一个收件箱,收件箱平时是空的,只有粉丝要去读消息的时候,才会给他拉取,首先先查看粉丝关注的博主,就将其关注的所有人的发件箱的消息拉到他的收件箱里,再做时间上的排序。想要做到共同关注,就需要在关注接口上,将当前用户关注的用户id保存到Redis的set数据结构中,目标用户关注的用户id也需要将其保存到redis中。

2025-07-20 17:39:25 970

原创 Redis--黑马点评--达人探店功能实现详解

需要注意的是发布照片与发布笔记是两个分离的功能,因为上传照片的功能不仅仅是发笔记有这个需求,在其他业务中可能也会需要发布照片,因此上传照片功能是一个独立功能,点击上传照片时会先发出一个请求实现上传,上传成功后返回这张图片的地址,也就是上传之后的可访问的地址,这个地址就会做为表单的参数,在发布笔记时一起提交到后台,即在发布笔记时上传的其实不是照片的本身,而是上传成功后的图片地址,因此发布照片和发布笔记是不同的功能,会发起两个不同的请求。

2025-07-05 18:13:38 834 2

原创 Redis--黑马点评--基于stream消息队列的秒杀优化业务详解

在进行下一次读取,继续循环,如果在处理消息的过程抛出异常,导致该消息没有确认,那么该消息就会进入pending-list,就被catch到,在catch中执行handlePendinglist()函数,在该函数中,首先去pending-list获取未确认消息,如果读到,则解析消息,处理,下单,ack确认,如果没有异常消息,就会直接跳出循环,异常处理结束,如果再抛异常,就再度循环。项目启动后,开启一个线程任务,尝试获取stream.orders中的消息,完成下单。至此优化秒杀下单的业务需求完成。

2025-07-05 18:13:33 505

原创 Redis--黑马点评--消息队列

因此如果要在redis的三种消息队列中选择的话,肯定是用stream模式,但是如果业务较为庞大,对于消息队列的要求更加严格,还是选要使用更加专业的消息队列比如RabbitMQ等,因为stream虽然支持消息的持久化,但这种持久化是依赖于Redis本身持久化的,Redis的持久化也可能会出现问题,而且消息确认机制只支持消费者的确认机制,不支持生产者确认机制,另外消息的事务机制,再多消费者下的消息有序性等等,还是有很多问题的,还是需要更加强大的消息队列去支持,但如果对消息队列要求不高,还是可以使用的。

2025-06-29 23:08:18 850

原创 Redis--黑马点评--秒杀优化

我们为了解决优惠卷秒杀的问题添加了各种锁,这就会导致秒杀业务的性能降低,因此需要去优化秒杀业务,进一步提高性能。首先回顾一下业务流程:前端发起请求到达Nginx服务器,Nginx会将请求负载均衡到Tomcat,在通Tomat内部,首先会查询优惠券个数,去做库存的判断,如果库存没有问题就去查询订单,校验一人一单,如果还没有问题,就去扣减库存,创建订单。

2025-06-29 17:16:58 802

原创 redis--分布式锁详解

redisson分布式锁原理:可重入:利用hash结构记录线程id和重入次数,当线程获取锁失败后去判断锁包含的线程id是否一致,如果一致,则让其获取锁,并且重入次数加一。在释放锁时,先去判断锁中的线程ID,再去判断重入次数是否为0,如果为0,则释放,不为0,则无视可重试:利用信号量和pubsub功能实现等待、唤醒、获取锁失败的重试机制。在第一次获取锁失败以后,并不是直接返回false,尝试获取锁的返回结果就是ttl(剩余有效时间),如果返回值为null。则获取锁成功,若不为null,则获取锁失败,

2025-06-26 22:23:49 1044

原创 操作系统期末复习--处理机调度与进程同步

写出完整的过程,说明信号量的含义并赋初值。作者与任意进程都是互斥的,读者与读者同步,和作者互斥,因此需要设置计数器,用他来判断当前是否有读者读文件,当有读者读文件时,作者无法写文件,读者一直占用文件,当没有毒这时,作者才可以写文件,同时,读者对计数器的访问也应该是互斥的。当没有进程在临界区时,任意一个进程要进入临界区,就要执行P操作,把S的值减为0,然后进入临界区,当有进程进入临界区时,S的值为0,再有进程要进入临界区,执行P操作就会阻塞,直至在临界区的进程退出,这样就实现了临界区的互斥。

2025-06-20 15:22:02 760

原创 操作系统期末复习--操作系统初识以及进程与线程

进程是程序一次执行的过程。进程是具有独立功能的程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位引入进程后,进程是资源分配的独立单位,进程具有并发性,可以和其他进程并发执行同一个程序执行在不同的数据集合上,属于不同的进程进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

2025-06-18 22:51:13 816

原创 操作系统期末速成--大题解析

系统运行有三个进程:输入进程、计算进程和打印进程,他们协同完成工作。在第0个时刻,A B C D进程同时到达,对比四个线程之间的运行时间,根据运行时间的长短决定执行顺序,A C 的服务时间是一致的,这时即可以选择调度A,也可以选择调度C,在选择调度 D,进程D执行完后到第10个时刻,进程E已经到达,这时在对比 B,E 进程,根据运行时间执行E,最后执行 B.在一个请求分页系统中,有一个长度为5页的进程,假如系统为他分配3个物理块,并且此进程的页面走向为2,3,2,1,5,2,4,5,3,2,5,2。

2025-06-17 16:00:21 1155

原创 Docker -- 快速入门

在docker客户端输入命令,docker daemon的守护进程会监听该命令,再去对应的镜像仓库去拉去镜像,下载到本地运行,运行时会为镜像区创建一个隔离的环境称之为容器,多个容器之间相互隔离,可以进行多实例部署,形成集群,相互之间没有干扰,也可以在一个服务上去部署多个不同应用的实例,不需要担心相互干扰的问题,搭建集群部署整个复杂的微服务应用非常方便。比如部署MySQL容器,MySQL启动端口为3306,但是容器是隔离环境,有自己独立的内存空间,有自己独立的文件系统,也有自己独立的网络空间。

2025-06-15 22:39:37 1262

原创 redisson锁的可重入、可重试、超时续约原理详解

redisson分布式锁原理:可重入:利用hash结构记录线程id和重入次数,当线程获取锁失败后去判断锁包含的线程id是否一致,如果一致,则让其获取锁,并且重入次数加一。在释放锁时,先去判断锁中的线程ID,再去判断重入次数是否为0,如果为0,则释放,不为0,则无视可重试:利用信号量和pubsub功能实现等待、唤醒、获取锁失败的重试机制。在第一次获取锁失败以后,并不是直接返回false,尝试获取锁的返回结果就是ttl(剩余有效时间),如果返回值为null。则获取锁成功,若不为null,则获取锁失败,

2025-06-11 21:33:22 1744

原创 redis--黑马点评--Redisson快速入门

同一个线程无法获取同一把锁可重入就是指同一个线程可以多次获取同一把锁。举例说明:方法a调用方法b,在方法a重要先获取锁,然后执行业务,去调用方法b,然后方法b也需要获取同一把锁,在这种情况下,如果锁是不可重入的,方法a中获取锁之后,方法b就无法获取锁,只能等待方法a中锁的释放,但锁无法释放,因为方法a的业务没有完成,于是就会出现死锁的情况。在这种场景下,我们要求的锁是可重入锁。:获取锁只尝试一次就返回false,没有重试机制。

2025-06-09 22:39:36 1640

原创 redis--黑马点评--分布式锁实现详解

假设有两个JVM,JVM1中的线程A,来获取锁,就需要去寻找外部的锁监视器,一旦获取成功,就回去记录当前获取锁的是这个线程A,在高并发情况下,此时如果有其他线程也来获取锁,比如JVM2线程中的线程C,但因为外部的锁监视器中已经记录锁的持有者了,因此线程C获取锁失败,则需要等待锁释放,当线程A释放锁成功后,线程C来获取锁,之后执行自己的业务。线程开启,尝试获取锁,执行命令,结果有两种,OK,NIL,NIL代表失败,证明锁已经被获取,OK代表获取互斥锁成功,则执行业务,业务执行完之后,释放锁。

2025-06-08 23:22:58 1013

原创 黑马点评--优惠券限购接口实现详解

而现在是在方法内部加的锁,就有一个问题:比如方法开启事务,开始执行,获得锁之后,开始做查询,查询完之后减库存,提交订单,然后需要先释放锁,才能提交事务,因为事务被spring容器管理,所以事物的提交是在我们函数执行完以后,由spring做的提交,而在高并发情况下,在锁释放时,可能就已经有线程进行访问了,而此时由于事务尚未提交,如果有别的线程来查询订单,那我们刚新增的订单可能还没有写入数据库,因为没有提交事务,就有可能出现并发安全问题。这样一来,只要拿到的用户ID值一样,那么返回的结果永远一样。

2025-06-07 16:06:16 949

原创 redis--黑马点评--优惠券下单接口实现及超卖问题解决

假如现在只剩下一个商品,但在高并发情况下,假如说有两个线程,正常情况下,线程是按顺序执行的,这样两个线程按顺序执行,就不会出现超卖问题,但是在高并发请况下,线程并不按照顺序执行,可能会交叉执行,就会出现两个线程都会读到数据库中的库存还为一,因此两个库存一起扣减库存,于是库存变为了-1,就造成了超卖问题,,其实就是多线程并发安全问题。例如,线程A先去查询库存,在进行判断,最后在进行扣减时,在进行一次对库存的判断,要求查询到的库存需要和开始查询到的库存保持一致即可。不满足则回滚,其他线程同上。

2025-06-06 17:49:05 1334

原创 redis--黑马点评--全局ID生成器详解

订单的特点就是数据量比较大,因为用户只要产生购买的行为,就会不停的产生新的订单,如果项目有一定的规模,用户量达到数百万,每天的订单可能就高达数百万,日积月累,单张表显然不能保存如此多的数据,如果无法保存,就需要分到多张表中,如果每张表都采用自增长,每张表都自增,那么订单的id就一定会重复,而订单就不应该重复,因为从业务的角度来考虑,将来一些售后服务还需要订单id,如果id重复,将来一定会出问题。生成时间戳:时间戳是一个31位的数字,单位为秒,需要一个基础的日期作为开始时间,再拿当前时间减去开始时间。

2025-06-05 17:18:58 1199

原创 springboot--实战--大事件--文章分类接口开发详解

当用户点击左侧的文章分类时,会在页面主区域展示文章分类相关的内容,在页面的右上角有一个添加分类的按钮,点击之后会出现弹窗,用户需要输入分类名称及别名,如果输入校验无错后,最终访问后台接口,完成分类的添加。在文章分类列表中点击编辑按钮,弹出弹窗,在弹窗中需要展示被点击这个分类的详细信息,用户在原有信息的基础上进行修改,要想展示被点击分类的详细信息,就需要去调用获取文章分类详细信息的接口,拿到数据之后展示。把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项。

2025-06-04 22:04:00 1067 1

原创 MybatisPlus--核心功能--service接口

这样我们就达到了白嫖的目的。注意事项:在编译简单接口时可以直接在controller层调用MyBatisPlus提供的Iservice接口方法实现,但是遇到一些业务逻辑复杂的业务时,需要编写自定义的业务逻辑时,就需要自定义service方法编写业务逻辑了,当我们的业务需要去编写自定义的SQL语句时,我们还需要去自定义方法,在mapper层实现方法。在这里结束后会有并发线程安全问题,如果有多个线程同时访问,两个用户,两条线程,都来进行对比,最后减去相同的数据,这样就会导致两条线程中只会被减去一个线程。

2025-06-03 22:18:12 2964

原创 MyBatisPlus--条件构造器及自定义SQL详解

自定义SQL并不是亲自去写SQL语句,而是利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL语句剩下的部分。即在SQL语句中,用Wrapper来做SQL语句的where部分,剩下的自己来写,也就是说,以前使用MyBatisPlus的时候,所有的SQL语句都是由MyBatisPlus来生成,等于是全自动,现在是只有Where部分由MyBatisPlus生成,相当于半自动。那为什么要这么去做?根据案例分析:案例:自定义SQL。

2025-06-02 22:21:09 1885

原创 Redis--缓存工具封装

经过前面的学习,发现缓存中的问题,无论是缓存穿透,缓存雪崩,还是缓存击穿,这些问题的解决方案业务代码逻辑都很复杂,我们也不应该每次都来重写这些逻辑,我们可以将其封装成工具。而在封装的时候,也会有不少的问题需要去解决。案例学习:缓存工具封装基于StringRedisTemplate封装一个缓存工具类,满足下列需求:方法一:将任意Java对象序列化成JSON并存储在String类型的key中,并且可以设置TTL过期时间。

2025-05-31 15:15:00 1294

原创 MyBatisPlus--快速入门

从名字中就可以感觉到MybatisPlus与MyBatis之间的渊源,而MyBatis是一个非常流行的持久层框架,主要来做数据库的增删改查,而MyBatisPlus这种命名方式让人不得不往MyBatis的升级版去联想,事实也确实如此,MyBatisPlus就是对MyBatis框架的增强与升级,但MyBatisPlus并不是来替代MyBatis的,MyBatisPlus的官网logo是一只蓝色的小鸟,MyBatis官网的logo是一只红色的小鸟,并且在MyBatisPlus官网下的标语就是。

2025-05-30 23:00:11 2706

原创 Redis--缓存击穿详解及解决方案

可以认为是永不过期,即当下往Redis中存储数据时,不设置过期时间,而是在设置value时添加一个expire字段(在当前时间基础加上一个过期时间),该字段的意义在于提醒我们何时销毁该key,即在逻辑意义上维护的过期时间,而该key在redis中没有过期时间,再加上在redis配置的合适的内存淘汰策略,只要该key写入redis,就一定可以查到,不会出现缓存未命中的情况。命令的效果与之相近,当该key不存在的时候存入,如果存在就不存入,这就是一种互斥效果,在大量线程并发访问时,只有一条线程可以成功。

2025-05-29 19:39:02 1806

原创 Redis--缓存穿透与缓存雪崩详解及解决方案

利用Redis集群提高服务的可用性(针对redis服务宕机):为了尽可能的避免Redis的宕机,就要提高整个Redis的高可用性,想要提高Redis的高可用性,就必须借助于redis的集群,(redis的哨兵机制,可以实现对服务的监控),先搭建Redis集群形成主从,如果其中有一个机器宕机比如主机器宕机,哨兵会自动地从从机中选出一个替代原来的主,这样就可以保证redis一直能够正常对外提供服务,主从还可以实现数据同步,也不会导致数据的丢失,这样就可以在很大程度上保证Redis的高可用性。

2025-05-28 17:30:56 1142

原创 springboot--实战--大事件--用户接口开发

定义了一种简洁的、自包含的格式,用于通信双方以JSON数据格式安全的传输信息。组成:第一部分:Header(头),记录令牌类型、签名算法等。例如,算法用于防篡改第二部分:Payload(有效载荷),携带一些自定义信息,默认信息。例如。而外在表示为一段无规律的64个可打印字符原因:借助base64编码方式(Base64:是一种基于64个可打印字符(A-Z a-z 0-9 + /)来表示二进制数据的编码方式)来完成,将json字符串变为64个可打印字符,

2025-05-27 20:12:36 2770

原创 黑马点评--缓存更新策略及案例实现

缓存就是数据交换的缓冲区(称为Cache),是存储数据的临时地方,一般读写性能较高。比如在计算机中分为CPU,内存以及磁盘,CPU的运算能力非常强,已经远远超过了内存与磁盘的读写能力,但是CPU需要先从内存或者磁盘读到数据,放在寄存器里才可以运算,因为数据读写德恩能够力远远低于CPU的运算能力,所以计算机性能受到了限制,为了解决此问题,就在CPU内部添加了缓存,CPU将经常需要读写的一些数据放在缓存中,就不需要从内存或者磁盘中去拿。这样就可以从分的发挥CPU的运算能力。

2025-05-26 15:26:41 1268

原创 黑马点评--基于Redis实现共享session登录

在原有拦截器的基础上再加上一个拦截器,这样用户请求就要先经过第一个拦截器,在经过第二个,第一个拦截器拦截全部路径,所有请求都会被拦截,就可以在这个拦截器中做刷新token有效期的业务(获取token,查询Redis用户,保存到ThreadLocal中,刷新token有效期,放行),第一个拦截器不做拦截,这样就可以确保一切请求都可以触发刷新的动作,第二个拦截器只需要做拦截业务(查询ThreadLocal的用户,不存在则拦截,存在,则继续)即可。问题太多,该方案就被pass了。

2025-05-24 21:13:04 1701

原创 黑马点评--短信登录实现

ThreadLocal就可以解决该问题,ThreadLocal是一个线程域对象,每一个进入Tomcat的请求都是一个独立的线程,而ThreadLocal的核心作用就是让每一个线程都有自己的数据副本,避免共享资源引发的竞态条件,这样就可以让每一个线程都有对应的独立内存空间取保存对应用户,线程之间互不干扰,因此无论几条请求访问哪些Controller都可以做到独立线程,都有自己的独立用户信息,当需要用户信息时,则Controller从ThreadLocal中取出用户即可。是一种前后端分离的架构。

2025-05-23 23:10:30 1430

原创 Redis--SpringDataRedis详解

如果不存储该字节码数据,RedisTemplate的自动序列化和反序列化就会失败,序列化时还可以,直接将对象里面的key与value存储进就好,但是反序列化需要知道json字符串要转成哪个类型的对象,如果不存储class类型的字节码数据,就无法识别到,就无法实现自动的反序列化。如果想要节省内存空间,就不能能去使用JSON序列化器来处理value,二是统一使用String序列化器,要求只能存储String类型的key或者value,当需要存储Java对象时,手动完成对象的序列化与反序列化。

2025-05-22 14:13:55 1507

原创 redis--redisJava客户端:Jedis详解

在Redis官网中提供了各种语言的客户端,地址:以Redis命令做方法名称,学习成本低,简单实用,但是对于Jedis实例是线程不安全的(即创建一个Jedis实例,多线程并发运行时会有线程安全问题,在多线程使用时,必须为每一个线程创建独立的Jedis连接,就是必须要使用连接池的方式来配合使用。)多线程环境下需要基于连接池来使用。Lettuce是基于Netty实现的,支持同步、异步、和响应式编程方式,并且是线程安全的,支持Redis的哨兵模式、集群模式、和管道模式。

2025-05-21 20:21:04 1428

原创 Redis--Redis命令详解

类型示例StringHashListSet{A,B,C}SortedSetGEO(地理坐标(经纬度))BitMap(按位)HyperLog(按位)常用的类型为前五个,后三个则为特殊类型。Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网(

2025-05-20 16:26:02 1084

原创 springboot--自定义starter

在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用,而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的 starter。如何来自定义starter,其实就是依葫芦画瓢,照着其他的starter来就行,以下以MyBatis的starter为例一般起步依赖有两个工程组成我们会在starter中引入autoconfigure,别人使用只需要引入starter即可。

2025-05-18 10:00:00 962

原创 SpringBoot--自动配置原理详解

为什么要学习自动配置原理?原因:在实际开发中,我们经常会定义一些公共的组件,提供各个团队来使用,为了使用方便,我们经常会将公共的组件自定义成starter,如果想自定义starter,必须来了解自动配置原理。遵循约定大于配置的原则,在springboot程序启动后,起步依赖中的一些bean对象会自动注入到IOC容器中。这时就需要去springboot中的源码中解析了。源码分析:程序中引入spring-boot-starter-web起步依赖后,启动就会自动往IOC容器中注入DispatcherServlet

2025-05-17 15:50:48 1350

原创 SpringBoot--Bean管理详解

注解检测不到属性,则不将User对象注入到IOC容器中,又 @ConditionalOnMissingBean(User.class) 注解检测到User对象在IOC容器中不存在,则将employee对象注入IOC容器。当我们的配置类不在启动类的包名下时,启动类是无法扫描到我们的配置类的,我们可以在启动类上添加@Import(配置类的字节码文件),这样就spring就会把配置类文件中对应的Bean对象注入到IOC容器中。注意事项:在实际开发中,数组的内容一般不会写死,,基本上都是从配置文件中读取出来的。

2025-05-16 23:30:52 1218

原创 Synchronized详解及高频面试问答

想要了解Synchronized,需要先了解Java内存模型将内存分为两种,和并且规定,所有的变量都存储在主内存中(不包括局部变量与方法参数)。主内存中的变量是所有线程共享的。每个线程都有自己的工作内存,存储的是即线程对变量的所有操作都必须在中进行,而不能直接读写主内存中的变量。不同线程间无法直接访问对方工作内存中的变量。线程间变量值的传递需要通过主内存实现。是为了屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。

2025-05-15 17:17:27 1125 1

原创 SpringBoot--springboot配置文件详解以及简易整合MyBatis

YAML,全称是(YAML不是一种标记语言)。虽然名字带着“叛逆”色彩,但它确实是一种非常实用的数据序列化格式。简单地说,它是用来让程序和人类交流的一种方式,常用于配置文件和数据交换。以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml<server></server>server:prot: 8080。

2025-05-14 15:45:08 1495

原创 SpringBoot--springboot简述及快速入门

spring Boot是spring提供的一个,用于快速构建spring应用程序传统方式:在众多子项目中,spring framework项目为核心子项目,提供了核心的功能,其他的子项目都需要依赖于spring framework,在我们实际开发中,我们可以根据不同的业务需求来选择不同的子项目,通过spring framework子项目把他们整合起来,从而构建一个spring应用程序。

2025-05-13 17:08:25 1315

原创 MySQL--视图详解

案例需求:为了保证数据库表的安全性,开发人员在操作user表时,只能看到用户的基本字段,屏蔽手机号和邮箱两个字段查询每个学生所选修的课程(三张表联查),这个功能很多业务都会用到,为了简化操作,定义一个视图。-- ======综合案例=====

2025-05-12 13:57:25 1230

springboot员工管理系统项目静态资源

springboot员工管理系统项目静态资源

2025-04-10

SSM回顾思维导图,用于理清楚学习的思路

SSM回顾思维导图,用于理清楚学习的思路

2025-04-09

JavaSE流程图 较为详细的学习流程

JavaSE流程图 较为详细的学习流程

2025-03-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除