深入浅出Mybatis框架技术原理——笔记总结(一)

深入浅出Mybatis框架技术原理(一)

    • 读前说明:
  • Mybatis简介及简单使用
    • Hibernate
      • Hibernate的优缺点
    • Mybatis
      • 配置文件。
      • 映射文件
      • Mapping接口类
      • POJO类
  • Mybatis的基本构成
    • Mybatis的核心组件
    • 生命周期:

读前说明:

在使用Mybatis后,希望能对Mybatis有更深入的理解和研究,此文是个人阅读后的笔记,和对知识内容的重点记录。旨在加深对技术的记忆理解和便于之后对技术的温习。希望也能给热爱技术的小伙伴一些帮助,欢迎大家讨论技术问题,也欢迎大家指出文中有问题的地方,但请勿开杠东南西北风!!! 如对小伙伴有帮助,点个赞收藏一下趴!总结不易,感谢感谢!!!

Mybatis简介及简单使用

Java程序都是通过JDBC(Java Data Base Connectivity)连接数据库的,这样我们就可以通过sql对数据库进行编程。JDBC是SUN公司提出的规范,只定义了接口规范,具体的实现是由各个数据库厂商实现的。(JBDC是一种典型的桥接模式)。

传统的JDBC大致分为以下几步

  • 连接数据库,注册驱动和数据库信息
  • 操作Connection对象,打开Statement对象
  • 通过Statement执行Sql,返回结果到Result对象
  • 使用Result读取数据,通过代码转化为具体的pojo对象
  • 关闭数据库相关资源

而传统的JDBC存在一些弊端。

  1. 工作量相对较大。需要先连接,需要处理JDBC底层事务,处理数据类型;还需要操作Connection,Statement,Result对象并准确关闭他们。
  2. 我们要对JDBC编程可能产生的异常进行捕捉处理并正确的关闭资源。

于是对象关系映射(Object Relational Mapping)模型出现了,简称ORM。简单的说,ORM模型就是数据库的表和简单Java对像的映射关系模型,通过这层关系可以简单迅速地把数据库表的数据转换为pojo。

Hibernate

Hibernate是一种全自动化持久层框架,程序员不需要在写任何的sql。只需要提供Hibernate的配置信息文件hibernate.cfg.xml,制定映射规则的文件XXX.hbm.xml,以及与XXX表相映射的POJO类

深入浅出Mybatis框架技术原理——笔记总结(一)_第1张图片

本文就不展开讲Hibernate的使用了,感兴趣的猿猿们可以另去学习。

Hibernate的优缺点

优点:

  • 消除了代码的映射规则。它被分离到XML或者注解里面去配置。
  • 无需再管理数据库连接,它也配置在XML里面。
  • 一个会话中,不要操作多个对象,只要操作session对象即可。
  • 关闭资源只需要关闭一个session即可。

缺点:

  • 全表映射,意味着无法根据不同的条件组装不同的Sql。
  • 对多表关联和复杂Sql查询支持较差。需要自己写Sql,返回后,需要自己将数据组装为pojo。
  • 不能有效支持存储过程。
  • 最为致命的是性能较差。

所以,Hibernate只适用于场景不太复杂,要求性能不太苛刻的场景。

在项目开发中,灵活、Sql优化、性能等是比较重要的因素,显然Hibernate无法满足我们的要求,这时Mybatis诞生了。

Mybatis

Mybatis是一个半自动化映射框架。之所以称它为半自动,是因为它需要手工匹配提供pojo、Sql和映射关系,而全表映射的Hibernate只需要提供pojo和映射关系便可。
Mybatis更为灵活,可以动态生成映射关系,拥有动态列、动态表名、支持存储过程,同时提供了简易的缓存、日志、级联。
使用mybatis需要提供基础配置文件映射文件mapping接口类、以及相映射的POJO类
深入浅出Mybatis框架技术原理——笔记总结(一)_第2张图片

Mybatis提供的映射文件包含以下三个部分。

  • Sql
  • 映射规则
  • POJO

配置文件。

深入浅出Mybatis框架技术原理——笔记总结(一)_第3张图片
properties元素,设置,typeAliases别名,typeHandlers类型处理器,对象工厂等就配置可不用配置。
下面是一个具体的配置文件 mybatis_config.xml。
深入浅出Mybatis框架技术原理——笔记总结(一)_第4张图片
文件里是数据库和其他基础配置信息。
这里主要对environments配置和mappers配置进行说明。
environments配置环境——配置环境可以注册多个数据源(dataSource),每一个数据源分为两大部分:一个是数据库源的配置,另外一个是数据库事务(transactioniManager)的配置。

  • enviromnents中的属性default,标明在缺省的情况下,我们将启用哪个数据源配置。
  • environment元素是配置一个数据源的开始,属性id是设置这个数据源的标志,以便MyBatis上下文使用它。
  • transactionManager配置的是数据库事务,其中type属性有3种配置方式。
    (1) JDBC,采用JDBC方式管理事务,在独立编码中我们常常使用。
    (2) MANAGED,采用容器方式管理事务,在JNDI数据源中常用。
    (3)自定义,由使用者自定义数据库事务管理办法,适用于特殊应用。
  • dataSource标签,是配置数据源连接的信息,type属性是提供我们对数据库连接方式的配置,同样MyBatis提供这么几种配置方式:
    (1)UNPOOLED,非连接池数据库(UnpooledDataSource )。
    (2) POOLED,连接池数据库(PooledDataSource)。
    (3) JNDI, JNDI数据源 (JNDlDataSource)0
    (4)自定义数据源。
    其中,配置的property元素,就是定义数据库的各类参数。

数据库事务——数据库事务MyBatis是交由SqiSession去控制的,我们可以通过SqiSession提交 (commit)或者回滚(rollback)。在大部分的工作环境下,我们都会使用Spring框架来控制它。

数据源——MyBatis内部为我们提供了3种数据源的实现方式。

  • UNPOOLED,非连接池,使用MyBatis提供的。rg.apache.ibatis.datasource.unpooled. UnpooledDataSource实现。
  • POOLED,连接池,使用MyBatis提供的。rg.apache.ibatis.datasource.pooled.PooledData Source实现。
  • JNDI,使用 MyBatis提供的 org.apache.ibatis.datasource.jndi.JndiDataSourceFactory 来获取数据源。

我们只需要把数据源的属性type定义为UNPOOLED、 POOLED. JNDI即可。这3种实现方式比较简单,只需要配置参数即可,但有时候我们需要使用其他的数据源。
如果使用自定义数据源,它必须实现org.apache.ibatis.datasource.DataSourceFactory接口。比如说我们可能要用DBCP数据源,这个时候我们需要自定义数据源。

深入浅出Mybatis框架技术原理——笔记总结(一)_第5张图片深入浅出Mybatis框架技术原理——笔记总结(一)_第6张图片
然后按照下面的方法配置就可以使用DBCP数据源了。(自定义的数据源绝大多数情况下用不到)
在这里插入图片描述
在开发过程中,配置文件一般只需要做好基础的配置可以了。如要做其他配置,这一块网上有很多资料

mappers——配置映射文件,Mybatis会读取这个映射文件生成映射器。
深入浅出Mybatis框架技术原理——笔记总结(一)_第7张图片

基础配置文件配好之后,其次是映射文件。

映射文件

如下图 Role.xml 文件。
深入浅出Mybatis框架技术原理——笔记总结(一)_第8张图片
这里给出了Sql,但是并没有给出映射规则。使用过mybatis的就会知道,我们使用的Sql列名和POJO的属性名保持一致,Mybatis会自动提供映射规则。
映射器是Mybatis最强大的工具,也是使用Mybatis时用的最多的工具。后面会重点讲到。

Mapping接口类

如下图 RoleMapper.java接口。
深入浅出Mybatis框架技术原理——笔记总结(一)_第9张图片
注意仅仅是接口,而无需实现类。实现类是Mybatis通过动态代理自动为我们创建的。后面会重点讲到。但如果只是简单掌握Mybatis的使用,不打算使用Mybatis插件的话可以跳过。

为了使用Mybatis,还需要建立SqlSessionFactory
SqlSessionFactory的构建如下图:
深入浅出Mybatis框架技术原理——笔记总结(一)_第10张图片

POJO类

public class Role {
    String id;
    String roleName;
    String note;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}

然后就可以使用Mybatis进行开发了。
深入浅出Mybatis框架技术原理——笔记总结(一)_第11张图片深入浅出Mybatis框架技术原理——笔记总结(一)_第12张图片
这样就完成了Mybatis的代码编写,可见Mybatis更为灵活,我们可以自由书写Sql,定义映射规则。

Mybatis的基本构成

Mybatis的核心组件

  1. SqlSessionFactoryBuilder(构造器):根据配置信息或者代码生成SqlSessionFactory(工厂接口)
  2. SqlSessionFactory:依靠工厂来生成SqlSession
  3. SqlSession:(1)发送Sql去执行并返回结果。(2)获取Mapper接口。
  4. Sql Mapper:由Java接口和Xml文件构成,需要给出对应的Sql和映射规则

他们的关系如下图:
深入浅出Mybatis框架技术原理——笔记总结(一)_第13张图片
构建SqlSessionFactory:
SqlSessionFactory是一个工厂接口而不是实现类,它的任务是创建SqlSession。两种创建方式:一是xml文件的方式;二是代码的方式
推荐使用第一种, 1.避免硬编码,2.方便日后对配置的修改,3.避免重复编译代码。所以代码方式不做说明了。
xml配置方式,即配置一个上面提及的基础配置文件 (上文的mybatis_config.xml文件),然后创建一个XML文件输入流,用SqlSessionFactoryBuilder读取xml信息来创建SqlSessionFactory对象(上面有贴具体代码)。

构建SqlSession:
SqlSession是一个接口,它只是充当门面的作用,真正干活的是Executor接口。通过SqlSessionFactory对象调用openSession方法获取。

映射器:
映射器是Mybatis最复杂,最核心的组件。 映射器的实现方式有两种:一是xml的方式实现;二是通过代码方式实现。同样推荐第一种,1.代码方式是在Configuration里面注册Mapper接口,还需要在接口类写入Java注解,而Java注解是受限的,功能较少,xml方式更为灵活强大。2.Sql很复杂时,写在接口类里可读性很差
xml配置方式
(1)给出Java接口,即Mapper接口类(上文RoleMapper.java)。
(2)给出映射文件(上文Role.xml)(映射文件是在基础配置文件中配置了的)
然后就可以用SqlSession来获取这个Mapper,调用方法执行Sql。

深入浅出Mybatis框架技术原理——笔记总结(一)_第14张图片
Java注解方式:
如下图 RoleMapper2.java:

深入浅出Mybatis框架技术原理——笔记总结(一)_第15张图片
然后加入这一段代码注册这个接口为映射器,如下所示。
在这里插入图片描述

生命周期:

  • SqlSessionFactoryBuilder:只存在于方法的局部。因为它的作用就是一个构建器,一旦构建了SqlSessionFactory,就应该毫不犹豫的废弃它,将它回收。
  • SqlSessionFactory:Mybatis应用的整个生命周期中。它的责任是唯一的,就是创建SqlSession,所以我们可以采用单例模式。
  • SqlSession:生命周期是在请求数据库处理事务的过程中。注意:它是一个线程不安全的对象。
  • Mapper:生命周期在SqlSession事务方法之内,是一个方法级别的东西。

你可能感兴趣的