# 持久层与数据库
# MyBatis
# 基本使用
- 接口 + XML/注解 映射 SQL;SqlSessionFactory 由配置构建;SqlSession 执行语句。与 Spring 集成:SqlSessionFactoryBean、MapperScan 扫描 Mapper 接口。
# 动态 SQL
- <if>、<choose/>when/otherwise、<where>、<set>、<foreach>、<trim>。避免拼接导致语法错误与注入;OGNL 表达式。
# 插件机制
- 拦截器 Interceptor;可拦截 Executor、StatementHandler、ParameterHandler、ResultSetHandler。实现 Interceptor,@Intercepts 指定签名;常用于分页、审计、加解密。
# 一级缓存与二级缓存
- 一级:SqlSession 级别;同一 Session 内相同查询走缓存;增删改会清空该 Session 缓存;默认开启。
- 二级:Mapper 命名空间级别;跨 SqlSession;需显式开启,并实现序列化;集群需考虑分布式缓存。生产常关二级,用 Redis 等替代。
# 批量操作
- ExecutorType.BATCH;foreach 拼 insert(注意 SQL 长度与占位符限制);或 BatchExecutor 提交多条语句。
# #{} 与 ${}
- #{} 预编译占位符,防注入;${} 字符串替换,有注入风险,仅用于动态表名/列名等且需校验。
# MyBatis Plus
- 基于 MyBatis,增强不改变结构。BaseMapper 提供 insert/selectById/updateById/delete 等;Wrapper 条件构造(QueryWrapper、LambdaQueryWrapper、UpdateWrapper)。
- 分页:PaginationInnerInterceptor;逻辑删除:@TableLogic。代码生成器可生成 entity/mapper/service。
# SQL 优化
# 索引设计
- 区分度高的列、常查常排常分组的列;联合索引注意最左前缀;避免过多索引(写代价、空间)。
- 覆盖索引避免回表;索引下推减少回表次数。
# 执行计划 explain
- type:const/ref/range/index/all,越前越好;possible_keys、key、rows、Extra(Using index、Using filesort、Using temporary 等)。关注是否走索引、是否全表、是否临时表/排序。
# 慢查询日志
- 开启 slow_query_log、设置 long_query_time;分析慢 SQL,加索引、改写法、拆库表。
# 常见优化点
- 避免 SELECT *;避免在索引列上函数/运算;避免隐式类型转换;小表驱动大表(in/exists 视数据量);分页大偏移用延迟关联或游标。
# 事务(Spring)
- @Transactional:声明式;传播行为(REQUIRED、REQUIRES_NEW、NESTED 等)、隔离级别、只读、回滚规则。同一线程内同一数据源保证同一连接。方法内部自调用不经过代理,事务不生效,需注入自身或拆到另一 Bean。
← Spring 全家桶 中间件 →