通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement

com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个、、、标签,都会被解析为一个MappedStatement对象。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

mybatis的两种分页方式:RowBounds和PageHelper
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select * from student,拦截sql后重写为:
select t.* from (select * from student)t limit 0,10

Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

简述Mybatis的插件运行原理,以及如何编写一个插件。

答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

Mybatis连接池

不使用数据库连接池时、正常使用数据库连接的情况下、当使用完毕之后我们就会调用其close()方法来关闭连接、避免资源浪费。但是当使用了数据库连接池之后、一个数据库连接被使用完之后就不再是调用其close方法关闭掉、而是应该将这个数据库连接放回连接池、那么我们就要拦截Connection.close()方法、将这个Connection放回连接池、而不是关闭。
使用动态代理的方式实现上述功能、PooledConnection实现了InvocationHandler接口、并提供了invoke方法的实现。

spring dataSource连接池的配置
公司的配置

MyBatis中井号与美元符号的区别
#{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。

select * from tablename where id = #{id}
假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是’12’,如果id为整型,那么id就是12,并且MyBatis会将上面SQL语句转化为jdbc的select * from tablename where id=?,把?参数设置为id的值。

${变量名}不进行数据类型匹配,直接替换。

select * from tablename where id = i d 如 果 字 段 i d 为 整 型 , s q l 语 句 就 不 会 出 错 , 但 是 如 果 字 段 i d 为 字 符 型 , 那 么 s q l 语 句 应 该 写 成 s e l e c t ∗ f r o m t a b l e w h e r e i d = ′ {id} 如果字段id为整型,sql语句就不会出错,但是如果字段id为字符型, 那么sql语句应该写成select * from table where id = ' id如果字段id为整型,sql语句就不会出错,但是如果字段id为字符型,那么sql语句应该写成select∗fromtablewhereid=′{id}’。

#方式能够很大程度防止sql注入。

$方式无法方式sql注入。

$方式一般用于传入数据库对象,例如传入表名。

尽量多用#方式,少用$方式。

MyBatis 延迟加载(懒加载)
如果想要开始延迟加载功能,就需要在总配置文件 SqlMapConfig.xml 中配置 setting 属性,也就是将延迟加载 lazyLoadingEnable 的开关设置成 teue ,由于是按需加载,所以还需要将积极加载修改为消极加载,也就是将 aggressiveLazyLoading 改为 false

mybatis面试题集锦相关推荐

  1. Mybatis面试题集锦 那些经常问到的Mybatis面试30题

    1.什么是Mybatis? MyBatis 是一款优秀的支持自定义 SQL 查询.存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索. MyBatis 可以使 ...

  2. Java面试题集锦(含答案)

    Java面试题集锦 Java基础 1.ArrayList.Vector和LinkedList有什么区别? 答:ArrayList底层实现是数组,查找快,增删慢,线程不安全 Vector 和ArrayL ...

  3. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  4. J2EE面试题集锦(附答案)

    转自:http://blog.sina.com.cn/s/blog_4e8be0590100fbb8.html J2EE面试题集锦(附答案) 一.基础问答 1.下面哪些类可以被继承? java.lan ...

  5. [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦

    微软等100题系列V1.0版整理IV:字符串+数组面试题集锦 July   2010年12月30日 第4章 字符串+数组面试题 在微软等100题系列V0.1版中,此类字符串+数组的问题,占了足足22道 ...

  6. python面试题及答案-50道Python面试题集锦(附答案)

    原标题:50道Python面试题集锦(附答案) Python是目前编程领域最受欢迎的语言.在本文中,我将总结Python面试中最常见的50个问题.每道题都提供参考答案,希望能够帮助你在2019年求职面 ...

  7. 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18)

    1.android开发新浪面试题[开发者必看哦] 下载地址 http://www.eoeandroid.com/thread-177885-1-1.html 2.华为关于android笔试题案例解析 ...

  8. mysql和mybatis面试题_2020年,MyBatis常见面试题总结

    Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,所以,一些参数使用细节略掉了,我们的目标 ...

  9. 十月下旬腾讯,网易游戏,百度盛大迅雷校园招聘笔试题集锦(10.25)

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦 引言 笔试啊,笔试,面试啊,面试,找工作啊,找工作.此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网 ...

最新文章

  1. VsCode 开发工具中英文切换
  2. 【 MATLAB 】适合初学者的 chirp 理解与推导
  3. 【java】java内存模型 (1)--基础
  4. MFC CListCtrl控件基本使用图解
  5. 【收藏】k8s使用如下配置给pod固定ip
  6. sql xp_cmdshell
  7. 前端学习(2514):实战
  8. js文章QQ空间分享
  9. python中单行注释采用的符号是什么_Python注释符号使用说明(多行注释和单行注释),用法,详解,攻略...
  10. Linux如何自动获取IP地址
  11. 前端date format_前端面试-手撕代码篇
  12. 大数据之-Hadoop之HDFS_HDFS的内容介绍---大数据之hadoop工作笔记0047
  13. python用什么软件编程-python用什么软件编写
  14. postgresql 分割_三分钟解析postgresql提权
  15. python实现简单的http服务器_python实现简单http服务器功能
  16. H2介绍 – Java嵌入式数据库
  17. Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
  18. python爬虫运行一遍后再运行不成功_python爬虫 - pyspdier run时运行到on_start就停止 但是单步调试可继续...
  19. (论文阅读笔记)Deep Learning based Recommender System: A Survey and New Perspectives
  20. conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge遇到的报错

热门文章

  1. 不用看了,赶紧跟着敲一遍!
  2. 打造狼性的呼叫中心外呼团队
  3. java execute、executeQuery和executeUpdate之间的区别
  4. 无线网络技术—学习AC的基础配置
  5. word跨文件格式刷的方法
  6. WPF 自定义控件-布局控件
  7. Java中的数字工具类-----持续总结中
  8. 运行时异常和受检查异常的区别
  9. nginx url实现二次转发
  10. 移动端(手机端)页面自适应解决方案—rem布局篇 1