MyBatis+Spring MVC开发指南(一)

前言


MyBatis+Spring MVC这套组合,在实际互联网项目中非常流行,博主工作中也涉及过,打算由浅入深、系统的写出来!这个系列将会涵盖MyBatis开发详解、Spring MVC开发详解,以及2者的结合使用,并会分析它们的原理!(可以参考博主的另一篇文章了解Spring MVC原理:《写出我的第一个框架:迷你版Spring MVC》)

 

没有MyBatis之前


在早期,我们都是通过原生的JDBC来操作数据库的,而这种方式存在很多问题。

我们先来看一个例子:

MyBatis+Spring MVC开发指南(一)_第1张图片 原生JDBC操作方式

 

问题有哪些呢?

第一,在创建数据库连接这块,程序是需要时创建,用完后关闭。如果频繁的创建、关闭数据库连接,显然存在问题。当然,我们可以通过数据库连接池来处理这个问题。

第二,硬编码的地方太多了。比如,数据库连接相关的一些信息,SQL相关的一些信息。当然,我们可以通过使用配置文件,来避免这个问题。

第三,实质上,我们编写JDBC是有步骤可循的,比如,我们得先得到数据库连接对象,得有SQL,有输入参数,设置参数,去执行SQL,然后遍历结果集将数据库SQL执行的结果对象转化为JAVA对象,然后再去业务处理,最后释放资源。那么这个过程,实际上是个模板,能不能抽离出来,更好的去完成这个过程呢?

比如,Hibernate,这个纯粹的ORM(对象关系映射)框架,让程序员以面向对象的方式来完成数据库的操作,功能很强大,SQL都帮我们自动生成了,但是这也带来了一些其他问题,比如门槛较高,有时候我们想编写SQL,修改SQL,优化SQL都费劲,在互联网项目快速迭代开发中,太过笨重了!

基于这些因素,出现了iBatis,并发展为今天的MyBatis,作为Apache的顶级项目,目前已经托管到github下。

 

MyBatis框架的架构


上面我们说了一些JDBC的缺点,而MyBatis是避免了这些问题的。如果让我们来实现MyBatis的话,我们会怎么想呢?

第一,应该存在一个配置文件A,可以将数据库的连接信息,事务信息等放入其中;

第二,应该提供一个配置文件B,可以让程序员编写SQL,重点需要解决的是如何给SQL传递参数,以及如何将结果映射为JAVA对象;

第三,应该提供API可以执行文件B中的SQL

基于上面的分析,我们来看一下MyBatis的架构:

MyBatis+Spring MVC开发指南(一)_第2张图片 MyBatis的架构

 

这里,我们先简单了解些概念:

SqlSessionFactory用于创建SqlSession,SqlSession即操作DB的接口,其内部借助Executor执行器完成对数据库的操作。

全局配置文件,就是图中的SqlMapConfig.xml;SQL文件即是Mapper.xml文件。

对于MappedStatement而言,会完成输入映射以及输出映射。

 

Quick Start


这里先写个简单的DEMO带大家初步了解下。

POM依赖:

MyBatis+Spring MVC开发指南(一)_第3张图片 pom.xml

 

MyBatis的全局配置文件:

MyBatis+Spring MVC开发指南(一)_第4张图片 SqlMapConfig.xml

 

需要注意下:

第一,我们把MySQL的一些连接信息放入到db.properties中,使用标签加载属性文件,并通过${XXX}的方式引用。

第二,要知道现在的日志框架有很多,这里使用设置下日志使用LOG4J实现。

第三,我们说SQL结果集要完成到JAVA对象的映射,那么根据反射的原理,我们都能猜到必须要提供带包路径的全限定名称,那么为了简化,提供标签进行别名映射处理。提供了2种方式,一个是单个的类型别名映射,一个是基于包扫描的批量映射。当然批量映射的别名就是类名。

第四,需要标签加载SQL文件。同上面一样,也提供了基于包扫描的批量加载。

log4j.properties:

MyBatis+Spring MVC开发指南(一)_第5张图片 log4j.properties

 

在开发阶段,显然,我们希望MyBatis能够为我们打印SQL日志,方便调试,排查问题。

SQL配置:

MyBatis+Spring MVC开发指南(一)_第6张图片 Student.xml

 

需要关注下:

第一,namespace,顾名思义,命名空间,其实是想隔离SQL,不过到了MyBatis和Spring结合使用时,具有特殊的意义。这里暂且使用全限定类名。

第二,