手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段相关的知识,希望对你有一定的参考价值。

1. 实现01: 回顾Mybatis

对于数据库的操作,在以后,用原始的JDBC肯定是比较少的(但很重要)。
大多数时候,我们都会使用框架去操作,我个人比较喜欢使用Mybatis。
既然用的比较熟练了,那我就象征性的写个框架试试吧。

Hibernate是全自动ORM框架,而Mybatis是半自动的。hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。这就是为什么Mybatis是半自动的原因。

正是因为mysql的这种特性,让它具有了底层调优的能力(对于Sql的调优)


1.1 准备工作(代码不重要,现在重要的理解流程)

在这里插入图片描述

  • 实体类的数据库表是一一对应的
  • mapper接口是我们自定义的,其目的按照需求去操作数据,这里往往有很多CRUD(增删改查的接口)
  • mapper接口的每一个方法其实是对应一条SQL语句的,我们往往配套的有一个mapper.xml文件。这里面的对应关系是:namespace对应实体类的类名,id对应mapper接口的方法名,这样Myabtis就能定位到每一条Sql语句。在mybatis的源码中,会以Map的数据结构存储sql语句,其中namespace+id 为 key , sql语句为value。

这是我写的Mybatis的一个工具类
在这里插入图片描述

MybatisUtils.java

package com.tian.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    /**
     * Description:  SqlSessionFactory可以获得session
     */
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
//         第一步: 使用Mybatis获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * MethodName: getSqlSession
     * Description:  SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
     * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);
    }
}

待会的测试文件
在这里插入图片描述

Test.java

    @org.junit.Test
    public void test01() {
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        BlogMapper mapper1 = sqlSession1.getMapper(BlogMapper.class);
        Map map = new HashMap();
        map.put("title", "微服务");
        List<Blog> blogs = mapper1.queryBlogIf(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession1.close();
    }

1.2 Mybatis的实现分为3个阶段(重点)

在这里插入图片描述


1.2.1 初始化阶段

在这里插入图片描述


1.2.2 代理阶段

在这里插入图片描述

这里最神奇的是,为什么我们没有定义Mapper接口的是实现类,但是我们可以通过一次数据库的会话,拿到它的实现类呢?

在mybatis中我们可以通过调用mapper接口去直接获取数据库中的数据,而不需要去实现
mapper接口,其实是就是使用了动态代理的方式,为mapper接口创建了代理对象,在代理
对象中实现了相应的访问数据库的逻辑。

BlogMapper是Blog类Mapper层接口,他的具体实现是写在BlogMapper.xml中的。
在这里插入图片描述
mybatis-config.xml

在mybatis核心配置文件中声明BlogMapper.xml的位置。
在这里插入图片描述


1.2.3 数据读写阶段

在这里插入图片描述



以上是关于手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段的主要内容,如果未能解决你的问题,请参考以下文章

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD

面试官让我现场手写MyBatis框架,我10分钟就搞定了!!(全程实战,建议收藏)

SSM框架——使用MyBatis Generator自动创建代码

SSM框架-使用MyBatis Generator自动创建代码