MyBatis与Hibernate有哪些不同?为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

MyBatis与Hibernate有哪些不同?

(1)Mybatis 不完全是一个ORM框架,因为它需要程序员自己编写 Sql 语句

(2)Mybatis 直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据 模型要求不高的软件开发,因为这类软件需求变化频繁,一旦需求变化,就会要求迅速输出成果。

但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大

(3)Hibernate 对象/关系映射能力强数据库无关性好,对于关系模型要求高的软件,如果用 hibernate 开发可以节省很多代码,提高效率

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

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

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

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,几乎所有的包括 Hibernate,支持延迟加载的原理是一样的

你可能感兴趣的:(mybatis面试题,mybatis,hibernate,数据库)