Handwritten Mybatis framework (semi-automatic ORM framework) - 01: Analyze and implement the three stages of Mybatis

1. Realization 01: Review Mybatis

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

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

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


1.1 Preparation (code is not important, now it is important to understand the process)

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

This is a tool class of Mybatis written by me

Insert picture description here

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 file to be held

Insert picture description here

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 The realization of Mybatis is divided into 3 stages (emphasis)

Insert picture description here

1.2.1 Initialization phase

Insert picture description here

1.2.2 Agency stage

Insert picture description here

The most amazing thing here is why we didn't define the implementation class of the Mapper interface, but we can get its implementation class through a database session?

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

BlogMapper是Blog类Mapper层接口,他的具体实现是写在BlogMapper.xml中的。

Insert picture description here


mybatis-config.xml

Declare the location of BlogMapper.xml in the mybatis core configuration file.

Insert picture description here

1.2.3 Data read and write stage

Insert picture description here