2023-03-19 14:16:11
Mybatis中执行Select语句的流程
Mybatis中执行Select语句是一个复杂但有序的过程,它依赖于Mybatis的多个核心组件协同工作。以下是Mybatis执行Select语句的详细流程:
SqlSession的调用:
在Mybatis中,所有的数据库操作都是通过SqlSession对象进行的。当执行Select语句时,首先会调用SqlSession的selectList()方法。
在Spring与Mybatis整合的环境中,通常注入的是SqlSessionTemplate对象,它内部封装了SqlSession的操作,并提供了线程安全的功能。
获取MappedStatement:
SqlSession的selectList()方法会根据Mapper方法的全类名(即namespace+id)从Mybatis的配置中获取到对应的MappedStatement对象。MappedStatement对象包含了SQL语句的详细信息,如参数类型、结果映射等。
缓存处理:
Mybatis支持一级缓存和二级缓存。在执行SQL之前,会先检查缓存中是否存在相同查询的结果。
如果开启了二级缓存,并且缓存中存在结果,则直接返回缓存中的结果,不再执行SQL语句。
如果二级缓存中不存在结果,或者没有开启二级缓存,则会检查一级缓存。一级缓存通常是在SqlSession级别的,如果一级缓存中存在结果,也会直接返回。
Executor执行:
如果缓存中没有结果,Mybatis会将查询任务交给Executor执行。Executor是Mybatis的核心组件之一,负责执行SQL语句并返回结果。
Executor有多种实现,如CachingExecutor(支持缓存的Executor)、BaseExecutor(基础Executor)、SimpleExecutor(简单Executor,直接执行SQL)等。
在执行查询时,通常会先尝试使用CachingExecutor,如果开启了缓存并且缓存中有结果,则直接返回。否则,会调用BaseExecutor的query()方法,该方法会进一步调用SimpleExecutor的doQuery()方法执行SQL语句。
StatementHandler处理:
在SimpleExecutor的doQuery()方法中,会生成一个StatementHandler对象。StatementHandler负责处理SQL语句的生成、参数的设置以及SQL的执行。
StatementHandler有多种实现,如PreparedStatementHandler(处理预编译SQL语句)、CallableStatementHandler(处理存储过程)等。
在执行SQL之前,StatementHandler会调用ParameterHandler设置SQL语句的参数。ParameterHandler会根据MappedStatement中的参数类型信息,使用TypeHandler将Java对象转换为数据库能够识别的类型。
参数设置完成后,StatementHandler会调用JDBC的PreparedStatement对象执行SQL语句。
ResultSetHandler处理结果:
SQL语句执行后,会返回一个ResultSet对象。Mybatis使用ResultSetHandler对ResultSet进行处理,将结果映射为Java对象。
ResultSetHandler会根据MappedStatement中的结果映射信息,使用TypeHandler将数据库中的数据类型转换为Java对象中的数据类型。
处理完成后,ResultSetHandler会返回映射后的Java对象列表。
返回结果:
最后,SqlSession的selectList()方法会将ResultSetHandler返回的结果返回给调用者。
以下是Mybatis执行Select语句的流程图和相关图片:
流程图:(由于文本格式限制,无法直接绘制流程图,但可以参考Mybatis源码中的流程图或相关文档)
相关图片:








通过这些图片和描述,可以更加直观地理解Mybatis执行Select语句的流程。