自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代理模式和适配器模式有什么区别

(Proxy Pattern)和(Adapter Pattern)都是结构型设计模式,它们有不同的应用场景和目标,虽然在某些方面看起来相似,但它们的意图和实现方式有显著的区别。

2025-01-13 20:21:40 863

原创 设计模式中的代理模式

动态代理允许我们在运行时创建代理对象,而不需要为每一个委托类都编写一个具体的代理类。Java中的动态代理主要分为两种:基于接口的代理和基于子类的代理。在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。当目标对象没有实现任何接口时,可以使用CGLIB库通过继承的方式生成代理类。缺点是对于每个需要代理的目标对象都需要创建一个代理类,这会导致代码膨胀。代理类和目标对象通常实现相同的接口或继承相同父类。在编译时就已经确定了代理类和被代理类的关系。1. JDK动态代理。

2025-01-10 20:15:48 433

原创 设计模式的六大原则

这六大原则从不同角度指导如何构建高质量的面向对象系统。遵循这些原则可以帮助开发者编写更加灵活、可维护和易于扩展的代码。设计模式正是基于这些原则提供了一些标准化的解决方案。

2025-01-02 11:23:29 1090

原创 java反射

Java 反射是一种强大的技术,使得我们可以在运行时动态地操作类的结构、方法和属性。它主要用于框架开发、动态代理、序列化等场景。尽管反射提供了灵活性,但在性能和安全性上需要谨慎使用。

2024-12-30 18:56:09 354

原创 单例模式的写法

懒汉式:延迟加载,线程安全性差(需要双重检查锁定)。饿汉式:类加载时立即创建实例,线程安全,但浪费资源(如果实例不常用)。静态内部类:延迟加载,线程安全,不存在性能问题,推荐使用。枚举式:最安全、最简洁,JVM 保证唯一性,适合用于单例模式。通常推荐使用静态内部类或枚举式,它们具有较高的性能并能避免常见的错误。

2024-12-27 20:43:53 738

原创 MyBatis动态 SQL 的执行原理

MyBatis 的动态 SQL 提供了强大的功能,使得开发者能够灵活地生成复杂的 SQL 查询。通过使用。

2024-12-26 10:27:59 1269

原创 IBatis和MyBatis在细节上的不同有哪些

特性iBatisMyBatis框架名称MyBatis命名空间基本支持命名空间,功能较弱命名空间支持更强,支持更多复杂情况配置文件只支持 XML 配置支持 XML 配置和注解配置动态 SQL基本支持,表达能力较弱动态 SQL 强大,支持多种标签和条件注解支持不支持注解完全支持注解,简化配置Mapper 接口无原生接口支持支持 Mapper 接口,与 XML 或注解配合缓存机制基础缓存支持强大的缓存支持,包括自定义缓存策略分页查询无内建分页功能内建分页功能或支持第三方插件性能优化。

2024-12-25 14:15:36 515

原创 MyBatisSQL优化

优化 MyBatis SQL 性能的关键是:优化 SQL 语句本身、避免不必要的查询、合理使用缓存、避免 N+1 查询、批量处理操作,以及使用数据库索引和分析执行计划。通过这些优化措施,能够显著提升数据库操作的效率和应用的性能。

2024-12-24 20:25:35 483

原创 MyBatis的一级、二级缓存

一级缓存是 MyBatis 内部的缓存,作用范围是SqlSession。每个SqlSession都有自己的一级缓存,当在同一个SqlSession中执行多次查询时,MyBatis 会将查询结果缓存在SqlSession的一级缓存中。若再次执行相同的查询操作,MyBatis 会直接从缓存中获取数据,而不再访问数据库。二级缓存是 MyBatis 提供的全局缓存,作用范围是Mapper 映射文件。它可以跨多个SqlSession存储数据,通常用于多个请求或多个用户之间共享缓存。一级缓存。

2024-12-23 14:04:32 728

原创 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别

一对一查询:可以通过标签来实现,它适用于一个表的记录与另一个表的记录一一对应的情况。一对多查询:可以通过标签来实现,或者使用嵌套查询(<select>标签)来执行一对多的查询。区别用于映射一对一的关系,而用于映射一对多的关系。联合查询一般适用于一对多的一次性查询,但在复杂查询中可能会出现数据重复或性能问题;嵌套查询则可以将父子表分开处理,但可能会导致多个查询的执行,影响性能。选择合适的实现方式,主要根据查询的复杂度、性能要求和实际业务需求来决定。

2024-12-21 11:32:26 1296

原创 接口绑定有几种实现方式

XML 映射方式:通过在 XML 文件中定义 SQL 语句,并在 Java 接口中声明方法进行绑定。注解方式:直接在 Java 接口方法上使用 MyBatis 提供的注解来定义 SQL 语句。混合方式:结合使用 XML 和注解,注解用于简单的 SQL 操作,XML 用于复杂的 SQL 或动态 SQL。根据项目的需求和复杂性,你可以选择最合适的方式。对于简单的 SQL,注解方式比较直观和方便;而对于复杂的查询和动态 SQL,XML 映射方式更为灵活。

2024-12-20 19:59:14 1004

原创 Mybatis是否支持延迟加载?它的实现原理是什么?

MyBatis 的延迟加载是通过动态代理机制实现的,使用SqlSession在访问时进行后续的查询。配置时,需要启用,并可以通过和标签设置某个属性的延迟加载。延迟加载在提高性能的同时也要注意SqlSession的生命周期和事务管理,以确保懒加载能够正常工作。

2024-12-19 10:00:28 602

原创 什么是MyBatis

MyBatis是一个流行的Java持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、改、查等)。MyBatis 继承了传统的 JDBC 编程方式,但通过提供更高层次的抽象,简化了 SQL 执行的过程,避免了大量的样板代码。MyBatis 是一个非常灵活且强大的持久层框架,适用于那些希望精确控制 SQL 执行的 Java 开发者。

2024-12-18 20:21:50 843

原创 路由传值的几种方式

路由传值的方式多种多样,每种方式都有其适用场景。在选择时,需要根据数据的敏感性、持久性、共享需求以及应用的架构来决定最合适的方式。例如,路径参数适用于传递资源 ID,查询参数适用于过滤和分页,状态管理适用于跨组件共享数据,localStorage 和 sessionStorage 适用于持久化数据存储等。

2024-12-17 20:20:26 895

原创 $route和$router的区别

router用于进行路由跳转和控制,提供了改变当前路由的能力。$route用于获取当前路由的信息,是一个只读对象,包含了当前路由的路径、查询参数、动态参数等。这两个对象通常一起使用,$router用来改变路由,$route用来访问当前路由的状态。

2024-12-16 20:19:41 190

原创 B-树和 B+树的区别

特性B-树B+树数据存储数据存储在内部节点和叶子节点数据只存储在叶子节点叶子节点链接不链接叶子节点按链表顺序链接查询效率查询时可能需要遍历多个节点查询效率较高,叶子节点按顺序存储范围查询不如B+树高效高效,通过叶子节点链表实现插入与删除操作较为复杂,可能涉及多个节点插入和删除操作较简单,只影响叶子节点内存使用节点存储数据,内存占用较大内部节点不存储数据,内存利用率更高。

2024-12-14 10:56:16 719

原创 路由之间是怎么跳转的?有哪些方式?

声明式跳转:通过<Link>或等标签实现,通常用于静态页面中的路由跳转。程序化跳转:通过等方法实现,通常用于事件处理、权限判断等动态场景。不同框架和技术栈提供了不同的路由机制,但基本原理相同,都是通过修改浏览器的 URL 地址来切换视图。

2024-12-13 20:24:47 1477

原创 vue组件之间是怎么传值的

父子组件传值:通过props从父传给子组件,通过$emit从子传给父组件。兄弟组件传值:可以通过父组件的中转来共享数据。跨组件传值:通过 Event Bus 或 Vuex 可以跨层级进行数据通信。状态管理:对于较大的应用,使用 Vuex 进行集中式状态管理更加高效和清晰。根据应用的复杂度和需求,选择合适的方式来进行组件间的通信。

2024-12-12 02:15:00 393

原创 Vue中有时候数组会更新页面,有时候不更新

直接修改数组的索引:Vue 不能检测到这种修改,需使用Vue.set()或。使用数组的变异方法:这些方法会触发视图更新。替换整个数组:替换数组本身会触发视图更新。Vue 版本差异:Vue 2.x 和 Vue 3.x 在响应式系统上有所不同。异步更新机制:Vue 的视图更新是异步的,可能存在延迟。通过了解这些常见的陷阱,你可以更好地控制 Vue 中数组数据的更新行为。

2024-12-11 19:42:13 598

原创 vue的生命周期

plaintextbeforeCreate // 实例刚创建,数据和事件未初始化 created // 实例创建完成,数据已初始化 beforeMount // 视图挂载前,模板尚未渲染 mounted // 视图挂载完成,DOM 已渲染 beforeUpdate // 数据更新前,视图未更新 updated // 数据更新后,视图已更新 beforeDestroy // 实例销毁前 destroyed // 实例销毁后。

2024-12-10 20:09:42 626

原创 MVVM和MVC区别

是一种经典的设计模式,适用于简单到中等复杂度的应用,特别是在 Web 开发中,它通过分离视图、控制器和数据模型,使得应用的逻辑更加清晰和可维护。

2024-12-09 19:55:32 1444

原创 红黑树的组成结构

红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree,BST),其每个节点都包含额外的颜色信息(红色或黑色)。红黑树不仅能够保证查找、插入和删除操作的最坏时间复杂度为 �(log⁡�)O(logn),而且通过平衡机制,使得树的深度尽可能小,从而提高了查找和操作的效率。

2024-12-07 21:21:54 445

原创 在数据结构中,树是什么?怎么形容一棵树

节点:树由节点组成,每个节点包含两部分:数据和指向子节点的引用(或指针)。根节点:树中有一个特殊的节点称为根节点(Root Node),它是树的起始点,没有父节点。子节点:每个节点可以有零个或多个子节点。父节点:每个节点除了根节点外,都有一个唯一的父节点(Parent Node)。叶节点:没有子节点的节点称为叶节点(Leaf Node)或终端节点。分支节点:至少有一个子节点的节点称为分支节点或内部节点(Internal Node)。

2024-12-06 19:53:54 886

原创 一次完整的HTTP请求所经历几个步骤?

的,因此客户端(比如浏览器)会与目标服务器建立一个 TCP 连接。当你在浏览器中输入一个 URL 或在应用程序中触发某个请求时,首先需要解析这个 URL,识别出协议、域名、路径等信息。服务器处理完请求后,会通过 TCP 连接向客户端返回一个 HTTP 响应报文。否则,在响应完成后,客户端和服务器会关闭 TCP 连接。一旦 TCP 连接建立,客户端会向服务器发送 HTTP 请求报文。服务器收到 HTTP 请求后,会根据请求的内容做出响应。在这个过程中,客户端和服务器之间的 TCP 连接就被建立起来了。

2024-12-05 18:22:22 731

原创 Socket和http的区别和应用场景

总结来说,Socket提供了更底层的网络通信能力,适用于需要直接控制网络通信的场景,而HTTP则更适合于Web应用和需要请求-响应模型的场景。

2024-12-04 20:20:39 587

原创 什么是TCP的三次握手

TCP(传输控制协议)的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据,并且初始化双方的序列号。如果任何一步失败,TCP协议会通过超时和重传机制来尝试重新建立连接。

2024-12-03 20:48:16 1716

原创 什么是TCP/IP和UDP

特性TCPUDP连接类型面向连接无连接可靠性高,保证数据完整与顺序低,数据可能丢失或乱序速度较慢,存在重传和确认机制快,无重传和确认机制流量控制与拥塞控制支持流量控制与拥塞控制不支持流量控制与拥塞控制错误检测与修复支持错误检测与修复仅支持错误检测,不支持修复使用场景文件传输、网页浏览、电子邮件等实时应用,如视频、语音传输、在线游戏。

2024-12-02 20:05:24 1500

原创 快速排序算法

快速排序是一种高效的排序算法,尤其适用于大规模数据的排序。通过合理选择基准和优化递归,可以避免最坏情况并保持其良好的平均性能。在很多实际应用中,快速排序被广泛使用。

2024-11-30 11:25:41 810

原创 插入排序算法

插入排序(Insertion Sort)是一种简单的排序算法,它的基本思想是将待排序的元素逐一插入到已排序的部分中,直到所有元素都被插入到正确的位置上。具体过程就像是你在玩扑克牌时,将牌插入到已经排好的牌中一样。

2024-11-29 19:18:50 922

原创 二分查找

**时间复杂度**:二分查找的时间复杂度为O(log n),其中n是数组的长度。1. **初始化**:设定两个指针,`low`指向数组的起始位置,`high`指向数组的结束位置。3. **结束**:如果循环结束时`low`大于`high`,则表示目标值不在数组中,查找失败。- **空间复杂度**:二分查找是原地算法,其空间复杂度为O(1),不需要额外的存储空间。- **前提条件**:二分查找要求数组必须是有序的,否则算法无法正确工作。- **效率高**:对于大型有序数组,二分查找比线性查找快得多。

2024-11-28 10:47:08 396

原创 B-TREE

B-Tree(B树)是一种自平衡的多路搜索树,它被广泛应用于数据库和文件系统中作为索引结构。B-Tree的设计目标是减少磁盘I/O操作,提高数据检索效率。

2024-11-27 17:31:04 269

原创

栈(Stack)是一种先进后出(Last In First Out, LIFO)的数据结构,它只允许在一端进行插入和删除操作。这一端被称为栈顶(Top),另一端被称为栈底(Bottom)。

2024-11-26 19:17:51 231

原创 什么是MyBatis?MyBatis的优缺点?

MyBatis 是一个支持定制化 SQL、存储过程以及高级映射的持久层框架。它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

2024-11-25 20:07:43 769

原创 权限管理是怎么实现的?表是怎么设计的?

权限管理的实现通常是通过角色和权限的关联来控制用户的访问。数据库设计上,通常会有用户表、角色表、权限表以及关联表来维护用户、角色与权限之间的关系。细粒度的权限控制可以通过对资源进行分级授权来进一步实现。一个好的权限管理系统不仅要确保系统的安全性,还要保证系统的灵活性和可扩展性,方便后续的管理与维护。

2024-11-23 11:35:31 1438

原创 幻读是什么?用什么隔离级别可以防止幻读?

幻读:在一个事务中,两次相同的查询返回的结果集不同,通常是由于其他事务在两次查询之间插入了新数据。防止幻读的隔离级别序列化(Serializable)是唯一可以完全防止幻读的隔离级别。在实际应用中,选择隔离级别时需要权衡数据一致性和并发性能。序列化隔离级别虽然可以防止幻读,但可能会导致性能下降,因为它限制了并发执行的事务数量。

2024-11-22 20:15:28 710

原创 MySQL 中有哪几种锁?

这些锁的类型和用途不同,但共同目的是确保在并发环境中数据的一致性和完整性。InnoDB存储引擎默认使用行级锁,因为它提供了比表锁更高的并发性和更好的性能。

2024-11-21 12:15:00 441

原创 MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

读未提交:允许读取未提交的数据,导致脏读、不可重复读和幻读。读已提交:防止脏读,但不可重复读和幻读可能发生。可重复读:防止脏读和不可重复读,但幻读可能发生。串行化:防止所有类型的数据不一致,包括脏读、不可重复读和幻读,但性能最差。在实际应用中,选择合适的事务隔离级别需要根据具体的应用场景和数据一致性要求来平衡。

2024-11-20 19:25:34 589

原创 SQL 之连接查询(左连接和右连接的区别)

数据完整性:左连接保证左表的所有数据都被包含,而右连接保证右表的所有数据都被包含。结果集大小:左连接的结果集可能比右连接小,因为左连接只包含左表的数据和匹配的右表数据,而右连接包含右表的所有数据。使用场景:左连接常用于需要显示左表所有记录的情况,即使它们在右表中没有匹配项。右连接则用于需要显示右表所有记录的情况,即使它们在左表中没有匹配项。在实际应用中,选择使用左连接还是右连接取决于具体的业务需求和数据关系。

2024-11-19 19:04:06 841

原创 JVM基本结构

局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。Java栈(Java Stack):每个线程都有自己的Java栈,用于存放局部变量、操作数栈、动态链接等信息。它包括三个主要的类加载器:引导类加载器、扩展类加载器和应用程序类加载器。本地方法栈和虚拟机栈类似,只不过虚拟机栈是给JVM使用的,本地方法栈是给本地方法使用的。方法区(Method Area):存放类的结构信息,如字段、方法、常量池等。

2024-11-18 20:14:46 573

原创 sleep和wait 方法

start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。但是,直接执行 run() 方法,会把 run() 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify()或者 notifyAll() 方法。sleep()方法执行完成后,线程会自动苏醒,或者也可以使用 wait(long timeout) 超时后线程会自动苏醒。

2024-11-16 11:33:59 593

空空如也

空空如也

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

TA关注的人

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