MyBatis入门

    我们一般连接数据库处理数据一般用ORM框架,MyBatis是ORM框架之一,我们讲解MyBatis之前先讲一讲传统的JDBC和ORM吧。

第一部分:ORM

传统的JDBC方式

    很久很久以前Java是通过JDBC操作数据库的,JDBC是SUN公司提出的一系列规范,但是它只定义了接口规范,具体的实现是数据库厂家去实现的。因为每个数据库都有其特殊性,这些事Java规范没有办法确定的,所以JDBC是一个典型的桥接模式。我们看看JDBC的基本步骤:

    • 使用JDBC编程需要连接数据库,注册驱动和数据库信息。

    • 操作Connection,打开Statement对象

    • 通过Statement执行SQL,返回结果到ResultSet。

    • 使用ResultSet读取数据,然后通过代码转化为具体的POJO。

    • 关闭数据库相关资源。

    传统的JDBC方式有些弊端,其一,工作量大(创建连接到关闭连接中的每一个步骤我们自己操作)。其二,我们自己捕捉异常并处理,释放资源。一个简单的SQL在JDBC中如此复杂,何况复杂的SQL,于是ORM框架出现了。不过所有的ORM框架都封装了JDBC,就是强度不一样而已。

ORM模型

    由于JDBC的缺陷,在实际工作中我们很少用JDBC进行编程,于是提出了对象关系映射(Object Relational Mapping),简称ORM,那什么是ORM呢?简单的说,ORM模型就是数据库的表和简单JAVA对象(POJO)的映射关系模型。它主要解决数据库数据和POJO之间的相互映射。如下:

image.png

    有了ORM模型,在大部分情况下,程序员只需要了解Java应用而无需对数据库相关知识深入了解,便可以写出通俗易懂的程序。此外,ORM模型提供了统一的规则使得数据库的数据通过配置便可轻易映射到POJO上。

Hibernate

    EJB失败后,Hibernate就成了Java世界首选的ORM模型,它是建立在POJO和数据库表模型的直接映射关系上的。Hibernate是建立在若干POJO通过XML映射文件(或注解)提供的规则映射到数据库表上的。我们可以通过POJO直接操作数据库的数据。它提供的全表映射模式,如下:

image.png

Hibernate优点:

    • 消除了代码的映射规则,它全部被分离到了XML或注解里面去配置。

    • 无需再管理数据库连接,它也配置在XML里面。

    • 一个会话中不在操作多个对象,只要操作Session对象即可。

    • 关闭资源只需要关系Session即可。

Hibernate缺点:

    • 全表映射带来的不变,比如更新时需要发送所有的字段。

    • 无法根据不同的条件组装不同的SQL

    • 多表关联和复杂SQL支持较差,需要自己写SQL,返回后,需要自己将数据组装成POJO。

    • 不能有效支持存储过程。

    • 虽然有HQL,但性能较差,大型互联网系统往往需要优化SQL,而Hibernate做不到。

MyBatis

    Mybatis是半自动化的,是因为它需要手工匹配提供POJO,SQL和映射关系,而Hibernate只需要提供POJO和映射关系即可。MyBatis的前身是iBatis,是基于Java的持久化框架。MyBatis所需要提供的映射文件包含以下三个部分:SQL,映射规则,POJO,映射模型如下:

image.png

    虽然MyBatis感觉有点麻烦,但是灵活,自己写SQL,定义映射关系,此外,MyBatis提供接口编程的映射器,只需要一个接口和映射文件便可以运行。

MyBatis,Hibernate,JDBC怎么选择?

    MyBatis:灵活,可以动态生成映射关系的框架,可以完全替代JDBC,同时提供了缓存,日志,级联。缺点就是工作量就大一点,,,等。

    Hibernate:编程简易,映射规则可以通过IDE生成,同时提供了缓存,日志,级联等,缺点就是不够灵活,难以优化,,,等

    JDBC:不推荐了,除非简单的功能考虑用一用。


第二部分:MyBatis的基本概念

MyBatis的基本构成

    我们先了解下MyBatis的核心组件:

image.png

    • SqlSessionFactoryBuilder(构造器),它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)

    • SqlSessionFactory,依靠工厂来生成SqlSession(会话)

    • SqlSession,是一个即可以发送SQL去执行并返回结果,也可以获取Mapper的接口

    • SQL Mapper,它是MyBatis新设计的组件,它是有一个Java接口和XML文件(或注解)构成的,需要给出对应的SQL和映射规则。它负责执行SQL并返回结果。

1、构建SqlSessionFactory

    每个MyBatis的应用都是以SqlSessionFactory的实例为中心的,可以通过SqlSessionFactoryBuilder获取,SqlSessionFactory是一个工厂接口而不是实现类。它的任务是创建SqlSesion。MyBatis提供了两种模式去创建SqlSessionFactory:一种是XML配置,另一个中是代码的方式,一般推荐XML的配置方式。

2、创建SqlSession

    SqlSession是一个接口类,它类似于你们公司前台美女,门面的作用,而真正干活的是Executer接口,你认为它是公司的工程师。假设我是客户找你们公司干活,我只需要告诉前台的美女客户(SqlSession),我要什么信息(参数),要做什么东西,过段时间,她会将结果给我,我们所所关心的是:

    1. 要给美女客户(SqlSession)什么信息(功能和参数)

    2. 美女客户会返回什么结果(Result)

SqlSession的用途主要有两种:

    1. 获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库后返回结果。

    2. 直接通过命名信息去执行SQL。

3、映射器

    映射器又Java接口和Xml文件共同组成的,它的作用如下:

    • 定义参数定义

    • 描述缓存

    • 描述SQL语句

    • 定义查询结果好POJO映射关系

    一个映射器的实现方式有两种,一种是通过Xml方式,另一个就是通过代码来实现。一般推荐Xml的方式实现,理由如下:

    • Java注释是受限的,功能较少,而MyBatis的内容相当多,而且相当复杂,功能强大。

    • 如果你的SQL很复杂,条件很多,尤其是存在动态SQL时,写在Java里可读性差,增加了维护成本。

2.3 生命周期

Mybatis的生命周期,如下:

image.png

SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder是Xml或者Java编码获得资源来构建SqlSessionFactory的。通过它可以构建多个SqlSessionFactory。它的作用就是一个构造器,一旦我们的构建了SqlSessionFactory,它的作用就已经完结,失去了存在的意义,这时我们就应该毫无犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的局部,它的作用就是生成SqlSessionFactory对象。

SqlSessionFactory

    SqlSessionFactory的作用就是创建SqlSession,而SqlSession就是一个会话,相当于JDBC中的Connection对象。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory来创建SqlSession。所以SqlSessionFactory应该在MyBatis应用的整个生命周期中。

    如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接资源,那么连接资源就很快会被耗尽。因此SqlSessionFactory的责任是唯一的,就是创建SqlSession,所以我们果断创建单例模式。如果我们创建多例那么它对数据库连接的消耗是很大的,不利于我们统一的管理。所以一个数据库只对应一个SqlSessionFactory。

SqlSession

    SqlSession是一个会话,相当于JDBC的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,在涉及多线程的时候我们需要特别小心,操作数据库需要注意隔离级别,数据库锁等高级特性。

    每次创建SqlSession都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

Mapper

    Mapper是一个接口,而没有任何实现类,它的作用就是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此它应该在一个SqlSession事务方法之内,是一个方法级别的东西。它就如同JDBC里的一个SQL语句的执行,它最大的范围和SqlSession相同。尽管我们想一直保存着Mapper,但是你会发现它是很难控制,所以尽量在一个SqlSession事务的方法中使用它们,然后废弃掉。


案例代码

    本项目使用的案例代码gitee上了,会持续更新:

         地址:https://gitee.com/u2r2otkit/MyBatis-Integration-Project

         对应的项目:MyBatis-Integration-Project

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章