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