前言
看这本书的初衷,只是想大概了解一下MyBatis的工作方式,大概了解一下原理。这本书是从源码出发进行讲解的,对每个模块都进行了细致的介绍。
在现阶段,个人对源码分析不是那么感兴趣,因为通常源码分析都是从已经很熟悉源码的人的角度出发,像cpu似的疯狂进入xx函数,这个函数又进入了xx函数,强调了很多细节问题,感觉在做十字绣,但是却没法对框架的构造有整体的把握
当然,从分析源码的角度看,这本书还是挺好的,各个模块也是平行的,铺开来用不同的章节讲,脉络也比较清晰——只不过,我想把仅有的时间用来了解更有趣的知识
所以,这篇文章其实只有MyBatis(包括ORM框架)的简单介绍,后续的源码分析是没有的,也许以后做了相关工作,就会再去深入了解吧
1.MyBatis快速入门
1.1 ORM简介
ORM(Object Relational Mapping,对象-关系映射)框架是为了方便解决程序中业务逻辑和数据库操作交互的问题。
具体来说,在系统开发的过程中,开发人员需要使用面向对象的思维实现业务逻辑,而设计数据库表或操作数据库时,需要通过关系型的思维方式思考问题。应用程序与关系型数据库的交互,就是数据在程序对象和关系结构中表、列、字段之间的转换。
简单来说,向数据库发起请求时,需要将Java对象(程序中的对象,因为主要是Java开发环境,所以这两个概念会互用)转化成SQL语句里的参数;数据库返回数据时,要将数据库里的一行数据,映射到一个Java对象,方便程序后续的读取。
JDBC是Java与数据库交互的统一API。实际上它分为两组API,一组是面向Java应用开发者的API,一组是面向数据库驱动程序开发人员的API。前者是一个标准的Java API且独立于各个厂家的实现,后者则是前者的底层支持,不同的数据库产品有不同的实现。
进行Java开发时,可以通过JDBC完成多种数据库操作。例如,发起一次查询操作时,有如下几个步骤
1.注册数据库驱动类,指明数据库URL 用户名 密码;
2.打开数据库连接;
3.通过数据库连接创建statement对象(可以认为是写明SQL语句),这一过程中需要进行基础语句创建、Java对象参数插入;
4.通过statement对象执行SQL语句,得到ResultSet对象;
5.通过ResultSet读取数据,并将数据转换成Java对象;
6.关闭ResultSet、Statement、数据库连接,释放相关对象。
可以看到,在执行一次查询的操作中,只有操作35和实际业务有关,因此1246的操作都是重复性的,可以进行封装。
再看操作5,将数据转换成Java对象这一步可能也可以封装,比如执行多种条件范围的查询,返回的对象都是一样的,那也可以将操作5抽象成一个映射函数,取出ResultSet中的每一行,将每一列都给一个Java对象的某个字段赋值
再看操作3,JDBC中创建Statement对象,需要手工拼接字符串,并且手动将参数一个一个插入,这对于开发人员来说也是十分痛苦的(因为要疯狂敲 ‘?’ 号来做参数的占位符,数得眼花,还特别容易数错,还得用很多的 ‘+’ 来拼接字符串,编写出的SQL语句非常不直观),有没有办法能让我们指定数据库里表的每一列与Java对象字段的对应关系,并且自动帮我们映射过去呢?
于是,ORM框架出现了。它封装了重复的代码,用户可以根据配置文件指明Java对象字段到数据库列名的相互对应,此外还具有缓存、连接池等额外功能来提升数据库性能。
因此,在开发中大型项目时,优先考虑ORM框架来实现DAO(Data Access Object,数据访问对象)层。
1.2 常见持久化框架
Hibernate
H除了能实现ORM框架的功能之外,可以帮助开发人员屏蔽不同数据库产品中SQL语句的细微差别(不同的数据库,对SQL标准支持、内置的函数并不完全相同。同样的SQL语句可能在一种数据库中执行成功,但是在另一种数据库里执行报错),这是其突出的特性。
H提供了HQL语言、以及Criteria API等对SQL语句进行封装(H封装了数据库层面的所有操作),开发人员完全不用自己编写SQL语句,因此程序的可移植性也大大提高了。
但是H的劣势也在于全自动化的映射方式,使得开发人员难