自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入浅出MyBatis【5】MyBatis 注解方式的基本用法

答案当然是否定的,不过在MyBatis 3.3.0及以前的版本中,注解定义的@Results不能共用,需要在每一个方法上都写一遍。也许有人会问,我在xml中,为resultMap设置了一个id,这样我就能复用该resultMap了,在注解方式中,支持吗?看过之前几篇博客的读者可能知道,我们的MyBatis 刚好使用的是3.3.0版本,所以刚好不支持设置id属性,哈哈。before = true相当于XML中的order="BEFORE",这是Oracle数据库的配置。使用注解方式该如何实现呢?

2025-06-18 21:04:14 450

原创 深入浅出MyBatis【4】MyBatis XML方式的基本用法之增删改

在1.1的例子中,新增完数据,我们并没有拿到数据库中自增的id值,但有些场景中,我们需要先拿到数据库中自增的值,然后再处理其余的逻辑,那么如何拿到数据库中的自增的id值呢?1)为了防止类型错误,对于一些特殊的数据类型,建议指定具体的jdbcType值。通过上面的测试,说明数据库的datetime类型可以存储DATE(时间部分默认为00:00:00)和TIMESTAMP这两种类型的时间,不能存储TIME类型的时间。报错的原因是,数据库中的字段类型为datetime,但是这里只有time部分的值。

2025-06-18 21:02:59 650

原创 深入浅出MyBatis【3】MyBatis XML方式的基本用法之多表查询

TRACE [main] - <== Row: 1, 管理员, 1, 1, 2019-06-27 18:21:12.0, admin, [email protected]。但有些场景下,比如只有2个参数,没有必要为这2个参数再新建一个对象,比如我们现在需要根据用户的id和角色的状态来获取用户的所有角色,那么该如何使用呢?书中推荐的是方式3,方式4是我个人认为更好的方式,因为实体类一般由工具自动生成,增加了字段后,后续容易忘记导致被覆盖掉。然后,打开对应的SysUserMapper.xml文件,添加如下代码。

2025-06-18 21:01:02 259

原创 深入浅出MyBatis【2】MyBatis XML方式的基本用法之Select

找到src/main/java目录下的包com.zwwhnly.mybatisaction.mapper,在该包下创建XML文件对应的接口类,分别为SysUserMapper.java,SysRoleMapper.java,SysPrivilegeMapper.java,SysUserRoleMapper.java,SysRolePrivilegeMapper.java。要返回结果的类型,使用此种方式需要设置查询列的别名,别名要和resultType指定对象的属性名保持一致,

2025-06-18 20:59:53 709

原创 深入浅出MyBatis【1】MyBatis入门

​ 2001年,Clinton Begin发起了一个名为iBATIS的开源项目,最初侧重于密码软件的研发,后来发展成为一款基于Java的持久层框架。​ 2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会。​ 2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名为MyBatis。​ MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。

2025-06-18 20:55:22 283

原创 你了解ConcurrentHashMap吗?ConcurrentHashMap九连问!

多线程环境下,使用Hashmap进行put操作会造成数据覆盖,应该使用支持多线程的 ConcurrentHashMap。

2025-06-17 20:22:28 704

原创 图文并茂,万字详解,带你掌握 JVM 垃圾回收!

垃圾回收( Garbage Collection 以下简称 GC)诞生于1960年 MIT 的 Lisp 语言,有半个多世纪的历史。在Java 中,JVM 会对内存进行自动分配与回收,其中 GC 的主要作用就是清楚不再使用的对象,自动释放内存。GC 相关的研究者们主要是思考这3件事情。哪些内存需要回收?什么时候回收?如何回收?本文也大致按照这个思路,为大家描述垃圾回收的相关知识。本文的主要内容如下(建议大家在阅读和学习的时候,也大致按照以下的思路来思考和学习):哪些内存需要回收?

2025-06-17 20:08:55 349

原创 面试官问线程安全的List,看完再也不怕了!

下次面试官问你线程安全的 List,你可以从 Vector > SynchronizedList > CopyOnWriteArrayList 这样的顺序依次说上来,这样才有带入感,也能体现你对知识点的掌握程度。看完有没有收获呢?下次面试应该能秒杀面试官了吧!

2025-06-17 19:52:55 184

原创 Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

1.Feign 的内部很多类都是 package 级别的,外部 package 无法引用某些类,这个时候只能想办法绕过去,比如使用反射2.目前这种实现有风险,万一哪天 starter 内部使用的 Feign 相关类变成了 package 级别,那么会改造代码。所以把 Sentinel 的实现放到 Feign 里并给 Feign 官方提 pr 可能更加合适3.Feign的处理流程还是比较清晰的,只要能够理解其设计原理,我们就能容易地整合进去。

2025-06-17 19:50:46 506

原创 Redis 常用操作命令,非常详细!

下面总结并演示了 Redis 的 常用管理命令、key 操作、字符串、集合、列表、散列类型的操作命令。

2025-06-17 19:48:10 453

原创 Redis 再牛逼,也得设置密码!!

Redis 你再牛逼也得设置密码啊,不然会有安全漏洞,造成一些隐患。还有,比如像出现下面这样的错,需要设置密码,或者关闭保护模式,所以还是设置密码比较安全。不然只能本地操作,不能远程连接。下面介绍几种设置密码的方式,及如何使用。

2025-06-16 21:07:25 203

原创 Spring Data Redis 详解及实战一文搞定

SDR - Spring Data Redis的简称。Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。它提供了与商店互动的低级别和高级别抽象,使用户免受基础设施问题的困扰。

2025-06-16 21:06:14 764

原创 Spring Boot Redis Cluster 实战干货

尝试往redis写数据的时候,报不能获取连接异常,跟踪了半天代码,发现连接的是127.0.0.1,而不是配置的192.168.1.8,这就奇怪了,继续跟踪代码发现是往redis服务器获取的返回的集群实例列表,真是坑!就是这里获取返回的集群列表,返回的就是127.0.0.1,而不是配置的192.168.1.8。现在就可以像使用单机一样使用集群,redis会自动按key分片到不同的集群实例。你要做的也只有这些配置了,其他的spring boot都自动配置好了。重启集群节点之后,读写正常。

2025-06-16 21:04:42 249

原创 超详细的 Redis Cluster 官方集群搭建指南

今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细。

2025-06-16 21:02:36 721

原创 【Redis】Redis Linux 安装运行实战全记录

去Redis官网下载最新的Linux包,Redis官方没有Windows版的下载。启动redis src目录下的redis-server命令来启动Redis服务。启动redis src目录下的redis-cli命令来连接到Redis服务。另外推荐使用客户端连接工具:redis desktop manager。make: *** [adlist.o] 错误 127。切换到redis目录执行安装。2、切换到Redis解压目录。make: cc:命令未找到。如报错按以下错误解决。1、解压Redis包。

2025-06-16 21:01:20 256

原创 图解 | 原来这就是 class

好了,总结一下,到目前为止就几条规则。

2025-06-16 20:57:16 569

原创 Spring面试:@Resource 和 @Autowired 的区别?

​​。

2025-06-12 21:01:06 677

原创 面试官:@Transactional 什么情况下会失效?

​注解在 Spring 中用于声明式事务管理,但在某些场景下会失效。后调用。通过 AopContext 获取代理:((MyService) AopContext.currentProxy()).b()(需开启 @EnableAspectJAutoProxy(exposeProxy = true))。我更喜欢把逻辑写到另一个类中,然后再进行调用。默认只捕获 RuntimeException和 Error。若抛出 IOException等,事务不会回滚。若异常被 catch后未重新抛出,事务失效。

2025-06-12 20:59:14 960

原创 图解 | 原来这就是 class

我是一个 .java 文件,名叫 FlashObject.java,叫我就行。我马上就要被 JVM 虚拟机老大加载并运行了,此时走了过来。老虚:小渣呀,我马上就要把你载了,你先瘦身一下,别占太大地方。小渣:好的,没问题,等我十秒钟。小渣:老虚,我瘦身好了,你看看。老虚:...,你是不是有病。小渣:怎么了,我把没用的空格和回车啥的都去掉了,瘦身了好多呢!老虚:行吧,看你这智商,我就给你解释解释。

2025-06-12 20:53:37 943

原创 图解 | 原来这就是 IO 多路复用!

为了讲多路复用,当然还是要跟风,采用鞭尸的思路,先讲讲传统的网络 IO 的弊端,用拉踩的方式捧起多路复用 IO 的优势。为了方便理解,以下所有代码都是伪代码,知道其表达的意思即可。

2025-06-12 20:52:11 709

原创 图解 | 你管这破玩意叫哨兵?

老板:现在有四个 redis 节点摆在你面前,一主三从,你负责盯着点,主节点挂了你赶紧想办法拿从节点顶上来,交给你了!我把这个复杂的过程,写成了一个方法,sentinelSelectSlave(),放在了哨兵程序中,用来选择一个从节点。这样,我在启动哨兵时,只要知道主节点即可,而且这样获取的从节点信息更准确,也更实时,就不用一直问老板啦。怎么选举出一个领头呢?我灵机一动,部署多个哨兵节点,成为哨兵集群!到现在,这两个节点无论从健康状态,还是同步状态,都是完全一样的,没办法分出谁好谁坏了,那怎么办呢?

2025-06-12 20:51:02 595

原创 【Spring】如何控制bean的加载顺序?

其实在工作中,我相信很多人碰到过复杂的依赖关系的bean加载,把这种不确定性交给spring去做,还不如我们自己去控制,这样在阅读代码的时候 ,也能轻易看出bean之间的依赖先后顺序。

2025-06-09 21:42:59 652

原创 【RabbitMQ】RabbitMQ基础入门

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:接下来,我们就学习它的基本概念和基础用法。多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?

2025-06-04 14:30:00 622

原创 【RabbitMQ】RabbitMQ高级使用

在支付场景中,支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。因此,这里必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次该如何确保MQ消息的可靠性?如果真的发送失败,有没有其它的兜底方案?

2025-06-04 14:30:00 757

原创 JDBC 底层原理

JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个「规范」而不是一个实现,能够执行SQL语句。JDBC由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,注意:本文中的代码都是针对MySQL数据库实现的。先看一个案例:javaSystem.out.println("name: " + rs.getString("name") + " :年龄" + rs.getInt("age"));

2025-06-04 14:00:00 869

原创 【Spring】如何控制bean的加载顺序?

springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用可以完成一个小组件的自动装配功能。在一般业务场景,可能是不需要关心一个bean是如何被注册进spring容器的,只需要把需要注册进容器的bean声明为@Component即可,因为spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。但是,如果加载Bean的过程中部分Bean和Bean之间存在依赖关系,也就是说Bean A的加载需要等待Bean B加载完成之后才能进行;

2025-06-04 13:30:00 906

原创 【Spring】Spring事务管理深度解析-从实践到原理!

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制。

2025-06-04 12:30:00 926

原创 【Spring】AOP中动态代理详解!

代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问【下载】Java面试、学习文档、进阶路线、算法、架构资源动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。

2025-06-03 14:01:41 604

原创 【Spring】从底层源码深入分析Bean的实例化

每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器。初始化前:BeanPostProcessor,也就是拿出所有的后置处理器对bean进行处理,当有一个处理器返回null,将不再调用后面的处理器处理。

2025-06-03 13:58:54 683

原创 【Spring】Spring中的循环依赖是怎么个事?

首先,有两种Bean注入的方式:构造器注入和属性注入。

2025-06-03 13:56:01 782

原创 【Spring】从底层源码深入分析Spring的IoC容器初始化过程 !

AbstractBeanDefinitionReader的loadBeanDefinitions方法源码如下:java@Override// 模式匹配类型的解析器,这种方式是加载多个满足匹配条件的资源try {// 获取到要加载的资源// 委派调用其子类XmlBeanDefinitionReader的方法,实现加载功能= null) {else {// 只能通过绝对路径URL加载单个资源.= null) {

2025-06-03 13:54:25 603

原创 【Spring】Spring框架IoC核心详解!

IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,由Spring容器管理bean的整个生命周期。通俗来说就是IoC是设计思想,DI是实现方式。通过反射实现对其他对象的控制,包括初始化、创建、销毁等,解放手动创建对象的过程,同时降低类之间的耦合度。在 Spring 中,是 Spring 用来实现 IoC 的载体,

2025-06-02 21:51:30 877

原创 【Spring】Spring AOP基础、快速入门!

AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存、权限控制、限流等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。先看一个例子:如何给如下UserServiceImpl中所有方法添加进入方法的日志,java@Override@Override将记录日志功能解耦为日志切面,它的目标是解耦。进而引出AOP的理念:就是将分散在各个业务逻辑代码中相同的代码通过横向切割。

2025-06-02 21:50:13 679

原创 【Spring】全网最详细的Spring入门教程!

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

2025-06-02 21:48:15 921

原创 《SpringBoot》EasyExcel实现百万数据的导入导出

在日常的开发工作中,Excel 文件的读取和写入是非常常见的需求,特别是在后台管理系统中更为频繁,基于传统的方式操作excel通常比较繁琐,EasyExcel 库的出现为我们带来了更简单、更高效的解决方案。本文将介绍 EasyExcel 库的基本用法和一些常见应用场景,帮助开发者更好地利用 EasyExcel 提高工作效率。Easy Excel 官网 (alibaba.com)

2025-05-30 16:47:11 898

原创 《SpringBoot》史上最全SpringBoot相关注解介绍

DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)@ComponentScan:扫描被@Component (@Repository,@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。@GetMapping 是@RequestMapping 的GET请求方法的特例。

2025-05-30 16:44:02 969

原创 《SpringBoot》自动装配原理(简单易懂)

可以知道SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前需要自己配置的东西,自动配置类都帮我们完成了。可以看到这个注解除了元注解以外,就只有一个@Configuration,那也就是说这个注解相当于@Configuration,所以这两个注解作用是一样的,也就是能够去注册一些额外的Bean,并且导入一些额外的配置。

2025-05-30 16:36:30 834

原创 【SpringBoot】SpringBoot的两种启动方式原理!

使用java -jar默认情况下,不会启动任何嵌入式Application Server,该命令只是启动一个执行jar main的JVM进程,当spring-boot-starter-web包含嵌入式tomcat服务器依赖项时,执行java -jar则会启动Application Server。到这里总算是看到了tomcat的踪迹。//Engine是最高级别容器,Host是Engine的子容器,Context是Host的子容器,Wrapper是Context的子容器。通用的Servlet容器配置都以。

2025-05-30 16:35:12 839

原创 深入剖析HashMap:理解Hash、底层实现与扩容机制!

Key的存储方式是基于哈希表的HashMap是 Map 接口 使用频率最高的实现类。允许使用null键和null值,与HashSet一样,不保证映射的顺序。所有的key构成的集合是无序的、唯一不可重复的。所以,key所在的类要重写:equals()和hashCode()所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类要重写:equals()一个key-value构成一个entry所有的entry构成的集合是Set:无序的、不可重复的。

2025-05-29 13:45:00 641

原创 Netty高级使用与源码详解

魔数:约定好的,用来在第一时间判定是否是无效数据包。版本号:可以支持协议的升级序列化算法:消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型:是登录、注册、单聊、群聊... 跟业务相关请求序号:为了双工通信,提供异步能力正文长度消息正文。

2025-05-29 13:30:00 973

空空如也

空空如也

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

TA关注的人

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