Java 面试题:MyBatis #{} vs ${} 与缓存

一、#{} 与 ${} 的区别

写法 处理方式 用途
#{} 预编译占位符,自动加引号、防注入 参数值(默认)
${} 字符串拼接,不转义 表名/列名/排序(需白名单)

永远优先 #{};${} 仅用于动态表名/排序字段,必须对值做白名单校验,否则 SQL 注入。

二、缓存

  • 一级缓存:SqlSession 级别,同一会话内查询缓存,提交/关闭失效;
  • 二级缓存:namespace 级别,跨 SqlSession,默认关闭,需实体序列化;
  • 分布式下二级缓存易不一致,常用 Redis 替代。

三、其他考点

  • 延迟加载:association/collection 按需加载,避免 N+1;
  • 插件(拦截器):分页、审计、加解密;
  • 动态 SQL:if/choose/foreach/trim 拼条件;
  • 与 Hibernate 区别:MyBatis 半自动、SQL 可控、轻量;Hibernate 全自动、对象化但调优难。