您的位置:首页 > 职场人生

2019.9.29笔记——mybatis源码解析之总结和面试题

2019-09-29 21:34 441 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_35262405/article/details/101718814

mybatis流程

mybatis常见面试题

ResultMap和ResultType的差别

  • ResultType:一般是直接指定返回值与别名库当中的java对象的映射,比如:Map,String自定义对象(注意:自定义对象的属性名和数据库列名要相同)。
  • ResultMap:自己指定返回值与对象及与对象内部属性名和数据库列名的绑定。

#{}和${}的区别

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号
    如:
    order by #{user_id}
    ,如果传入的值是111,那么解析成sql时的值为
    order by "111"
    ,如果传入的值是id,则解析成的sql为
    order by "id"
  2. $将传入的数据直接显示生成在sql中
    如:
    order by ${user_id}
    ,如果传入的值是111,那么解析成sql时的值为
    order by 111
    ,如果传入的值是id,则解析成的sql为
    order by id
  3. #方式能够很大程度防止sql注入。
  4. $方式无法防止Sql注入。
  5. $方式一般用于传入数据库对象,例如传入表名。
  6. 一般能用#的就别用$。
  7. MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

MyBatis与Hibernate有哪些不同?

Mybatis和Hibernate不同,它不完全是一个ORM框架,属于半ORM框架。因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件),如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

Mybatis是如何进行分页的?分页插件的原理是什么?

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

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

插件开发(分页)

Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。

原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。

Mybatis 提供了 9 种动态 sql 标签:

  • trim
  • where
  • set
  • foreach
  • if
  • choose
  • when
  • otherwise
  • bind

动态sql其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态 sql 的功能。

spring开启了事务mybatis的一级缓存可以生效
因为session关闭了事务也就消失了,而且开启事务spring就知道需要在哪里关闭事务

二级缓存不能存一直增加的数据,因为二级缓存的数据几乎不会被回收

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐