倚楼听风雨
淡看江湖路

MyBatis 常见笔试题面试题整理

MyBatis 的 $ 与 # 的区别?各自的使用场景?

这个问题都快被问烂了,不过这题考查的就是你有没有真正的使用过 MyBatis,所以还是值得拿出来说一下。

#{}

井号多半是用来对参数进行处理。相当于 JDBC 的 PreparedStatement 封装,所以进行SQL预编译时,传参位置会使用「?」占位来防止 SQL 注入。JDBC 示例:

比如再传入String类型,实际的 SQL 结果会为参数加上双引号。

${}

Dollar 符号主要用于需要动态传入表名或列名时使用。对于参数的取出不做任何处理,直接放入语句中。所以这样的参数参加SQL的预编译,需要我们手动过滤参数防止 SQL注入的情况。

另外,这属于 MyBatis 核心处理层中的参数映射内容,源码中有一个 scripting 模块,就是负责根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句。然后处理 SQL 语句中的占位符,绑定用户传入的实参。

MyBatis 的 DAO 接口跟 XML 文件里面的SQL 是如何建立关系的?

这个问题就涉及到 MyBatis 的底层原理了,想要回答的这个问题就必须对 MyBatis 的源码架构有所了解。

在 idea 中导入 MyBatis 源码是非常简单的,在 MyBatis 的 GitHub 主页下载 3.4.x 源码包以 Maven 项目的形式导入到 idea 中即可。至于源码的阅读推荐《MyBatis 技术内幕》这本书,文末 PDF 电子版自助获取。本题答案源自于对本书的参考总结。

接下来看一下 MyBatis 的模块架构:

MyBatis 常见笔试题面试题整理的图片-高老四博客

我们知道,MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。初始化之后我们会得到根据配置文件的内容创建的 SqlSessionFactory 对象,然后,通过 SqlSessionFactory 对象创建 SqlSession 对象,SqlSession 接口中定义了执行 SQL 语句所需要的各种方法;之后,通过 SqlSession 对象执行映射配置文件中定义的 SQL 语句,完成相应的数据操作;最后,通过 SqlSession 对象提交事务,关闭 SqlSession 对象。

在以上过程中,Mapper 接口与映射配置文件的关联就是图中的 Binding 模块来处理的。

在 MyBatis 源码中,Binding 模块有单独的目录包,里面的类如下:

  • BindingException
  • MapperMethod
  • MapperProxy
  • MapperProxyFactory
  • MapperRegistry

我们知道 Mapper 接口是不需要写具体的实现的,这些声明的方法会在 MyBatis 初始化的过程中与映射配置文件中定义的 SQL 语句相关联,如果无法关联,就会抛出上面这个「BindingException」异常。那么关联的过程靠的就是上面这四个核心类的实现了,其中「MapperRegistry」是 Mapper 接口及其对应的代理对象工厂的注册中心,这个类负责记录 Mapper 接口与 MapperProxyFactory 的关系,这个 MapperProxyFactory 顾名思义就是 MapperProxy 的工厂类,负责创建 MapperProxy 对象。而这个 MapperProxy 就是 MyBatis 通过 JDK 动态代理为 Mapper 接口生成的代理对象,这个代理对象负责处理 Mapper 接口中声明的方法、参数等与映射配置文件相对应,其中 MapperMethod 封装了 Mapper 接口中对应方法的信息,以及对应 SQL 语句的信息。所以最后这个 MapperMethod 类就是连接 Mapper 接口以及映射配置文件中定义的 SQL 语句的桥梁,这个类里面记录了 SQL 语句的名称和类型以及Mapper 接口中对应方法的相关信息,最后通过 SqlSession 对应的方法完成数据库操作。

待续

待续,持续更新!

相关文章阅读

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。

资源下载

隐藏内容:******,购买后可见!

下载价格:0 G币

您需要先后,才能购买资源

欢迎访问高老四博客(glorze.com),本站技术文章代码均为老四亲自编写或者借鉴整合,其余资源多为网络收集,如涉及版权问题请与站长联系。如非特殊说明,本站所有资源解压密码均为:glorze.com。

赞(21) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » MyBatis 常见笔试题面试题整理

开始你的表演 抢沙发

觉得文章有用就打赏一下老四,鼓励我更好的创作

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册