自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

挑灯日记 记录自己

有点非主流的博客名,记录自己最真实的成长。

  • 博客(96)
  • 收藏
  • 关注

原创 MyBatisPlus详解(三)lambdaQuery、lambdaUpdate、批量新增、代码生成、Db静态工具、逻辑删除

MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口。

2024-04-22 21:45:00 530

原创 MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置在单元测试,这种写法其实也是不好的,因为SQL语句最好都维护在持久层,而不是业务层。为此,MyBatis提供了自定义SQL功能,即利用Wrapper构建复杂的where条件,然后自己定义SQL语句剩余的部分。也就是说,自己定义,利用Wrapper构建。

2024-04-21 19:39:50 899

原创 MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置

为了简化或省略单表的CRUD开发工作,国内使用较多的一个组件是MyBatisPlus。MyBatisPlus不仅可以简化单表操作,还对MyBatis的功能有很多的增强,可以让开发更加简单、高效。因此,当自定义的Mapper接口继承该基础的BaseMapper接口。

2024-04-21 12:19:06 611

原创 再探Java为面试赋能(三)Java基础知识(三)抽象类和接口;berak、continue和return;switch;volatile;Java基本数据类型;值传递和引用传递;++i与i++

再探Java为面试赋能(一)Java基础知识(一)变量初始化顺序、构造方法、clone方法再探Java为面试赋能(二)Java基础知识(二)反射机制、Lambda表达式、多态。

2024-04-20 23:48:40 1063

原创 Redis从入门到精通(二十二)Redis原理之数据结构、网络模型、通心协议、内存回收

如上图所示,当用户应用程序需要读取硬件上的数据时,会通过接口向内核申请读取数据,而内核需要等到驱动程序从硬件上读取数据。当从硬件上加载到数据后,内核会将数据写入到内核空间的缓存区,然后再将数据拷贝到用户空间的缓存区,最后返回给应用程序。try {// 1.建立连接// 2.获取输出流、输入流// 3.获取授权 auth 123321// 4.测试异常 authaaa 123321// 5.测试数字 hset user name Jack age 21。

2024-04-20 10:53:23 950

原创 Redis从入门到精通(二十一)Redis最佳实践(二)mset、pipeline、慢查询优化、内存划分

批处理优化:命令执行流程、mset、Pipeline、集群下的批处理服务器端优化:持久化配置、慢查询优化、命令及安全配置、内存划分和内存配置、集群or主从

2024-04-18 14:00:00 699

原创 Redis从入门到精通(二十)Redis最佳实践(一)优雅的Key结构、拒绝BigKey

分析RDB快照文件,全面分析内存使用情况。,在raw模式下内存空间不是连续的,而是采用一个指针指向了另外一段内存空间,访问的时候性能也就会受到影响,还有可能产生内存碎片。假设有一个hash类型的Key,其有10万对field和value,field是自增id,那这个Key存在什么问题?:对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢;BigKey内存占用较多,删除这样的Key也需要耗费很长时间,从而导致Redis主线程阻塞,引发一系列问题。

2024-04-18 09:46:55 1058

原创 Redis从入门到精通(十九)多级缓存(四)Nginx共享字典实现本地缓存

Redis从入门到精通(十六)多级缓存(一)Caffeine、JVM进程缓存Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用Redis从入门到精通(十八)多级缓存(三)OpenResty请求参数处理、Lua脚本查询Redis和Tomcat。

2024-04-16 19:17:10 810

原创 Redis从入门到精通(十八)多级缓存(三)OpenResty请求参数处理、Lua脚本查询Redis和Tomcat

Redis从入门到精通(十六)多级缓存(一)Caffeine、JVM进程缓存Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用。

2024-04-16 08:45:07 988

原创 Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用

多级缓存(二)Lua语言入门、OpenResty集群的安装、配置前端ajax请求反向代理至OpenResty集群。

2024-04-14 06:00:00 890

原创 Redis从入门到精通(十六)多级缓存(一)Caffeine、JVM进程缓存

多级缓存(一)多级缓存介绍、Caffeine、JVM进程缓存

2024-04-13 14:00:00 1144

原创 Redis从入门到精通(十五)Redis分布式缓存(三)Redis分片集群的搭建和原理分析

Redis分布式缓存(三)Redis分片集群的搭建和原理分析

2024-04-13 06:00:00 787

原创 Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

2024-04-12 20:16:38 1081

原创 Redis从入门到精通(十三)Redis分布式缓存(一)RDB和AOF持久化、Redis主从集群的搭建与原理分析

Redis分布式缓存(一)Redis的RDB、AOF持久化原理,Redis主从集群的搭建和原理分析。

2024-04-12 06:00:00 1214

原创 Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

Redis实战(九):使用GEO实现附近商户查询功能;使用BitMap实现用户签到和统计功能;使用HLL实现UV统计功能。

2024-04-11 18:57:00 1004

原创 Redis从入门到精通(十一)Redis实战(八)关注、共同关注和Feed流

Redis实战(八):使用Redis实现用户关注和取消关注、共同关注以及Feed流功能。

2024-04-10 18:54:18 1102

原创 Redis从入门到精通(十)Redis实战(七)达人探店、点赞与点赞排行榜

Redis实战(七):新增探店笔记、查看探店笔记、点赞功能、点赞排行榜。

2024-04-10 06:00:00 1012

原创 再探Java为面试赋能(二)Java基础知识(二)反射机制、Lambda表达式、多态

Java基础(二)反射机制、Lambda表达式、多态

2024-04-09 06:00:00 1159

原创 Redis从入门到精通(九)Redis实战(六)基于Redis队列实现异步秒杀下单

Redis实战(六):分布式锁-Redisson:Redission锁重试、WatchDog机制、MutiLock原理秒杀优化:异步秒杀下单Redis消息队列:基于List、PubSub、Stream、消费者组的消息队列,基于Stream的消息队列实现异步秒杀下单。

2024-04-08 06:00:00 1267

原创 Redis从入门到精通(八)Redis实战(五)分布式锁误删与原子性问题、Redisson

Redis实现(五):分布式锁的误删问题、分布式锁的原子性问题、Redisson。

2024-04-07 06:00:00 701

原创 Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

Redis实战(四)库存超卖和一人一单:库存超卖问题及其解决、一人一单需求、Redis分布式锁。

2024-04-06 06:00:00 1145

原创 Redis从入门到精通(六)Redis实战(三)优惠券秒杀

Redis实战(三)优惠券秒杀:添加普通优惠券、添加秒杀优惠券、实现秒杀下单。

2024-04-05 15:09:29 842

原创 Redis从入门到精通(五)Redis实战(二)商户查询缓存

Redis实现(二):缓存介绍、查询商户信息的传统做法、查询商户信息添加Redis缓存、数据一致性问题及其解决方案、缓存穿透问题及其解决方案、缓存击穿问题及其解决方案。

2024-04-04 22:44:57 970 1

原创 Redis从入门到精通(四)Redis实战(一)短信登录

Redis实战(一)短信登录:基于session实现短信登录、基于Redis实现短信登录。

2024-04-03 10:06:48 770

原创 Redis从入门到精通(三)Jedis客户端、SpringDataRedis客户端

在上一章【Redis从入门到精通(二)Redis的数据类型和常见命令介绍】中,学习了Redis的五种基本数据类型,即String、Hash、List、Set、SortedSet类型,及其常用的命令。这一节学习Redis的两种Java客户端:Jedis和SpringDataRedis。在上面的案例中,方法的两个参数的类型均为Object,在写入Redis之前会把Object序列化为字节形式(默认采用JDK序列化),取出时又会反序列化。缺点比较明显:可读性差、内存占用较大。

2024-04-02 06:00:00 962

原创 再探Java为面试赋能(一)Java基础知识(一)变量初始化顺序、构造方法、clone方法

且在任意方法(包括构造方法)被调用之前先进行初始化。成员变量的初始化工作可以在许多不同的代码块中来完成,比较常见的是静态代码块和构造方法。

2024-04-01 06:00:00 708

原创 Redis从入门到精通(二)Redis的数据类型和常见命令介绍

在上一节【Redis从入门到精通(一)Redis安装与启动、Redis客户端的使用】中,学习了Redis的基本特点与优势,并比较了关系型数据库与非关系型数据库的区别;然后在Linux系统上安装了最新版本的Redis,并使用多种方式成功启动;最后学习了Redis的三种客户端,即命令行客户端、图形化桌面客户端,以及编程客户端。这一节学习Redis的五种基本数据类型及其常见命令。

2024-03-31 06:00:00 1002

原创 Redis从入门到精通(一)Redis安装与启动、Redis客户端的使用

Redis是一种键值型的NoSQL数据库。键值型NoSQL其中,键值型是指Redis中存储的数据都是以key-value对的形式存储的,key只能是字符串,而value的形式多种多样,可以是字符串、数值、json等。

2024-03-30 17:52:21 846

原创 MyBatis3源码深度解析(二十七)MyBatis整合Spring框架

通常情况下,我们并不会单独使用MyBatis框架,而是与Spring、SpringBoot等框架进行整合。MyBatis框架与Spring框架整合需要使用mybatis-spring模块。整合后,MyBatis中的Mapper动态代理对象会作为Spring框架的Bean注册到Spring容器中。

2024-03-29 06:00:00 1162

原创 MyBatis3源码深度解析(二十六)级联映射与关联查询(三)懒加载的使用与实现原理

上一节【MyBatis3源码深度解析(二十五)级联映射与关联查询(二)级联映射的实现原理】详细解读了MyBatis级联映射的实现原理,在使用外部Mapper的方式实现级联映射时,会为关联的Java实体对象执行一次额外的查询。但在一些场景下,可能会需要按需加载。例如查询用户信息时,不需要立刻查询用户关联的订单信息,而是在调用订单信息的Getter方法时,才执行订单信息的查询操作。MyBatis提供了懒加载机制来实现这种需求,这种方式能够在一定程度上减少数据库的IO次数,提升系统性能。

2024-03-28 09:35:50 948 2

原创 MyBatis3源码深度解析(二十五)级联映射与关联查询(二)级联映射的实现原理

上一节【MyBatis3源码深度解析(二十四)级联映射与关联查询(一)级联映射的使用】通过编写一个测试案例,学习了如何使用标签实现MyBatis的一对多、一对一级联映射。本节来研究一下MyBatis级联映射的实现原理。

2024-03-27 16:05:38 960

原创 MyBatis3源码深度解析(二十四)级联映射与关联查询(一)级联映射的使用

MyBatis其中一个比较强大的功能是支持查询结果的级联映射。使用MyBatis级联映射,可以轻松地实现一对多、一对一、多对多关联查询,甚至实现懒加载。所谓懒加载,就是当一个实体对象中关联了其他实体对象时,如果没有使用这个被关联的实体对象,则不为被关联的实体对象执行额外的查询操作。而一旦调用当前实体的Getter方法获取被关联的实体对象时,再执行一次额外的查询操作。通过这种方式在一定程度上能够减轻数据库的压力。

2024-03-27 07:00:00 834

原创 MyBatis3源码深度解析(二十三)MyBatis拦截器的原理及应用(二)自定义分页插件、慢SQL插件

第一种是从数据库中查询出所有满足条件的数据,然后通过应用程序进行分页处理,这种方式在数据量过大时效率比较低,而且可能会造成内存溢出,所以不太常用。第二种是通过数据库提供的分页语句进行物理分页,这种该方式效率较高且查询数据量较少,所以是一种比较查用的分页方式。本节基于数据库物理分页的方式编写一个MyBatis分页插件。由于面向对象设计原则中提倡面向接口编程,因此首先可以编写一个接口,定义有关分页的一些基本方法。/** 总记录数 *//** 总页数 *//** 每页记录数 */

2024-03-26 14:52:08 837

原创 MyBatis3源码深度解析(二十二)MyBatis拦截器的原理及应用(一)拦截器的实现原理与执行过程

MyBatis框架支持用户通过自定义插件的方式改变SQL的执行行为,例如在SQL执行时追加SQL分页语法,从而达到简化分页查询的目的。用户自定义的插件也被称为MyBatis拦截器。本章研究MyBatis拦截器的实现原理及其应用。为方便阅读,本文均采用“拦截器”这一话语,而不使用“插件”这一话语。

2024-03-25 18:49:05 1017

原创 MyBatis3源码深度解析(二十一)动态SQL实现原理(二)动态SQL解析过程、#{}和${}的区别

在【MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件】中研究了MyBatis动态SQL相关的组件,如SqlSource用于描述通过XML文件或Java注解配置的SQL信息,SqlNode用于描述动态SQL中的<if>、<where>等标签信息,LanguageDriver用于对SQL配置进行解析,将SQL配置转换为SqlSource对象。研究了MyBatis动态SQL相关的组件,下面来研究一下动态SQL的解析过程。

2024-03-24 15:59:42 900

原创 MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件

在使用JDBC API进行编程时,通常都要对SQL语句进行拼接,甚至还要根据不同的查询条件动态地拼接SQL语句,这个过程是比较繁琐且容易出错的,以致于花费更多的时间。MyBatis的动态SQL特性就用于解决这个问题。本节先对动态SQL的基本使用,以及涉及到的核心组件进行研究,下一节完整地研究动态SQL的解析过程。

2024-03-23 15:00:47 724

原创 MyBatis3源码深度解析(十九)MyBatis日志实现

日志是Java应用中必不可少的部分,它能够记录系统运行状况,有助于准确定位系统异常,不同的项目可能会使用不同的日志框架。在整合了MyBatis的项目中,经常可以在日志文件中看到打印出来的SQL语句,那本节就来研究一下MyBatis的日志实现。

2024-03-22 10:06:08 1034

原创 MyBatis3源码深度解析(十八)MyBatis缓存(二)二级缓存对象的创建与MyBatis使用Redis

MyBatis的一级缓存在BaseExecutor类中实现,其内部维护了两个PerpetualCache实例;二级缓存在CachingExecutor类中实现,其内部维护了一个TransactionalCacheManager实例,用于管理所有的二级缓存对象。在CachingExecutor的query()方法中,,即从MappedStatement对象中获取Cache对象,因此MappedStatement对象中必然组合了二级缓存对象实例。

2024-03-21 09:49:38 977

原创 MyBatis3源码深度解析(十七)MyBatis缓存(一)一级缓存和二级缓存的实现原理

缓存是MyBatis中非常重要的特性。合理使用缓存,可以减少数据库IO,显著提升系统性能;但在分布式环境下,如果使用不当则会带来数据一致性问题。在上一节【MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程】中提到,MyBatis提供了一级缓存和二级缓存来提升查询效率,一级缓存在BaseExecutor类中完成,二级缓存在CachingExecutor类中完成。

2024-03-20 16:56:51 1325

原创 MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程

上一节【MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取】已经知道,调用SqlSession对象的方法,传入指定的Mapper接口对应的Class对象,即可获得一个动态代理对象,然后通过代理对象调用方法即可完成对数据库的操作。</select></mapper>@Test// 获取Mapper接口的动态代理对象// 操作数据库。

2024-03-19 19:24:35 1254

空空如也

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

TA关注的人

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