一、#{} 与 ${} 的区别
| 写法 | 处理方式 | 用途 |
|---|---|---|
| #{} | 预编译占位符,自动加引号、防注入 | 参数值(默认) |
| ${} | 字符串拼接,不转义 | 表名/列名/排序(需白名单) |
永远优先 #{};${} 仅用于动态表名/排序字段,必须对值做白名单校验,否则 SQL 注入。
二、缓存
- 一级缓存:SqlSession 级别,同一会话内查询缓存,提交/关闭失效;
- 二级缓存:namespace 级别,跨 SqlSession,默认关闭,需实体序列化;
- 分布式下二级缓存易不一致,常用 Redis 替代。
三、其他考点
- 延迟加载:association/collection 按需加载,避免 N+1;
- 插件(拦截器):分页、审计、加解密;
- 动态 SQL:
if/choose/foreach/trim拼条件; - 与 Hibernate 区别:MyBatis 半自动、SQL 可控、轻量;Hibernate 全自动、对象化但调优难。