mybatis的优缺点
优点:
1.基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
2.与JDBC相比,减少了50%以上的代码,消除了JDBC大量冗余的代码,不需要手动开关连接
3.很好地与各种数据库兼容(因为Mybatis使用JDBC来来连接数据库,所以只要JDBC支持的数据库,MyBatis都支持)
4.能够与Spring很好的集成
5.提供映射标签,支持对象与数据库的ORM字段关系映射里提供对象关系;提供对象关系映射标签,支持对象关系组件维护
缺点:
1.SQL语句的编写工作量较大,尤其当字段多,关联表多时,对开发人员编写SQL语句的功底有一定要求
2.SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
Mybatis和Hibernate有哪些不同?
SQL和ORM的争论,永远都不会停止
开发速度的对比:
Hibernate的真正掌握要比Mybatis难写,Mybatis框架相对简单和容易上手,但也相对简陋些
比起两者的开发速度,不仅仅要考虑两者的性能及特性,更要根据项目需求去考虑究竟哪一个组合更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但对于一个大型项目有,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择mybat就会加快很多,而且语句的管理也比较方便。
开发工作量的对比:
Hibernate和Mybatis都有响应的代码生成工具,可以生成简单的DAO层方法。针对高级查询,Mybatis需要手动编写sql语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程
sql优化方面:
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能损耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段
对象管理的对比:
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方面需要你的经验和能力都很强才行。
Mybatis入门简单,即学即用,提供数据库查询的自动对象绑定功能,而且延续了很好地SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美
Mybatis的缺点就是框架比较简陋,功能上有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际伤还要自己写,工作量比较大,而且不容易适应快速数据库修改。
#{}和${}的区别是什么?
#{}是预编译处理,是占位符,${}是字符串替换、是拼接符
Mybatis在处理#{}时,会将sql中的#{}替换为?,调用PreparedStatement来赋值
Mybatis在处理${}时,会将${}替换成变量的值,调用Statement来赋值
#{}的变量替换是在DBMS中,变量替换后,#{}对应的变量自动加上单引号
¥{}的变量替换是在DBMS外,变量替换后,${}对应的变量不会加上单引号
使用#{}可以有效防止SQL注入,提高系统安全性
简述Mybatis的插件运行原理,如何编写一个插件
Mybatis只支持对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这四种接口对象的方法时,机会进入拦截方法,具体就是InvocationHandler的iNvoke()方法,拦截那些你指定需要拦截的方法。
编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后再给插件编写注解,指定姚兰姐哪一个接口的哪些方法即可,在配置文件中配置编写的插件。