• 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接口的时候没有它的实现类,代理对象和真实对象的关系是由运行时期才决定的。


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    【JAVA实例】for循环实现猜数字游戏
    【python基础】常见模块:openpyxl & socket & requests
    【python实例】飞机大战
    【python实例】文件操作实例
    【python基础】单例模式 & 工厂模式 & 策略模式 & 观察者模式
    【python基础】os模块(库)方法汇总
    【python基础】文件读取
    【深度学习】paddlepaddle——基于多层神经网络的图像识别案例
    斑马斑马-15-微信小程序-基础语法
    斑马斑马-11-微信小程序-布局谋篇
  • 原文地址:https://www.cnblogs.com/east7/p/14697785.html
Copyright © 2020-2023  润新知