Mybatis源码解析-主要工作流程分析

2021-12-15  本文已影响0人  java自力更生

前言

在阅读本系列文章之前,确保读者已经对Mybatis的基本使用有所掌握。
在阅读源码过程中,初学者往往忽略了框架的主要工作流程,而专注于细节实现,很容易迷失方向,所以,在源码解析之前,首先要了解框架主要做了什么事情。

步骤拆解,相应的源码解析将会在后面章节说明

1.解析Xml文件,读取对应的statement、resultMap、namespace等信息。

内部通过XMLMapperBuilder类实现该功能。

2.为标注有Mapper注解的接口生成代理对象MapperProxy。

内部通过为各个Mapper接口生成MapperFactoryBean对象注入Spring容器,而MapperFactoryBean对象实现了FactoryBean接口,需要读者首先了解FactoryBean的作用于用法。

3.根据调用的Mapper方法和入参,匹配相应的statement,进行sql拼接,调用executor执行。

内部通过动态代理、Executor的实现类实现。我们来看一下未使用Mybatis框架的代码实现:

// 获取链接
connection = DriverManager.getConnection(url, username, password);

// 创建statement
preparedStatement = connection.prepareStatement("select * from t_person where id = ?");
preparedStatement.setLong(1, id);

// 执行
resultSet = preparedStatement.executeQuery();            

4.遍历结果,将Mysql中的数据对象转换成Java对象。

内部通过反射和TypeHandler实现。我们来看一下未使用Mybatis框架的代码实现:

// 遍历结果集
    Person person = null;
    while (resultSet.next()) {
        Long realId = resultSet.getLong("id");
        String name = resultSet.getString("name");
        String mobile = resultSet.getString("mobile");
        int age = resultSet.getInt("age");
        Date createAt = resultSet.getDate("create_at");
        Date updateAt = resultSet.getDate("update_at");
        person = new Person();
        person.setId(realId);
        person.setName(name);
        person.setMobile(mobile);
        person.setAge(age);
        person.setCreateAt(createAt);
        person.setUpdateAt(updateAt);
    }
    return person;

总结

Mybatis框架分离了sql语句执行与业务逻辑实现,减少与数据库相关的操作,让开发者能够专注于业务代码开发。

上一篇下一篇

猜你喜欢

热点阅读