0%

面向对象编程三大特性:封装、继承、多态

面向对象编程(OOP)是一种以 “对象” 为核心的编程范式,其三大核心特性 ——封装继承多态—— 是构建灵活、可维护代码的基础。本文将从概念、实现、作用及示例等方面,详细解析这三大特性。

封装(Encapsulation)

封装是指将对象的状态(属性)和行为(方法)捆绑在一起,并通过访问控制隐藏内部实现细节,仅暴露必要的接口供外部交互。其核心思想是 “信息隐藏”,目的是保护数据完整性、降低代码耦合度。

封装的实现方式

  • 访问修饰符:通过private、protected、public和默认(包访问)修饰符控制属性和方法的可见性。
    • private:仅当前类可见(隐藏内部状态的核心);
    • protected:当前类、子类及同包类可见;
    • public:所有类可见(暴露的接口);
    • 默认(无修饰符):仅同包类可见。
  • getter/setter 方法:对私有属性(private)提供公共的 get(读取)和 set(修改)方法,在方法中可添加校验逻辑,确保数据合法。

示例:封装一个学生类

阅读全文 »

MyBatis 核心组件:SqlSession 全解析(创建、实现、线程安全与四大执行对象)

SqlSession 是 MyBatis 中连接开发者与底层数据库操作的核心接口,封装了数据库 CRUD、事务管理、缓存控制等核心能力。本文基于 SqlSession 接口定义、DefaultSqlSession 实现及 SqlSessionManager 源码,从 “接口定位→创建流程→实现逻辑→线程安全→底层协作” 五个维度,彻底拆解 SqlSession 的工作机制,同时关联 Executor 等四大核心对象,帮你掌握 MyBatis 会话管理的本质。

SqlSession 接口:MyBatis 会话的 “入口协议”

SqlSession 相当于 JDBC 中的 Connection,但功能更丰富 —— 不仅是数据库连接的封装,还提供了 Mapper 接口绑定、缓存管理、事务控制等能力。其接口定义按功能可分为 5 大类方法,覆盖所有数据库交互场景。

1. 核心方法分类与解析

(1)查询方法:select* 系列

查询方法是 SqlSession 最常用的功能,支持单结果、多结果、Map 结果、游标(Cursor)等多种返回形式,核心差异在于结果处理方式:

方法签名 功能说明 适用场景
<T> T selectOne(String statement) 执行 SQL,返回单个结果(无参数) 无参单结果查询(如 select count(*)
<T> T selectOne(String statement, Object param) 执行 SQL,传入参数,返回单个结果 有参单结果查询(如 selectById(1)
<E> List<E> selectList(String statement) 执行 SQL,返回结果列表(无参数) 无参多结果查询(如 selectAll()
<E> List<E> selectList(..., RowBounds rb) 传入 RowBounds(起始索引 + 条数),实现逻辑分页 逻辑分页查询(不推荐生产,见前文)
<K,V> Map<K,V> selectMap(..., String mapKey) 将结果列表转为 Map,mapKey 为 Map 的键(需是结果中的某个属性) 需快速通过某个属性查找结果(如按 id 查 User)
<T> Cursor<T> selectCursor(...) 返回游标对象,支持流式读取(避免一次性加载大量数据到内存) 大数据量查询(如导出 10 万条数据)
void select(..., ResultHandler handler) 无返回值,结果由自定义 ResultHandler 处理(灵活控制结果封装) 特殊结果处理(如直接写入文件)

关键细节

  • selectOne() 本质是调用 selectList() 后取第一个元素,若结果集 size > 1 会抛出 TooManyResultsException
  • RowBounds 实现逻辑分页(先查全表再截取),生产环境需用物理分页(如 PageHelper);
  • Cursor 是 MyBatis 3.4+ 新增功能,基于 JDBC 的 ResultSet 流式读取,适合大数据量场景,避免 OOM。
(2)修改方法:insert/update/delete

MyBatis 将 insert、update、delete 统一归为 “修改操作”,底层均委托给 Executor.update() 方法,返回值为受影响的行数

阅读全文 »

优化 IntelliJ IDEA 项目构建速度:解决 Build 缓慢与 GC 问题

IntelliJ IDEA 作为主流的 Java 开发工具,在处理大型项目时常常遇到构建(Build)缓慢甚至触发 GC(垃圾回收)的问题。仅仅调整 IDE 内存配置往往无法彻底解决,需要结合编译参数、自动编译策略等多方面优化。本文将详细介绍针对性的解决方案。

核心问题分析

大型项目构建缓慢或触发 GC 的常见原因:

  1. 编译堆内存不足:IDEA 编译模块默认堆内存较小(700M),无法满足大型项目需求,导致频繁 GC。
  2. IDE 内存配置不合理:JVM 堆内存(Xms/Xmx)设置过小,影响 IDE 整体性能。
  3. 增量编译未生效:每次构建都执行全量编译,重复处理未修改的代码。
  4. 不必要的编译任务:如自动编译触发时机不当,或开启了不必要的编译检查。

分步优化方案

1. 调整 IDE 自身 JVM 内存配置

虽然单独调整内存无法彻底解决编译问题,但合理的配置是基础:

  • 配置文件位置

    • Windows:C:\Program Files\JetBrains\IntelliJ IDEA xxxx.x\bin\idea64.exe.vmoptions
    • Mac:/Applications/IntelliJ IDEA.app/Contents/bin/idea.vmoptions
    • 也可通过 IDE 菜单打开:Help → Edit Custom VM Options
  • 推荐配置(根据内存调整)

    1
    2
    3
    4
    5
    -Xms1024m        # 初始堆内存(建议设为物理内存的 1/8)
    -Xmx4096m # 最大堆内存(建议设为物理内存的 1/4,如 16G 内存可设为 4096m)
    -XX:ReservedCodeCacheSize=1024m # 代码缓存(大型项目建议 1024m)
    -XX:+UseG1GC # 使用 G1 收集器,减少 GC 停顿
    -XX:MaxGCPauseMillis=200 # 目标 GC 停顿时间(毫秒)
  • 生效方式:修改后重启 IDE。

2. 增大编译模块堆内存(关键优化)

IDEA 的编译模块(javac)有独立的堆内存限制,默认 700M,大型项目需手动调大:

设置编译堆内存

  1. 打开配置页面:File → Settings → Build, Execution, Deployment → Compiler
  2. 找到 Build process heap size (Mbytes),默认值为 700。
  3. 根据项目大小调整:
    • 中型项目:1500-2000M
    • 大型项目:2000-4000M(如设置为 2048M)。
  4. 点击 Apply 保存。
阅读全文 »

本地开发效率提升:将 Consul 设置为 Windows 开机自启的完整方案

在微服务开发中,Consul 作为服务注册中心是很多项目的基础依赖。但每次启动项目前手动启动 Consul,不仅繁琐还容易遗忘,经常导致服务启动失败。本文分享一种简单可靠的方案,通过 Windows 开机自启功能自动启动 Consul,彻底解决这个痛点。

基础方案:利用系统启动目录实现自启

Windows 系统提供了便捷的开机启动机制,只需将程序或脚本放入特定目录,即可实现开机自动运行。这种方式无需复杂配置,适合快速上手。

步骤 1:准备文件

  • 将 Consul 的可执行文件(consul.exe)复制到本地目录(建议路径不含中文和空格,如 C:\Tools\Consul)。
  • 新建一个启动脚本(start_consul.bat),用于自动化启动流程。

步骤 2:编写启动脚本

脚本的核心作用是切换到 Consul 所在目录,检查文件完整性,并启动服务。优化后的脚本如下:

阅读全文 »

ZooKeeper 核心原理与实践解析

ZooKeeper 作为分布式系统中的 “协调者”,在解决集群协同问题上扮演着关键角色。以下从核心原理、工作机制和典型应用场景展开说明,帮助深入理解其设计与价值。

为什么需要zookeeper

对于多线程的弊端,看下图

阅读全文 »