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接口的時候沒有它的實現類,代理對象和真實對象的關系是由運行時期才決定的。