mybatis和hibernate的区别面试题,mybatis和hibernate的区别有哪些

  mybatis和hibernate的区别面试题,mybatis和hibernate的区别有哪些

  在java开发中,我们使用的两个主流框架是SSM、Spring、SpringMVC、MyBatis和SSH、Struts2、Spring和Hibernate。今天,我们先来看看两种数据库框架的区别。

  如何解决写爬虫IP受阻的问题?立即使用。

  第一方面:开发速度的对比

  就开发速度而言,掌握Hibernate比掌握Mybatis更难。Mybatis框架相对简单易用,但也相对粗糙。个人认为,要用好Mybatis,首先要了解好Hibernate。(推荐学习:Java视频教程)

  对比两者的开发速度,不仅要考虑两者的特点和性能,还要根据项目需求考虑哪一个更适合项目开发。比如一个项目中基本没有用到复杂的查询,就是简单的添加、删除、更改查询。由此可见,选择hibernate的效率是非常快的,因为基本的sql语句已经打包好了,你根本不需要写sql语句,节省了很多时间。但是对于大型项目来说,有很多复杂的语句,再次选择hibernate并不是一个好的选择。选择mybatis会加快很多,报表的管理也更方便。

  第二方面:开发工作量的对比

  Hibernate和MyBatis都有相应的代码生成工具。您可以生成简单和基本的DAO层方法。对于高级查询,Mybatis需要手动编写SQL语句和ResultMap。Hibernate有很好的映射机制,开发者不需要关心SQL的生成和结果的映射,可以更专注于业务流程。

  第三方面:sql优化方面

  Hibernate的查询会查询表中的所有字段,这会消耗性能。Hibernate也可以编写自己的SQL来指定要查询的字段,但是这破坏了Hibernate开发的简单性。Mybatis的SQL是手工编写的,可以根据需要指定查询字段。

  Hibernate HQL语句的调优需要打印SQL,Hibernate SQL因为太丑被很多人拒绝。MyBatis的SQL是自己手动编写的,所以很容易调整。但是Hibernate有自己的日志统计。Mybatis本身没有日志统计,而是使用Log4j进行日志记录。

  第四方面:对象管理的对比

  Hibernate是一个完整的对象/关系映射解决方案,提供了对象状态管理的功能,让开发者不再需要关注底层数据库系统的细节。也就是说,与常见的需要管理SQL语句的JDBC/SQL持久层方案相比,Hibernate采用了更自然的面向对象的视角来持久化Java应用中的数据。

  换句话说,使用Hibernate的开发人员应该始终关注对象的状态,而不管SQL语句的执行。这部分细节已经被Hibernate搞定了,只有开发人员在调优系统性能的时候才需要知道。MyBatis在这一部分没有文档,所以用户需要详细管理对象本身。

  第五方面:缓存机制

  Hibernate缓存

  Hibernate一级缓存是Session缓存,要管理好Session的生命周期才能用好它。建议在动作操作中使用会话。会话应该在一级缓存中严格管理。

  Hibernate L2缓存是一个会话工厂级缓存。工厂的缓存分为内置缓存和外部缓存。内置缓存存储数据(映射元素数据、预定的SQL语句等。)包含在SessionFactory对象的某些集合属性中,对于应用程序是只读的。外部缓存存储数据库数据的副本,其功能类似于一级缓存。除了内部存储器之外,二级高速缓存还可以使用外部存储设备,例如硬盘。二级缓存称为进程级缓存或SessionFactory级缓存,可以被所有session共享,其生命周期随着SessionFactory的生命周期而存在和消亡。

  MyBatis缓存

  MyBatis包含一个非常强大的查询缓存特性,可以很容易地配置和定制。MyBatis 3中的缓存实现已经实现了许多改进,使其更加强大和易于配置。

  默认情况下,缓存是不打开的。除了本地会话缓存之外,它可以增强实现,并且需要处理循环依赖。要打开L2缓存,您需要添加一行:cache/

  从字面上看,确实如此。这个简单语句的效果如下:

  映射文件中的所有select语句都将被缓存。

  映射文件中的所有插入、更新和删除语句都会刷新缓存。

  将使用最近最少使用(LRU)算法回收缓存。

  根据调度(如无刷新间隔、无刷新间隔),缓存不会按任何时间顺序刷新。

  缓存存储1024个列表集合或对象的引用(无论查询方法返回什么)。

  缓存将被视为读/写缓存,这意味着对象检索不是共享的,但可以由调用方安全地修改,而不会干扰其他调用方或线程所做的潜在修改。

  的所有这些属性都可以通过缓存元素的属性来修改。

  例如:cache indication=" FIFO " flush interval=" 60000 " size=" 512 " readonly=" true "/

  这种更高级的配置创建了一个FIFO缓存,它每60秒刷新一次,以存储512个结果对象或列表的引用。此外,返回的对象被认为是只读的,因此在不同线程的调用方之间修改它们会导致冲突。可用的收回策略有,默认为LRU:

  LRU-最近最少使用:删除最长时间未使用的对象。

  FIFOFIFO:按照对象进入缓存的顺序移除对象。

  软引用:根据垃圾收集器状态和软引用规则删除对象。

  弱引用:根据垃圾收集器状态和弱引用规则更积极地删除对象。

  flushInterval可以设置为任何正整数,它们代表一个合理的毫秒时间周期。默认情况下,它没有设置,即没有刷新间隔,只有在调用该语句时才会刷新缓存。

  Size(引用数)可以设置为任意正整数。记住您缓存的对象数量和您的运行环境中可用的内存资源数量。默认值为1024。

  readOnly属性可以设置为true或false。只读缓存将缓存对象的同一个实例返回给所有调用方。因此,不能修改这些对象。这提供了重要的性能优势。读写缓存返回缓存对象的副本(通过序列化)。这样会比较慢,但是安全,所以默认为false。

  相同点:Hibernate和Mybatis的L2缓存可以通过实现自己的缓存或者为其他第三方缓存方案创建适配器来完全覆盖缓存行为,除了系统默认的缓存机制。

  区别:Hibernate的L2缓存配置是在SessionFactory生成的配置文件中详细配置的,然后在具体的表-对象映射中配置。

  MyBatis的L2缓存配置在每个特定的表-对象映射中有详细说明,因此可以为不同的表定制不同的缓存机制。而Mybatis可以在名称空间中共享相同的缓存配置和实例,这是通过Cache-ref实现的。

  两者比较:因为Hibernate对查询对象有很好的管理机制,所以用户不需要关心SQL。因此,如果在使用L2缓存时有脏数据,系统将报告错误并提示您。

  在这方面,MyBatis在使用L2缓存时需要特别小心。如果不能完全确定数据更新操作的范围,避免盲目使用缓存。否则脏数据的出现会给系统的正常运行带来极大的隐患。

  更多Java相关技术文章,请访问Java开发教程专栏学习!以上是mybatis和hibernate区别的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: