文章目录
1、什么是MyBatis?
是一个基于Java的持久层框架;并且支持自定义SQL、存储过程以及高级映射;
MyBatis可以通过简单的XML配置或者注解来配置和映射原始类型、接口和Java POJO为数据库中的记录;
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。
2、基本概念
什么是持久化?
- 持久化就是将内存中的数据保存到可永久保存的存储设备中(例如磁盘);
- 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件中、XML数据文件中等,但是一般来说会存放在关系型数据库中(例如MySQL、Oracle)。
什么是持久层?
- 就是专注于实现数据持久应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
什么是ORM?
- Object-Relation Mapping,对象关系映射;
- 用于实现面向对象编程语言的类型 和 关系型数据库类型之间的相互转换;
- 简单说,ORM是通过描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射,当我们需要具体操作数据库的时候就不需要去和复杂的SQL语句打交道,只要像操作对象一样;
- 从前面的描述可知,Mybatis是可以自定SQL的需要和SQL打交道,所以我们认为Mybatis是一个半自动化的ORM框架。
在Java中典型的ORM框架?
- JPA:Java Persistence API(Java持久化API),内部由一系列的接口和抽象类构成;JPA通过JDK5.0注解或XML描述对象关系表的映射关系,是Java自带的框架。
- Hibernate:全自动的ORM框架,强大、复杂、笨重、学习成本高;Hibernate除了作为ORM框架之外,它也是一种JPA实现。
- MyBatis:半自动的ORM框架,强大、简单、灵活、学习成本低;MyBatis提供了自定义SQL,开发者将主要精力放在SQL上就行。
之所以要做持久化和使用ORM设计,因为持久化解决了数据的存储问题,ORM解决的主要是对象关系的映射的问题。
MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制等(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。
MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。
ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
ORM的方法论基于三个核心原则:
- 简单:以最基本的形式建模数据。
- 传达性:数据库结构被任何人都能理解的语言文档化。
- 精确性:基于数据模型创建正确标准化了的结构。
3、为什么使用MyBatis?
传统的JDBC代码来操作数据库,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet等,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,而这些代码写起来往往是重复的,写起来又繁琐又枯燥。并且这些操作都存在硬编码的问题,对以后的维护工作增加了很大的难度。
在使用MyBatis之后,只需要提供SQL语句就好,其余诸如:建立连接、操作Statment、ResultSet,处理JDBC相关异常等都交给MyBatis去处理,我们就只需要关注SQL语句即可,关注在增删改查这些操作层面上;
MyBatis 支持使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,即普通的 Java对象)映射成数据库中的记录。
Mybatis相对传统JDBC的优势:
- Mybatis是把连接数据库的信息都是写在配置文件中,因此不存在硬编码问题,方便后期维护。
- Mybatis执行的SQL语句都是通过配置文件进行配置,不需要写在Java代码中。
- Mybatis的连接池管理、缓存管理等让连接数据库和查询数据效率更高。
4、MyBatis特点优缺点?
4.1特点
- MyBatis支持定制化SQL、存储过程以及高级映射的持久层框架;
- MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作;
- MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集;
- MyBatis把SQL语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大的便利;
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的实体店映射成数据库中的记录;
- Mybatis需要程序员自己编写SQL语句,程序员可以结合数据库自身的特点灵活控制SQL语句,能够实现比Hibernate这种全自动ORM框架更高的查询效率,能够完成复杂的查询;
4.2优点
- 简单易学,MyBatis本身就很小且简单,没有任何第三方依赖,简单实用几个Jar包,然后配置几个SQL映射文件即可;
- 使用灵活,易于上手和掌握;相对于传统JDBC编码更少;
- 提供XML标签,支持编写动态SQL,满足不同的较为复杂的业务需求;
- SQL写在XML文件中,便于统一管理和优化,同时也解除了SQL与程序代码的耦合,使系统的设计更清晰、更易维护、更易单元测试;
- 提供映射标签,支持对象与数据库的ORM字段关系映射;
- 提供对象关系映射标签,支持对象关系组件维护;
4.3缺点
- SQL语句的编写工作量大,尤其在表、字段比较多的情况下,对开发人员编写SQL的能力有一定要求;
- SQL语句依赖于数据库,导致数据库不具有好的移植性,不可以随便更换数据库;
5、MyBatis与Hibernate的区别?
5.1开发方面
- Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以更具对象关系模型直接获取;
- MyBatis属于半自动ORM映射工具,使用MyBatis查询关联对象或者关联集合对象时,需要手动编写SQL语句;不过,MyBatis可以通过XML或注解方式灵活配置要运行的SQL语句,并将Java对象和SQL语句映射生成最终执行的SQL,最后将SQL执行的结果再映射生成Java对象;
5.2底层方面
- Hibernate的底层是JPA规范的实现;
- MyBatis的底层是封装了JDBC的操作细节,显的简单;
5.3SQL优化方面
- Hibernate是全自动的ORM框架,所以SQL语句当然是自动生成的,但是有些语句是较为繁琐的,在执行时会消耗一些性能;
- MyBatis是半自动的ORM框架,需要程序员手动编写SQL语句,可以避免不需要的查询,进而提高系统的性能;
5.4学习成本方面
- Hibernate 的学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。
- Mybatis的学习门槛低,简单易学,程序员只需要把重心放在写原生态 SQL 上即可,可严格控制 SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。
5.5对象管理方面
- Hibernate 是完整的对象/关系映射的框架,对象/关系映射能力极强,开发工程中,无需过多关注底层实现,只要去管理对象即可;而且数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 Hibernate 开发可以节省很多代码,提高效率。
- Mybatis 需要自行管理 映射关系;而且Mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 SQL映射文件,工作量大。
5.6日志系统方面
- Hibernate日志系统非常健全,涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等。
- Mybatis则除了基本记录功能外,功能薄弱很多。
5.7缓存方面
- 相同点
- Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
- 不同点
- Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是哪种缓存。如果使用二级缓存时如果出现脏数据,系统会报出错误并提示。
- MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
5.8总结
- Mybatis:小巧、方便、高效、简单、直接、半自动化。
- 比喻:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
- Hibernate:强大、方便、高效、复杂、间接、全自动化。
- 比喻:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。
6、MyBatis的重要组件
MyBatis 中的一些重要组件如下::
-
MyBatis的配置文件:SqlMapConfig.xml是MyBatis的全局配置文件,主要配置数据源、事务、加载映射文件等,它的名称可以是任意(最好见名知意)。Mapper.xml主要是配置Statement的相关信息,如SQL语句。
-
SqlSessionFactoryBuilder:会根据XML配置或是Java配置来生成SqlSessionFactory对象.采用建造者模式(简单来说就是分步构建一个大的对象,例如建造一个大房子,采用购买砖头、砌砖、粉刷墙面的步骤建造,其中的大房子就是大对象,一系列的建造步骤就是分步构建)。
-
SqlSessionFactory:用于生成SqlSession,可以通过 SqlSessionFactory.openSession() 方法创建 SqlSession 对象。使用工厂模式(简单来说就是我们获取对象是通过一个类,由这个类去创建我们所需的实例并返回,而不是我们自己通过new去创建)。
-
SqlSession:相当于JDBC中的 Connection对象,可以用 SqlSession 实例来直接执行被映射的 SQL 语句,也可以获取对应的Mapper。
-
Executor:MyBatis 中所有的 Mapper 语句的执行都是通过 Executor 执行的。(Mapper:由XML文件和Java接口组成,根据XML中配置的映射信息执行对应的SQL语句并返回执行结果。)
-
Mapper接口:数据操作接口也就是通常说的 DAO 接口,要和 Mapper 配置文件中的方法一一对应,也就是必须和Mapper.xml中的增删改查标签Id一致。
-
Mapper配置:用于组织具体的查询业务和映射数据库的字段关系,可以使用 XML 格式(Mapper.xml)或 Java 注解格式来实现。
-
MappedStatement:作用是封装了Statement的相关信息,包括SQL语句、输入参数和输出结果等等
7、MyBatis执行流程
- 首先是加载Mybatis的全局配置文件,随后会加载SQL 映射文件或者是注解的相关 SQL 内容。
- 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
- 创建会话,根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含了对数据库操作的增、删、改、查方法。
- 创建执行器,因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
- 封装 SQL 对象,在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
- 操作数据库,拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。