更新时间:2026年5月 | 来源:真实面经汇总 | 每道题3句话答案+代码片段
#{}是预编译占位符,会被替换为?,通过PreparedStatement安全设置参数,防止SQL注入。${}是字符串直接拼接,存在SQL注入风险,只用于表名、字段名等动态替换场景。-- #{}
SELECT * FROM user WHERE id = #{id} -- SQL: WHERE id = ?
-- ${}(危险)
SELECT * FROM user ORDER BY ${column} -- 仅此场景,加白名单
<cache>开启,多个SqlSession共享。<mapper namespace="UserMapper">
<cache eviction="LRU" flushInterval="60000" size="512"/>
</mapper>
PageHelper.startPage(page, size)。PageHelper.startPage(1, 10); List<User> list = userMapper.selectAll(); // SQL自动加 LIMIT 0,10
lazyLoadingEnabled=true + aggressiveLazyLoading=false<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
BaseMapper.selectById()),不用写XML。// MyBatis-Plus:一行代码查全部
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>().eq(User::getStatus, 1)
);
<if>:条件判断;<where>:自动去掉第一个AND/OR。<foreach>:遍历集合生成IN查询;<trim>:自定义截断。<choose> <when> <otherwise>实现多分支条件,类似switch-case。resultType:自动映射,要求数据库字段名和Java属性名完全一致。resultMap:手动定义映射关系,处理字段名不一致、嵌套对象、一对多/多对一场景。<association>标签,如User关联Dept。<collection>标签,如Dept包含List<User>。@Intercepts注解声明拦截点,@Signature指定拦截的方法。@Intercepts(@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class}))
public class SlowSqlInterceptor implements Interceptor { ... }
<foreach>拼VALUES多行——一条SQL插多条,但数据量大时SQL过长可能导致OOM。saveBatch或JDBC的executeBatch——每1000条一批。☕ 这10道题帮到你了?
请作者喝杯咖啡,创作更多面试干货
扫码赞赏 · 支持开源工具