MyBatis简介
本节首先会介绍什么是ORM、什么是MyBatis、MyBatis的特点以及核心概念,最后介绍MyBatis是如何启动、如何加载配置文件的?
1.什么是ORM
ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。简单地说,ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
当我们开发应用程序时,需要编写大量的数据访问层代码,用来操作数据库中的数据,这些代码要么是大量重复的代码,要么操作特别烦琐。针对这些问题,ORM提供了完善的解决方案,简化了将对象持久化到关系数据库中的操作。
ORM框架的本质是简化编程中操作数据库的编码,Java领域发展到现在,ORM框架层出不穷,但是,基本上还是Hibernate和Mybatis两个比较流行并被广泛使用。
Hibernate:全自动的框架,强大、复杂、笨重、学习成本较高。
Mybatis:半自动的框架(需要开发者了解数据库),必须要自己写SQL。
Hibernate宣称可以不用写一句SQL,而MyBatis以动态SQL见长,两者各有特点,开发者可以根据需求灵活使用。
有一个有趣的现象:传统企业大多喜欢使用Hibernate,而互联网行业则通常使用MyBatis。
2.什么是MyBatis
MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统。最早是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis,2013年11月又迁移到了GitHub。
MyBatis支持定制化的SQL、存储过程和高级映射,能够非常灵活地实现动态SQL,可以使用简单的XML或注解来配置和映射原生信息,能够轻松地将Java的POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。
MyBatis作为一款使用广泛的开源软件,它的特点如下:
易学易用,没有任何第三方依赖。
SQL被统一提取出来,便于统一管理和优化。
SQL和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。
灵活动态的SQL,支持各种条件来动态生成不同的SQL。
提供映射标签,支持对象与数据库的ORM关系映射。
提供对象关系映射标签,支持对象关系组件维护。
3.MyBatis的核心概念
MyBatis由Mapper配置文件、Mapper接口、执行器、会话等组件组成。下面就来介绍这些非常重要的组件和概念。
1)Mapper配置文件:可以使用基于XML的Mapper配置文件来实现,也可以使用基于Java注解的MyBatis注解来实现,甚至可以直接使用MyBatis提供的API来实现。
2)Mapper接口:是指自定义的数据操作接口,类似于通常所说的DAO接口。早期的Mapper接口需要自定义去实现,现在MyBatis会自动为Mapper接口创建动态代理对象。Mapper接口的方法通常与Mapper配置文件中的select、insert、update、delete等XML节点一一对应。
3)Executor(执行器):MyBatis中所有SQL语句的执行都是通过Executor进行的,Executor是MyBatis的一个核心接口。
4)SqlSession(会话):MyBatis的关键对象,类似于JDBC中的连接(Connection),SqlSession对象完全包含数据库相关的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。
5)SqlSessionFactory(会话工厂):MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得。
6)SqlSessionFactoryBuilder构建器:用于解析配置文件,包括属性配置、别名配置、拦截器配置、数据源和事务管理器等,可以从XML配置文件或一个预定义的配置实例进行构建。
4.MyBatis的启动流程
MyBatis的使用虽然简单,但是,它属于高度封装的框架,因此,我们必须熟悉MyBatis的启动和执行过程。具体的工作流程如图所示。
1)加载Mapper配置的SQL映射文件,或者注解的相关SQL内容。
2)创建会话工厂。MyBatis通过读取配置文件的数据源信息来构造会话工厂(SqlSessionFactory)。
3)创建会话。MyBatis可以通过会话工厂来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含对数据库操作的增、删、改、查方法。
4)创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫作数据库执行器(Executor)的接口来帮它执行操作。
5)封装SQL对象。在这一步,执行器将待处理的SQL信息封装到一个对象(MappedStatement)中,该对象包括SQL语句、输入参数映射信息(Java简单类型、HashMap或POJO)和输出结果映射信息。
6)操作数据库。拥有了执行器和SQL信息封装对象就可以使用它们访问数据库,最后返回操作结果,结束流程。
总结起来,MyBatis主要有两大核心组件:SqlSessionFactory和Mapper。SqlSessionFactory负责创建数据库会话,Mapper主要提供SQL映射。