MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口即Mapper接口。接口的全限名(命名空间)就是映射文件中的namespace的值,用于绑定Dao接口;接口的方法名就是映射文件中Mapper的Statement的id值;接口方法内的参数就是传递给sql的参数。
在Mybatis中,每一个 <select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象,用于描述一条SQL语句。Mapper接口是没有实现类的,当调用接口方法时,由接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。
举例来说:cn.mybatis.mappers.StudentDao.findStudentById,可以唯一找到namespace为 com.mybatis.mappers.StudentDao下面 id 为 findStudentById 的 MapperStatement。
<mapper namespace="cn.mybatis.mappers.StudentDao">
<select id="findStudentById" parameterType="Long" resultType="com.po.Student">
select * from tb_student where id=#{id}
</select>
</mapper>
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。
那什么是动态代理呢?动态代理就是在程序运行期间由JVM通过反射等机制动态生成的,所以不会存在代理类的字节码文件,故我们在Mybatis中使用mapper接口的时候没有它的实现类,代理对象和真实对象的关系是由运行时期才决定的。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南