认识MyBatis与Mybatis-plus及两者的区别

一、认识Mybatis

在这里插入图片描述
       MyBatis 是持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

1、功能架构
Mybatis的功能架构分为三层:
(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

2、框架架构
框架架构讲解:
(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
3、MyBatis工作流程
在这里插入图片描述
详细讲解如下:
1、加载配置文件。需要加载的配置文件包括全局配置文件(SqlMapConfig.xml)和SQL(Mapper.xml)映射文件,其中全局配置文件配置了Mybatis的运行环境信息(数据源、事务等),SQL映射文件中配置了与SQL执行相关的信息。
2、创建会话工厂。MyBatis通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
3、创建会话。拥有了会话工厂,MyBatis就可以通过它来创建会话对象(SqlSession)。会话对象是一个接口,该接口中包含了对数据库操作的增删改查方法。
4、创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
5、封装SQL对象。在这一步,执行器将待处理的SQL信息封装到一个对象中(MappedStatement),该对象包括SQL语句、输入参数映射信息(Java简单类型、HashMap或POJO)和输出结果映射信息(Java简单类型、HashMap或POJO)。
6、操作数据库。拥有了执行器和SQL信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。
4、MyBatis的优缺点
优点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现.
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多.
  • 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性.
  • 提供映射标签,支持对象与数据库的orm字段关系映射.
  • 提供对象关系映射标签,支持对象关系组建维护.
  • 提供xml标签,支持编写动态sql.
    缺点:
  • 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此.
  • SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库.
  • 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改.
  • 二级缓存机制不佳.
    5、核心组件
    (1) SqlSessionFactoryBuilder:加载配置文件。
    (2)SqlSessionFactory:与数据库相关,应用级别,最好单例,用于生成SqlSession;一个数据库对应一个SqlSessionFactory。
    (3)SqlSession:封装一系列数据库操作的方法;面向数据库执行SQL命令所需的所有方法,你可以通过SqlSession实例来直接执行已映射的SQL语句;内部执行方法是excute,涉及到一级缓存,二级缓存等概念。
    (4)Executor:SqlSession向用户提供操作数据库的方法,但和数据库操作有关的职责都委托给Executor
    (5)BaseExecutor:BaseExecutor是一个实现了Executor接口的抽象类,定义若干抽象方法,在执行的时候,把具体的操作委托给子类进行执行
    (6)Cache:Mybatis中的Cache接口,提供了和缓存相关的最基本的操作
    (7)Configuration:Mybatis所有的配置信息都维持在Configuration对象之中
    (8)StatementHandler:封装了JDBC Statement操作,负责对JDBC Statement的操作,如设置参数,将Statement结果集转换成List集合
    (9)ParameterHeader:负责对用户传递的参数转换成JDBC Statement所需要的参数
    (10)ResultSetHeader:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
    (11)TypeHeader:负责java数据类型和jdbc数据类型之间的映射和转换
    (12)MappedStatement:维护了一条(select,insert,update,delete)节点的封装,而它是由MapperBuilderAssistant负责构建
    (13)SqlSource:负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
    (14)BoundSql:表示动态生成的SQL语句以及相应的参数信息

延伸:xml文件中,insert中的参数useGeneratedKeys=true(插入数据时,返回数据的id,即返回主键)

6、MyBatis 有几种分页方式?
分页方式:逻辑分页和物理分页。
逻辑分页:使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。弊端是需要消耗大量的内存、有内存溢出的风险,对数据库压力较大。
物理分页:自己手写 SQL 分页或使用分页插件 PageHelper,从数据库查询指定条数的数据。弥补了一次性全部查出的所有数据的种种缺点。
MyBatis 分页插件的实现原理是什么?
分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

7、MyBatis 有三种基本的Executor执行器
a.SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象;
b.ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后不关闭 Statement 对象,而是放置于 Map 内供下一次使用。简言之,就是重复使用 Statement 对象;
c.BatchExecutor:执行 update(没有 select,jdbc 批处理不支持 select),将所有 SQL 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理,与 jdbc 批处理相同。

8、Mybatis和Hibernate的比较

  • Mybatis是一个半ORM框架;Hibernate是一个全ORM框架。Mybatis需要自己编写sql。
  • Mybatis直接编写原生sql,灵活度高,可以严格控制sql执行性能;Hibernate的自动生成hql,因为更好的封装型,开发效率提高的同时,sql语句的调优比较麻烦。
  • Hibernate的hql数据库移植性比Mybatis更好,Hibernate的底层对hql进行了处理,对于数据库的兼容性更好,
  • Mybatis直接写的原生sql都是与数据库相关,不同数据库sql不同,这时就需要多套sql映射文件。
  • Hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
  • Mybatis和Hibernate都可以使用第三方缓存,而Hibernate相比Mybatis有更好的二级缓存机制。

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

#{}是预编译处理(底层使用的是PreparedStatement),防止sql注入;${}是字符串替换。

二、认识Mybatis-plus

在这里插入图片描述
       Mybatis-Plus(MP)在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。但它也提供了一些很有意思的插件,比如SQL性能监控、乐观锁、执行分析等。

  1. 代码生成器
  2. 通用的CURD
  3. 条件构造器
  4. 自定义SQL语句
  5. 分页插件、性能分析插件
  6. 公共字段自动填充

优点

  • 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,MyBatis-Plus支持所有Mybatis原生的特性,因此引入 Mybatis-Plus 不会对现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
  • 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
  • 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
  • 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
  • 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
  • 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询
  • 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
  • 内置全局拦截插件:提供全表 delete 、update 操作智能分析阻断,预防误操作

三、MyBatis与Mybatis-plus的区别

       如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。
       MyBatis:一种操作数据库的框架,提供一种Mapper类,支持让你用java代码进行增删改查的数据库操作,省去了每次都要手写sql语句的麻烦。但是!有一个前提,你得先在xml中写好sql语句,也是很麻烦的。
       MP的存在就是为了稍稍弥补Mybatis的不足。在我们使用Mybatis时会发现,每当要写一个业务逻辑的时候都要在DAO层写一个方法,再对应一个SQL,即使是简单的条件查询、即使仅仅改变了一个条件都要在DAO层新增一个方法,针对这个问题,MP就提供了一个很好的解决方案,它可以让我们避免许多重复性的工作。

  • 41
    点赞
  • 264
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值