Mybatis的前世此生

1、MyBatis的简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。java

MyBatis 避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集。程序员

MyBatis可使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.面试

2、MyBatis的历史

原是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation迁移到了google code,随着开发团队转投Google Code旗下,ibatis3.x正式改名为Mybatis ,代码于2013年11月迁移到Githubsql

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL MapsData Access Objects(DAO)数据库

3、MyBatis的基本说明

(1)MyBatis是一个工做在持久层的框架,它再也不是一个标准的ORM框架apache

咱们先看看Hibernate是如何对数据库进行操做编程

image

咱们再来看看Mybatis如何对数据库进行操做后端

由于它只管理了SQL语句和Java之间的关联和映射,生成的实体类将不会自动建立表了,而是咱们程序员本身去建立,你这边写的SQL语句是本身写,而不是Hibernate经过save或者delete帮助咱们进行建立。mybatis

(2)、前身是ibatis, 在ibatis3.x 时,改名为 MyBatis架构

因此说,在面试或者开发的时候会听到IBatis,MyBatis,其实指的是一个东西。

(3)、MyBatis在java和sql之间提供更灵活的映射方案,MyBatis将sql语句和方法实现,直接写到xml文件中,实现和java程序解耦

为什么这样说,MyBatis将接口和SQL映射文件进行分离,相互独立,但又经过反射机制将其进行动态绑定。

其实它底层就是Mapper代理工厂[MapperRegistry]和Mapper标签映射[MapperStatement],它们两个说穿了就是Map容器,就是咱们常见的HashMapConcurrentHashMap

在后面我会具体分析MyBatis四大组件的工做原理

因此说,MyBatis使用面向接口的方式这种思想很好的实现了解耦和的方式,同时易于开发者进行定制和扩展,好比咱们熟悉的通用Mapper和分页插件pageHelper,方式也很是简单,后面会详细进行说明。

(4)、 mybatis只负责sql, 建库建表的工做由程序员完成

在使用Hibernate的时候,建表的工做也是由框架帮助咱们完成,Hibernate自己就是一个全自动的框架,MyBatis是一个半自动的框架,建表在不少时候咱们须要对数据类型和字段进行更信详细的定义和分析,因此说,在实际的生产环境中,MyBatis的这种方式更加符合开发者的习惯

小结:Hibernate相对MyBatis的差别化和区别

(1).Hibernate是一个标准的ORM框架,MyBatis再也不是一个标准的ORM框架,它工做在持久层

(2).Hibernate是一个全自动的框架,MyBatis是一个半自动的框架

(3).Hibernate将对数据库的操做全封闭化,MyBatis将其透明化[SQL编写]

(4).MyBatis相对Hibernate来讲更加优秀,更加流行

(5).Hibernate是一个重量级的框架,MyBatis相对来讲更加轻量级,相似Struts2SpringMVC

(6).Hibernate的学习成本更高,MyBatis相对来讲更低

(7).从耦合度来讲,MyBatis实现了最大程度化的解耦,经过面向接口的方式来进行解决

MyBatis很好的借鉴了Hibernate的好的一面,那就是查询后将数据结果集映射的封装工做仍是交给我来完成,编写SQL由你本身去完成,处理复杂的自定义结果集映射的权利也交给你来作。

简单的工做封装交给我来作,因此说,这对于Hibernate来讲是致命的,由于Hibenate将对表的操做转换为对对象的操做,只需经过操做对象就能帮助咱们发送SQL,这是它自己最大的特色优点。

可是,全部的操做都受限于让Hibernate自己来完成,Hibernate最大的优点反而变成了劣势,试想,一位优秀的DBA,对原生的SQL进行了优化,但受限于Hibernate自己的特性,有种浑身无力使的感受,这也注定HibernateMyBatis取代只是时间问题。

4、为何要使用MyBatis?

MyBatis是一个半自动化的持久化层框架。

jdbc编程—当咱们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度过高。代码不易于维护。在实际项目开发中会常常添加sql或者修改sql,这样咱们就只能到java代码中去修改。

Hibernate和JPA

长难复杂SQL,对于Hibernate而言处理也不容易

内部自动生产的SQL,不容易作特殊优化。

基于全映射的全自动框架,javaBean存在大量字段时没法只映射部分字段。致使数据库性能降低。

对开发人员而言,核心sql仍是须要本身优化

sql和java编码分开,功能边界清晰,一个专一业务、一个专一数据。

可使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介

5、动态SQL映射

若是说MyBatis的SQL映射,接口和文件分离这种方式决定了MyBatis的优点,那么MyBatis的动态SQL直接决定了MyBatis它绝对的霸主地位,咱们知道后端几乎都是Spring家族的天下,那么它确定想过使用自家的产品将MyBatis淘汰,它确实作过,可是没有干掉MyBatis,全部MyBatis借助这两大优点和特色,固然MyBatis还有不少优秀的地方,慢慢替代了Hibernate

在一个实际的项目中,sql语句每每是比较复杂的,为了知足更加复杂的业务需求,MyBatis的设计者,提供了动态生成SQL的功能,动态SQL就是根据不一样的状况在同一个业务逻辑里面产生的SQL语句是变化的,也就是说根据实际的业务需求一样一段代码产生SQL语句是不同的,。

在实际的开发中,咱们会遇到比较复杂的业务需求,在这种复杂的业务需求中,咱们可能须要发送好几个SQL语句才可以去处理的,那么若是咱们能够对这个SQL语句进行适当的编程,那么这个SQL语句将会变得很是强大,那么好比说有些数据库是支持存储过程的,这个存储过程其实就是直接使用SQL语句来进行编程,能够根据你不一样的状况动态的产生SQL语句

若是咱们有相同的业务需求,在这个业务需求中有不一样的状况,那我根据不一样的状况在同一种请求里面产生的SQL语句也不同即解决了你要学习存储过程的麻烦,并且存储过程整合起来也很痛苦,同时还解决了能够灵活的适用复杂的业务需求,因此这也是MyBatis优秀的缘由,也是它为什么可以流行起来

MyBatis它研究了不少地方,让程序更加灵活,它可以设计一个产品,快速的简洁的解决一些需求这才是最好的,这些其实他也能解决,写一个存储过程便可,可是存储过程一些,代码的复杂度又变高了

MyBatis就让你在Mapper里面可使用if,for循环,多分支语句根据不一样的状况产生不一样的SQL语句,这就是MyBatis厉害的地方

因此MyBatis在必定程度上就有点把Hibernate就让它有点受不了的地方,由于MyBatis业务需求设计的太好了,这也是目前SSM为什么比SSH更流行的缘由因此你们一看,好多年解决的问题,设计的问题别人都帮助咱们进行了解决,没有理由不用它

哪怕如今流行的分布式和微服务架构,在持久层来讲,很大程度上仍是使用MyBatis来作持久层,虽然愈来愈多的项目都是基于SpringBoot,但持久层仍是Mybatis用的很是多

image

MyBatis为什么在必定程度上它可以让你们喜欢,用它,就是他让之前的工做变得更加简单容易,而不是变得更难了,若是同样东西变得愈来愈难,那就没人用它

可是随着技术的发展,未来还会有更好的框架来替代MyBatis,这是确定的,技术自己就是要不断发展的,若是技术再也不发展了,那么咱们程序员的价值就会大大下降,由于不须要在学习了,几回互联网的高潮都是因为新技术的产生.致使程序员的薪水大幅度增加

6、总结

咱们经过不一样的角度去分析,经过和同期的竞争对手以及在实际的生产环境中,MyBatis都是很优秀的一个持久层框架,咱们必须好好学习并掌握它,不光是它的使用,以及它底层的基本原理,这些放在后面会详细介绍,应你们要求,编写MyBatis系列的文章,同时也很是感谢你们的支持!


针对于上面所涉及到的知识点我总结出了有1到5年开发经验的程序员在面试中涉及到的绝大部分架构面试题及答案作成了文档和架构视频资料免费分享给你们(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),但愿能帮助到您面试前的复习且找到一个好的工做,也节省你们在网上搜索资料的时间来学习,也能够关注我一下之后会有更多干货分享。

资料获取方式: QQ群搜索“708-701-457” 便可免费领取



相关文章
相关标签/搜索