breadcrumb: false
navbar: true
sidebar: true
pageInfo: true
contributor: true
editLink: true
updateTime: true
prev: true
next: true
comment: true
footer: true
password: 111
backtotop: true
title: 第05篇:Mybatis的SQL执行流程分析
category: Mybatis
一、前言
前面我们知道了Mybatis是如何进行代理的, 但是最终 PlainMethodInvoker
中是如何将参数转组装成Sql,并执行处理Sql返回值的地方还都没看到。本篇我们就带着如下三个问题开始我们的探索吧。
本篇内容因为涉及跟jdbc的知识,如果对这部分内容有点遗忘,请先JDBC知识复习,另本篇内容知识点较多,目录较复杂,建议根据文字结合
代码在实践的过程中一起学习。最好也可以自己debug一下。会收获更大。做好准备现在发车。
二、流程分析
2.1 Sql是如何组装参数的?
在组装参数之前我们先来提一个小问题,sql的类型是如何判断的。sql类型有增删该查。
除了查询会有结果集外,其他三种都是返回更新行数。他们对应的处理逻辑也是不一样的。
我们要先弄清这个问题。
2.1.1 sql类型如何判断?
我们知道sql的类型是可以通过关键字来判断的,如select/update/delete/insert。那么在Mybatis中哪里能输入sql呢?
一种有2种方式。
- 在Mapper.xml中直接编写sql,如下示例。
delete from T_USER
where token_id = #{tokenId,jdbcType=CHAR}
insert into T_USER (token_id, uid, name)
values (#{tokenId,jdbcType=CHAR}, #{uid,jdbcType=INTEGER}, #{name,jdbcType=CHAR})
update T_USER
set uid = #{uid,jdbcType=INTEGER},
name = #{name,jdbcType=CHAR}
where token_id = #{tokenId,jdbcType=CHAR}
- 在Mapper类中使用注解编写sql
public interface TUserMapper {
@Select("select * from t_user where id = #{id}")
TUser selectById(Long id);
}
这些sql信息都保存在 MappedStatement。在PlainMethodInvoker通过SqlCommand进行调用。
- line(9) 最终通过type = ms.getSqlCommandType() 获取sql的类型