一、缓存机制MyBatis 提供二级缓存机制,用于提升查询性能:
缓存级别
作用范围
开启方式
特点
一级缓存
单个 SqlSession(当前事务共享)
默认开启
生命周期与 SqlSession 一致,查询结果自动缓存
二级缓存
多个 SqlSession(所有事务共享)
需手动配置开启
跨 SqlSession 共享,需实体类实现序列化
缓存特性对比
维度
一级缓存
二级缓存
作用域
小
大
与数据库距离
近
远
访问速度
快
慢
缓存容量
小
大
命中率
高
低
二、插件机制MyBatis 基于拦截器(Interceptor) 实现插件功能,可对以下四大核心对象进行拦截增强:
ParameterHandler:参数处理
ResultSetHandler:结果集处理
StatementHandler:SQL 语句处理
Executor:执行器(SQL 执行逻辑)
作用:在 SQL 执行的全生命周期(如参数解析、结果封装、SQL 执行前后)插入自定义逻辑,实现功能扩展(如分页、SQL 监控)。
三、PageHelper 分页插件 ...
动态 SQL 是 MyBatis 核心特性之一,支持根据不同条件动态拼接 SQL 语句,灵活适配复杂业务场景。
一、核心标签分类
标签类型
包含标签
作用
条件判断
<if>、<where>、<choose>
按条件动态拼接 SQL 片段
片段控制
<trim>、<set>
智能处理 SQL 片段的前缀、后缀(如 WHERE、SET 关键字)
循环遍历
<foreach>
遍历集合 / 数组,动态生成批量操作 SQL
片段复用
<sql>、<include>
抽取可复用的 SQL 片段,提升代码复用性
二、条件判断标签1. <if> + <where>作用:根据条件动态拼接 WHERE 子句,自动处理 AND/OR 关键字冗余问题。
示例:
1234567891011<select id="selectEmployeeByCondition" resultType="employee&q ...
延迟加载(懒加载)是 MyBatis 分步查询的重要特性,指关联数据仅在被访问时才会触发查询,而非在主查询时一次性加载,可大幅优化性能。
一、延迟加载的开启配置需在 MyBatis 全局配置中开启以下两项:
mybatis.configuration.lazy-loading-enabled=true:全局开启延迟加载。
mybatis.configuration.aggressive-lazy-loading=false:关闭 “激进式懒加载”(确保仅在访问关联属性时才触发分步查询,而非加载主对象时一次性加载所有关联)。
二、延迟加载与分步查询的关系延迟加载是分步查询的性能增强特性:
分步查询负责将关联查询拆分为多次单表查询;
延迟加载负责控制这些分步查询的执行时机(仅当关联属性被访问时才执行)。
三、作用与优势
性能优化:避免加载未使用的关联数据,减少数据库查询次数和数据传输量。
按需加载:仅在业务需要时加载关联数据,贴合实际使用场景。
四、注意事项
延迟加载仅在分步查询场景下生效,若关联查询是通过 JOIN 实现的,无法触发延迟加载。
若需临时禁用某条 SQL 的延迟加 ...
分步查询是 MyBatis 处理关联关系(一对一、一对多) 的高效方式,核心是将复杂关联查询拆分为多次独立单表查询,按需加载数据,支持延迟加载,同时降低代码耦合度。
一、核心标签与属性分步查询通过 resultMap 中的关联标签实现,核心属性如下:
标签
作用场景
核心属性
association
一对一关联
select:下一步查询的 Mapper 方法全路径javaType:关联对象的类型column:传递给下一步的参数列
collection
一对多关联
select:下一步查询的 Mapper 方法全路径ofType:集合中元素的类型column:传递给下一步的参数列
select:必须指定「命名空间 + 方法名」,确保能找到目标查询方法
column:支持单个参数(column="字段名")或多个参数(column="{paramKey=字段名, ...}")
二、基础分步查询实现1. 一对一分步查询(association)场景:查询订单(Order)时,分步加载关联的客户(Custome ...
一、返回普通数据用于封装基本类型(如 Long、Integer)或普通对象(如实体类),通过 resultType 配置。
示例123456789<!-- 封装实体类 --><select id="getEmp" resultType="com.atguigu.mybatis.entity.Employee"> select * from `t_emp` where id = #{id}</select><!-- 封装基本类型 --><select id="countEmp" resultType="java.lang.Long"> select count(*) from `t_emp`</select>
小提示
若开启 mapUnderscoreToCamelCase = true(MyBatis 全局配置),可自动将数据库下划线命名(如 emp_name)映射为 Java 驼峰命名(如 empName)。 ...
一、#{} 与 ${} 的核心区别
语法
底层实现
编译方式
安全特性
适用场景
#{}
PreparedStatement
预编译
防 SQL 注入
大部分参数传递场景(推荐优先用)
${}
Statement
字符串拼接
有 SQL 注入风险
表名、列名动态拼接(需手动防注入)
二、参数传递场景与取值方式1. 单个参数
普通类型(如 Long、String):
示例方法:Employee getEmpById(Long id);
XML 取值:#{id}
List 类型:
示例方法:List<Employee> getEmpByIds(List<Long> ids);
XML 取值:#{ids[0]}(取列表第一个元素,可遍历)
对象类型:
示例方法:int addEmp(Employee emp);(Employee 含 name、age 属性)
XML 取值:#{name} ...
一、Mapper XML 基础结构1234567<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="全限定接口名"> <!-- CRUD 标签在此定义 --></mapper>
<?xml ... ?>:XML 文档声明,指定版本和编码。
<!DOCTYPE ... >:MyBatis Mapper 的 DTD 约束,用于校验 XML 结构合法性。
<mapper namespace="...">:命名空间,需与对应的 Mapper 接口全类名一致,是 XML 与接口绑定的关键。
二、M ...
MySQL
未读一、整体优化策略(8 大维度)1. 选择合适的存储引擎
核心原则:引擎作用于单个表,需根据表的业务场景选型(而非全局统一)
常用引擎:InnoDB(默认首选,支持事务、行锁、外键,适合高并发 / 数据一致性场景)、MyISAM(读多写少、无事务需求,如日志表)
2. 优化 MySQL 服务配置(my.ini 配置文件)
关键参数:
DEFAULT_STORAGE_ENGINE:指定默认存储引擎(推荐设为 InnoDB)
INNODB_BUFFER_POOL_SIZE:InnoDB 缓存池大小(建议设为物理内存的 50%-70%,提升数据缓存命中率)
其他补充:max_connections(最大连接数)、query_cache_size(查询缓存,按需开启)等
3. 创建高效索引
核心目标:减少全表扫描,加速查询
设计原则:
针对查询频繁的字段(where、join、order by 字段)建立索引
避免过度索引(索引会降低写入性能)
复合索引遵循「最左前缀原则」
4. 合理使用主外键
作用:保证数据完整性(外键关联父表主键)
注意:避免不必要的外键(高并发写入 ...
MySQL
未读本文档整理了 MySQL 数据库的删除、服务管理、常用命令及数据备份恢复操作,适用于日常基础运维参考。
一、MySQL 数据库删除
先通过命令停止 MySQL 服务,避免文件占用。
进入系统 “控制面板 - 程序和功能”,找到 MySQL 相关程序并卸载。
删除 MySQL 安装目录下的残留文件(如默认路径 C:\Program Files\MySQL)。
清除注册表残留(可选,新手谨慎操作),通过 regedit 打开注册表,删除 HKEY_LOCAL_MACHINE\SOFTWARE\MySQL 等相关键值。
二、MySQL 服务管理通过命令行或系统工具可快速查看、启动、关闭 MySQL 服务,具体操作如下:
操作目的
执行方式
具体命令 / 步骤
查看服务列表
运行对话框
按下 Win+R,输入 services.msc 回车,在列表中找到 MySQL 服务
启动服务
命令提示符(管理员)
输入 net start mysql 回车
关闭服务
命令提示符(管理员)
输入 net stop mysql 回车
三、MySQL 常用核心命令所有命令需 ...
一、核心目标本文围绕自定义 MyAtomicInteger 类展开,拆解其底层实现逻辑,掌握 CAS 无锁编程思想、volatile 可见性保障、Unsafe 类的核心作用,理解 Java 原子类(如 AtomicInteger)的底层原理,解决多线程下变量自增的线程安全问题。
二、自定义 MyAtomicInteger 完整代码(无修改)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364import sun.misc.Unsafe;import java.lang.reflect.Field;public class MyAtomicInteger { // 核心依赖:Unsafe类(直接操作内存、执行CAS原子指令) private static final Unsafe unsafe = getUnsafe(); // value变量在对象中的内存偏移地址(U ...


















