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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM