栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis常问整理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis常问整理

目录

mybatis的优缺点     

MyBatis与Hibernate有哪些不同?          

Mybaits一级缓存和二级缓存

#{}和${}的区别是什么?   


mybatis的优缺点     

优点:     

1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解     除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态 SQL语句,并可重用。   

2、与JDBC相比,减少了50%6以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;     

3、很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。     

4、能够与Spring很好的集成;     

5、提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

缺点:     

1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。     

2、SQL 语句依赖于数据库,导致数据库移植性差, 不能随意更换数据库。

MyBatis与Hibernate有哪些不同?          

H是ORM(对象关系映射JavaBean与DB之间的映射)框架通过操作对象就能操作数据库,M不是,M中并没有明显的关系维护单纯的操作对象并不能操作数据库,必须要使用sql。

开发速度的对比:   

 Hibernate的真正掌握要比Mybatis难些。Mybatis框架相对简单很容易上手,但也相对简陋些。     比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如: 一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了, 因为基本的sq|语句已经被封装好了,根本不需要你去写sq|语句,这就节省了大量的时间,但是对于一个大型项目, 复杂语句较多,这样再去选择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本身不带日志统计,使用Log4进行日志     记录。   

对象管理的对比:     Hibernate是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者 不再需要理会底层数据库系统的细节。也就是说,相对于常见的JDBC/SQL持久层方案中需要管理SQL语句,  Hibernate采用了更自然的面向对象的视角来持久化Java应用中的数据。换句话说,使用Hibernate的开发者应该总是关注对象的状态(state) ,不必考虑SQL语句的执行。这部分细节 已经由Hibernate掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。而MyBatis在这一 块没有文 档说明,用户需要对对象自己进行详细的管理。     

缓存机制对比:     相同点:都可以实现自己的缓存或使用其他第三方缓存方案, 创建适配器来完全覆盖缓存行为。   不同点: Hibernate的二 级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表对象映射中配置是哪种缓存。MyBatis的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。 两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。而MyBatis在这-方面,使用二级缓存时需要特别小心。 如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。 Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通, 而且对Hibernate进行 了     适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。     

Hibernate的缺点就是学习门槛不低,要精通门]槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡     取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。     iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有     那么高的对象模型要求的项目来说,相当完美。     

iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

Mybaits一级缓存和二级缓存

一级缓存

1,-级缓存模式是开启状态     

2, -级缓存作用域在于SqlSession (大家可以关闭SqISession, 然后创建一个新的, 再获取对     象,观察实验结果)     

3,如果中间有对数据的更新操作,则将清空-级缓存。

二级缓存

要使用二级缓存,需要经历两个步骤     

1,开启二级缓存(默认处于开启状态)     #{}和${}的区别是什么?   

 #{}是预编译处理、是占位符,${}是字符串替换、 是拼接符。   

Mybatis在处理#{}时,会将sql中的#0替换为?号,调用PreparedStatement来赋值;     

Mybatis在处理$Q时,就是把$0}替换成变 量的值,调用Statement来赋值;   

 #{}的变量替换是在DBMS中、变量替换后,#}对应的变量自动加上单引号     

${}的变量替换是在DBMS外、变量替换后,

${} 对应的变量不会加上单引号     

使用#0可以有效的防止SQL注入,提高系统安全性。

mybaits的分页有逻辑分页和物理分页两种。逻辑分页是先全部查出再根据参数返回相应条数;物理分页则是真正根据分页参数进行查询,如PageHelper。其原理是拦截器。实现Interceptor接口

那么其中一个关键的方法就是intercept,从而实现拦截  分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拉截方法内,拦截待执行的SQL,然后根据设置的dialect (方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页     所以原理还是基于拦截器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353847.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号