Java面试题更新 2026-08-03

在使用 MyBatis 时,只要定义一个 DAO 接口并编写对应的 XML 映射文件,就能直接执行 SQL 操作,而不需要手动实现接口类。请解释这种机制背后的工作原理是什么?

考察说明

考查对 MyBatis 动态代理和映射绑定机制的理解。

回答思路

  1. 【回答框架 1】MyBatis 启动时解析 XML 映射文件,将每个 SQL 语句封装为 MappedStatement,并记录命名空间、语句 ID 与 DAO 接口方法之间的对应关系。
  2. 【回答框架 2】DAO 接口通过 JDK 动态代理创建代理对象,代理对象在方法调用时根据方法所在接口和名称匹配对应的 MappedStatement。
  3. 【回答框架 3】代理对象将方法参数转换为 SQL 参数,交给 SqlSession 执行 SQL,并利用类型处理器完成参数和结果集的映射。
  4. 【回答框架 4】MyBatis 注册 Mapper 时会将接口的全限定名作为命名空间,确保 XML 中的每个语句 ID 能唯一对应一个接口方法。
  5. 【回答框架 5】整个过程只需接口方法和 XML 定义,无需实现类,因为代理在运行时拦截调用并委派给 SqlSession。
  6. 【关键点 1】MyBatis 通过 JDK 动态代理为 DAO 接口生成实现。
  7. 【关键点 2】XML 命名空间与接口全限定名绑定,语句 ID 对应方法名。
  8. 【关键点 3】MappedStatement 保存 SQL 与映射信息,代理据此执行。
  9. 【关键点 4】参数和结果通过类型处理器自动转换。
  10. 【关键点 5】运行时无需编写接口实现类,代理自动完成 SQL 调用。
  11. 【易错点 1】不能想当然认为代理直接执行 XML 中的原 SQL,实际仍由 SqlSession 中的执行器处理。
  12. 【易错点 2】如果接口方法参数是简单类型,需要显式使用 @Param 注解,否则参数名可能无法正确映射。
  13. 【易错点 3】只向代理注册接口和 XML 绑定,但 XML 缺失或命名空间错误会导致启动时绑定失败,而不是运行时才能发现问题。