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语句执行与业务逻辑实现,减少与数据库相关的操作,让开发者能够专注于业务代码开发。