![](https://img-blog.csdnimg.cn/5206be00780f47e0bb9a414e568490b6.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java教程
文章平均质量分 72
java小白翻身-实践项目,大部分都是springboot项目,提供答疑服务。随着教程的增多会慢慢涨价。
剽悍一小兔
up主是一位java司机,《JavaScript百炼成仙》作者,喜欢撸代码。
展开
-
面试官:MySQL也可以实现分布式锁吗?
首先说结论,可以做,但不推荐做。我们并不推荐使用数据库实现分布式锁。如果非要这么做,实现大概有两种。原创 2024-06-12 06:42:08 · 934 阅读 · 0 评论 -
Java泛型中的T、E、K、V、?通配符,你确定都了解吗?
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。原创 2023-06-19 13:27:42 · 380 阅读 · 0 评论 -
SQL调优:让Java内存分担计算
我们在工作中,经常会因为一条慢sql调半天。这一节,我给大家介绍一种提升查询效率的思路,那就是让Java内存帮我们分担一些运算。案例还是采用 springBoot日记本系统,源码下载地址和教程在文末。原创 2023-06-13 10:07:46 · 782 阅读 · 4 评论 -
面向过程 VS 面向对象
学习编程, 基本功是掌握编程语言,但编程的本质是逻辑,所以编程思维的培养也很重要。面向过程和面向对象是两种重要的编程思想,下面讲述一下这两者的区别和优缺点比较。原创 2023-06-07 13:12:09 · 585 阅读 · 0 评论 -
Java的反射?这玩意怪好嘞
王者荣耀中的英雄拥有各自独特的属性,我们可以使用反射技术来动态地创建并设置这些属性。在实际开发中,反射技术为我们提供了一种非常灵活和可扩展的方式来操作类、方法、属性等相关信息。原创 2023-05-25 14:09:23 · 780 阅读 · 0 评论 -
已经有MySQL了,干嘛还要学MongoDB?
MongoDB是一种基于文档的NoSQL数据库,具有高性能、高可用性、可扩展性等优点。它使用BSON格式存储数据,支持复杂的查询和聚合操作,同时还提供了分布式锁、事务等功能。MongoDB的数据模型非常灵活,可以根据应用程序的需要进行自由设计。在Spring Boot中,可以通过引入MongoDB的依赖和配置连接信息来使用MongoDB,同时使用Spring Data MongoDB来操作MongoDB数据库。原创 2023-05-25 14:08:52 · 2420 阅读 · 0 评论 -
redis缓存神器:@Cacheable注解
这样,当第一次调用getUserById方法时,会将返回结果缓存起来,下次再调用该方法时,直接从缓存中获取结果,而不是执行方法体。在上述代码中,使用了 PageHelper 插件进行分页查询,并将查询结果缓存到 Redis 中,缓存时间为 1 分钟。在更新数据时,先调用更新方法updateUser,然后再调用查询方法getUserById,此时会更新缓存中的数据。需要注意的是,在使用@Cacheable注解时,被缓存的方法不能抛出异常,否则会导致缓存失效。原创 2023-05-25 14:08:06 · 1741 阅读 · 0 评论 -
Redis 6.0 之后为何引入了多线程?6.0 之前为什么不使用多线程?
在 Redis 6.0 之前,Redis 是单线程的,这是因为 Redis 的设计目标是高性能和高并发,而单线程模型可以避免多线程带来的线程切换和锁竞争等开销,从而提高 Redis 的性能和并发能力。此外,Redis 的单线程模型还可以避免多线程带来的复杂性和不稳定性问题,使 Redis 更加简单和可靠。然而,随着 Redis 的应用场景越来越广泛,数据量和并发量也越来越大,单线程模型已经无法满足需求。因此,在 Redis 6.0 中引入了多线程模型,以提高 Redis 的性能和并发能力。原创 2023-05-25 14:08:43 · 1485 阅读 · 0 评论 -
如何使用 Redis 实现分布式锁?(附教学视频)
分布式锁的可重入是指在分布式环境下,同一个线程可以多次获取同一个锁,而不会出现死锁或其他异常情况。这是因为可重入锁会记录当前线程已经获取锁的次数,每次释放锁时会将次数减一,只有当次数为零时才会真正释放锁。在分布式环境下,可重入锁会将当前线程的标识和获取锁的次数一起存储在分布式存储系统中,以便其他节点可以识别当前线程是否已经获取了锁,并且可以正确地释放锁。可重入锁的好处是可以避免死锁和其他异常情况,同时也可以提高代码的可读性和可维护性。原创 2023-05-25 14:06:53 · 1116 阅读 · 0 评论 -
什么是AOP,如何实现?(有落地代码)
好的,下面是 AOP 的总结:AOP(Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以模块化的方式实现这些关注点。AOP 的核心思想是将程序的功能分解成不同的关注点,然后通过切面将这些关注点模块化,从而提高代码的可维护性和可重用性。AOP 的主要概念包括:切面(Aspect):横切关注点的模块化,它包括切点和通知。切点(Pointcut):程序中需要被拦截的方法或者类。原创 2023-05-25 14:07:31 · 1714 阅读 · 0 评论 -
李莫愁给张无忌朋友圈点赞?详解SpringBoot事件机制
Spring Boot的事件机制是基于Spring框架的事件机制实现的。Spring Boot中的事件机制可以让我们在应用程序中监听和响应特定的事件,例如应用程序启动、关闭、上下文刷新等。接下来,我们通过一个案例,来讲解具体怎么使用。原创 2023-05-18 11:30:12 · 706 阅读 · 4 评论 -
Mybatis和hibernate到底有什么异同?
MyBatis 和 Hibernate 在使用上各有优点,需要根据实际项目需求来选择最合适的 ORM 框架,就像烹调一口好菜一样,有好的厨具和调料是基础,但手艺也非常重要。大家都是用菜刀,重要的是出菜的味道。原创 2023-04-07 15:55:45 · 316 阅读 · 1 评论 -
springboot+vue学生选课管理系统
采用 vue 2.0 开发,通过调用后端提供的数据接口实现数据的动态渲染。项目默认端口号 8080使用监视器,得益于 Mybatis 强大的动态 SQL 功能,实现高性能动态搜索功能使用 router 配置路由,实现不同用户类型导航栏的动态渲染使用 axios 异步加载后端数据使用 element ui 实现表单的前端校验功能使用 sessionStorage 实现登录拦截分别实现了基于前端和后端的数据分页功能采用 Restful 风格开发,采用 CrossOrigin 解决跨域问题。原创 2023-04-04 10:14:50 · 1031 阅读 · 3 评论 -
mybatis 模糊查询 like 语句该怎么写?
在 MyBatis 中,使用like关键字进行模糊查询,可通过在 SQL 语句中使用concat()函数将需要查询的关键词拼接到 SQL 语句中实现。在 MyBatis-Plus 中,使用类构建查询条件,通过调用like方法进行模糊查询,用于获取对应实体的属性并指定查询关键词。总的来说,模糊匹配是 SQL 查询中比较常用的一种方式,MyBatis 和 MyBatis-Plus 都能够很方便地支持模糊查询,具体实现根据项目需要进行选择。原创 2023-04-03 09:13:26 · 3034 阅读 · 0 评论 -
这几个过时Java技术不要再学了
Java 已经发展了近20年,极其丰富的周边框架打造了一个繁荣稳固的生态圈。Java现在不仅仅是一门语言,而且还是一整个生态体系,实在是太庞大了,从诞生到现在,有无数的技术在不断的推出,也有很多技术在不断的被淘汰。这导致很多人不知道到底哪些技术值得学,哪些技术是主流,而哪些技术不应该学呢?从学习Java到现在,也有挺多年的了,见证了许多 Java 技术变迁,包括:JavaEE 框架,从百家混战到现在 Spring 基本一统天下。原创 2023-03-17 13:28:01 · 9412 阅读 · 9 评论 -
Java新人易错:当修改遇到唯一(万字长文)
现在是Java培训机构林立的时代,更有360行,行行转java的谣传。但是,我们很多人都一味地追求知识面的广度,孜孜不倦地学习各种新技术。网上大量地博客都打着xxx管理系统的亮眼标题,哇,免费的可以白嫖,赶紧下载,编译,部署。搭出来一个博客页面,有类型,文章的增删改查,各种新技术,boot,cloud,vue,感觉自己碉堡了。但是,我们往往却疏忽了业务逻辑的锻炼,那些项目再好,页面再华丽,也无非就是最最简单的增删改查,为一大群crud boy提供了肥沃的土壤。于是,又有人说,我要跳出舒适圈,去卷算法。原创 2023-03-17 10:52:20 · 648 阅读 · 1 评论 -
Java8的Stream神器
Java 8中的Stream是一种处理集合数据的新方法。它提供了一种非常强大的方式来处理集合数据,可以通过一系列的操作来对集合数据进行过滤、转换、聚合等操作。原创 2023-03-16 16:20:46 · 128 阅读 · 0 评论 -
java实用小技巧:判断list是否有重复项
该方法使用 Java 8 的 Stream API 处理原始列表,首先使用 `map()` 方法对每个元素进行属性提取,然后使用 `distinct()` 方法去重,最后使用 `collect()` 方法将 Stream 转换为列表并返回。这是一个泛型方法 `distinctList`,它接受一个 `List` 类型的参数 `rawList`,返回一个经过去重处理的 `List`。首先,使用 `stream()` 把 `rawList` 转换为一个 `Stream`。进一步优化,如果的复杂类型怎么办呢?原创 2023-03-09 16:54:47 · 11515 阅读 · 4 评论 -
DO、DTO和VO分别是什么?
1. DO(数据对象):是持久性对象,也就是与数据库表对应的实体类,用于对数据进行持久化,一般包括了对应表的所有字段,并且一一对应,不添加额外的业务称之为Entity。2. DTO(数据传输对象):是用于数据传输的对象,通常包含需要传输的数据属性,可以用来封装多个DO的属性,在服务之间进行数据传输,以降低网络传输量的开销。在实际的开发中,常常使用DTO来解决数据传输的问题,而VO一般用作承载表示层的数据,如前端的展示数据,而DO一般用作持久层,用于数据库操作。原创 2023-03-09 11:01:32 · 3738 阅读 · 0 评论 -
JAVA中子类使用super.getClass()方法
思考一下,如果被final修饰,那么子类无法覆盖这个方法,所以子类调用这个方法其实就是调用父类里的这个方法,也就是说 getClass().getName() 等价于 super.getClass().getName()。时,当前运行的类是Test06类,和this.getClass()效果一样。阅读一下getClass()方法,这个方法是被final修饰的。getClass()方法返回的是当前运行的类,执行代码。原创 2023-03-07 09:13:19 · 239 阅读 · 0 评论 -
Java笔试复盘
今天去参加了一场国企单位的笔试,很基础,但是有些细节的地方还是觉得答得不好,所以复盘一下。原创 2022-11-11 16:07:48 · 682 阅读 · 0 评论 -
[兔子私房课] Mybatis开发详解与项目实战02
大家好,本章主要讲解mybatisPlus的日志配置和ID生成策略!原创 2022-11-01 20:29:57 · 286 阅读 · 1 评论 -
大厂面试,欢聚时代四年多经验的Java面经
以我个人的经验来看,处理秒杀的高并发场景无非两种方案,要么同步,要么异步,实际操作无非就是加机器或者是放到队列等待,当然,实际要考虑的点非常的多,在高流量下所有的业务缺陷都会被无限放大,你需要考虑各种异常的情况做好预防措施,还有补偿机制,限于篇幅,我无法在这里给大家讲解太多,而且我本人也并非对所有的场景有处理经验,只能介绍几点思路让大家去思考,还有未来有什么职业规划之类的,这些问题也是因人而异,虽说没什么难度,但事前准备的好点还是更利于你面试的过程表达流畅的,所以,也建议大家可以多准备下软实力方面的题。原创 2022-10-31 22:18:31 · 176 阅读 · 0 评论 -
Maven面试题
Maven 的仓库只有两大类:1、本地仓库。2、远程仓库。在远程仓库中又分成了 3 种:中央仓库。私服。其它公共库。Maven 会先搜索本地仓库(repository),发现本地没有然后从远程仓库(中央仓库)获取。但中央仓库只有一个,最好从其镜象处下载。国内可以用阿里云下的服务器。【其它公共库】 也有通过 Nexus 搭建的私服进行获取的。【私服】原创 2022-10-31 22:01:04 · 1120 阅读 · 0 评论 -
types. Found: ‘com.baomidou.mybatisplus.annotation.IdType‘, required: ‘java.lang.String‘
被自己蠢哭了,今天设置表的主键为自动递增,就写IdType,死活报。ID设置的是Long类型,数据库也加了递增,怎么就报这个错呢?后来发现了原因,笑哭。原创 2022-10-30 14:12:10 · 457 阅读 · 2 评论 -
[兔子私房课]MybatisPlus开发详解与项目实战01
大家好,我是兔子老师。那么从今天开始呢,就由我来带领大家来了解一下Mybatis-plus这个框架。为什么他叫Mybatis-plus呢,它和Mybatis又有什么关系?https://baomidou.com/ 这是官网。为简化而生,对Mybatis只做增强,不做改变。MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。原创 2022-10-29 14:27:32 · 1069 阅读 · 5 评论 -
一文就读懂RPC远程调用核心原理
rpc的全称是Remote Procedure Call,即远程过程调用,是分布式系统的常用通信方法。Remote,简单来说的话就是两个不同的服务之间,两个服务肯定是两个不同的进程。因此,我们就从跨进程进行访问的角度去理解就行了。Procedure,意思是一串可执行的代码,我们写Java的方法,就是一段课程行的代码。Call,即调用,调用的就是跨了进程的方法。综上,rpc就是跨进程去调用一个方法代码。举一个例子,你从QQ打开QQ空间,会弹出浏览器,自动访问你的QQ空间。原创 2022-10-26 20:19:44 · 503 阅读 · 0 评论 -
JavaWeb编年史(黄金时代)
从JavaWeb编年史的远古时代,一直到白银时代,我们见证了JavaWeb开发模式的大致变迁。说白了,就是不断解耦合的过程。接下来我们来聊聊项目架构的演变,之所以我把它划到了JavaWeb编年史(黄金时代),是因为在早期的JavaWeb项目中,很少有架构的概念,基本就是一个单体项目,然后不断在已有项目上堆砌新的功能。所以,当我们开始有了架构的概念,其实也是一种非常大的进步,我个人称之为黄金时代,哈哈。对于小公司来说,大部分项目都比较小,交给一个人开发足以,使用单体项目也无所谓。原创 2022-10-26 20:10:26 · 623 阅读 · 2 评论 -
JavaWeb编年史(白银时期)
经典三层架构模式,把项目分成了三层,分别是表示层,业务层,和数据库链接层。这个模式实现了对项目的横向拆分,使得项目的层次结构变得清晰无比。但是,此时的表现层还是用传统的Servlet,一个Servlet程序只能应对一个URL请求。但是当项目越做越大,请求url的种类越来越多,就会难以招架。于是,人们迎来了框架时代。所谓框架不出,谁与争锋?从最早的SSH架构,到后面经典的SSM架构,实际上都是着重解决了同一个问题,那就是路由分发的难题。由于后来Stucts2框架爆出严重的安全漏洞,后面相当长的一段时间内,都是原创 2022-10-23 21:39:31 · 685 阅读 · 0 评论 -
JavaWeb编年史(青铜时代)
上一节呢,我们简单阐述了远古时期地JavaWeb开发方案,简单来说就是一个Servlet打天下,不管你送什么请求过来,我都要给你返回一整个页面。整个页面都用java拼接出来,可想而知代码是有多么复杂,多么难以维护。要我说,这个时代的程序员都是全才,所谓的全栈工程师。因为你既要懂html页面,css美工,还要会java,数据库,所有的活都是他一个人包了。如果这时候老板说要改页面,做一些特效和动态效果,可想而知程序员看着全部混在一起的代码作何感想。原创 2022-10-20 22:00:30 · 719 阅读 · 0 评论 -
JavaWeb编年史(远古时期)
作为一个Java程序员,我们更多耕耘的是JavaWeb项目,简单来说就是做网站或者业务系统。随着互联网时代的到来,早期CS架构的项目架构逐渐淡出人们的视野,互联网的气息弥漫在每一个开发者周围,我们习惯于用浏览器来做业务,而java作为这个时代的宠儿,是一门及其重要的编程技术。今天,我们就来聊一聊JavaWeb的一个简明发展历程。JavaWeb的发展历程,就是一个web程序不断解耦的过程,在之后的文章中我会逐渐说明这一点,我参考了大量资料,总结出JavaWeb发展的若干个时代。首先是远古时代。原创 2022-10-18 22:15:09 · 911 阅读 · 6 评论 -
多线程并发情况下的数据一致性问题
首先,有一个静态的布尔变量:publicstaticbooleanflag = false;然后,开启两个线程。A线程:newThread(()-> {System.out.println(Thread.currentThread()+ "start...");while(!flag) {}System.out.println(Thread.currentThread()+ "success...");}).sta......原创 2022-05-08 10:14:44 · 2798 阅读 · 0 评论 -
Vue+JS+layUI 完成预览模式功能
1.预览模式更新站点:java小白翻身官网(网址:java18.cn)更新原因:方便浏览文章,和步骤阅读法相得益彰。更新内容:PC端在具体的教程页面,目录下方增加一个预览模式的按钮。点击后会打开一个窗口,里面就是当前的教程,我进行了重新排版。效果如下:因为用了vue,我就不需要再重新后台写接口了,改一下html就搞定。关键代码:<div style="height:30px;"> <el-button @click="openPreview" s原创 2022-05-03 16:43:45 · 805 阅读 · 0 评论 -
Java Map的Hash算法究竟干了什么?
首先说下hashmap的实现基本逻辑根据key值算出hashcode 用hash算法转换第一步的hashcode,得hash值 将第二步的hash值对内部数组长度进行取模,得到落点p 把value放入这个格子从这些步骤可以看出,hash算法好不好直接决定了落点能否均匀分布。hashMap是键值对的集合,比如key=“Hello”,value=“Hello”。这个Hello拥有自己的hashCode,用如下代码可以看出来。Stringkey= "Hello";System.out...原创 2022-05-02 08:00:00 · 460 阅读 · 1 评论 -
从非诚勿扰看数据索引,优化代码小妙招
抛出问题假如有两组数据,这六个人去参加非诚勿扰,需要做一个配对。数据如下:List<User> usersA = newArrayList<>();usersA.add(newUser("1", "吕布", "10"));usersA.add(newUser("2", "刘备", "11"));usersA.add(newUser("3", "孙悟空", "12"));List<User> usersB = newArrayList...原创 2022-05-01 23:08:17 · 229 阅读 · 0 评论 -
【VS常量类和 else if】更完美的数据校验,解决码值乱送问题的思路
01假如现在有一个接口,别人调用送过来的请求报文中有个字段叫 vipType,对服务方来说,假设这个数据只有3种类型:1-穷逼VIP ,2-普通VIP,3-尊贵VIP。那么问题来了,这个对应的关系往往只有你自己知道,所以其他系统就得来问你该送什么?如果没有沟通好,或者沟通异常,就会乱送。明明是数字,结果送了一个“VIP1”过来,系统入库直接报错:Data too large... ...多么熟悉的场景,多么熟悉的味道?但是,这根本难不住我们聪明的大脑,设置数据类型啊,vipTy.原创 2022-05-01 23:07:00 · 463 阅读 · 1 评论 -
尝试用jdk1.6强行装jdk1.8的逼-Filter
定义一个断言接口,里面只有一个抽象方法。publicinterfacePredicate<E> {boolean test(E e);}设计一个Lsit,直接继承ArrayListpublic classSuperList<E>extendsArrayList<E>{privatestatic finallong serialVersionUID=1L; SuperList<E> f...原创 2022-05-05 21:08:23 · 404 阅读 · 0 评论 -
实用工具类---给List数据加索引
继承之前的一篇:从非诚勿扰看数据索引,优化代码小妙招直接将这个实用小算法封装成一个工具类。publicclassIndexUtil {/*** List转Map* @param list 原始列表数据(任何实现List接口的数据)* @param keyExtractor (抽取Key值的方法)* @return 加了索引的数据->Map*/publicstatic <K,V> Map<K,V> fromList(Lis...原创 2022-05-05 21:35:54 · 1231 阅读 · 0 评论 -
不用session也能随时获取globalUser,用ThreadLocal也太香了
之前一直不明白,为什么用shiro之类的框架,为什么我们可以在任何地方,只要写上一句SubjectUtil.getCurrentUser,就可以得到当前的登录用户。按照道理,最初学web的时候,都会被告知有一个叫做session的东西,然后通过request对象就可以得到session,用户登录后,把用户信息存到session里面就可以了。代码一般是这样:request.getSession().getAttribute('currentUser');可是这样就有个麻烦的地方,如果我是在某个原创 2022-05-04 10:19:50 · 830 阅读 · 3 评论 -
接口耗时太久怎么办?适当用点Future做异步~
在JS中,各种回调函数漫天飞,写的代码基本都是异步的,需要靠某个event去trigger。比如点击事件,就是最常见的。但是Java里面做异步就得绕好几弯,还不一定行,需要各种判断和校验,生怕出错。异步执行的好处是显而易见的,比如某个接口需要查好几张表,调很多方法,其中有几个方法是非常耗时的。但是很多代码的做法还是同步的,传统的顺序执行。优点是可读性强,不容易出错。假如A方法耗时特别长的话,那么整合接口的返回就会很慢。比如,现在有一个服务,非常耗时。class AccountServi原创 2022-04-30 16:35:31 · 1019 阅读 · 0 评论