Mybatis中如何执行Select语句,你真的知道吗?

Mybatis中如何执行Select语句,你真的知道吗?
最新回答
每一种创伤都是一种成熟

2023-03-19 14:16:11

Mybatis中执行Select语句的流程

Mybatis中执行Select语句是一个复杂但有序的过程,它依赖于Mybatis的多个核心组件协同工作。以下是Mybatis执行Select语句的详细流程:

  1. SqlSession的调用

    在Mybatis中,所有的数据库操作都是通过SqlSession对象进行的。当执行Select语句时,首先会调用SqlSession的selectList()方法。

    在Spring与Mybatis整合的环境中,通常注入的是SqlSessionTemplate对象,它内部封装了SqlSession的操作,并提供了线程安全的功能。

  2. 获取MappedStatement

    SqlSession的selectList()方法会根据Mapper方法的全类名(即namespace+id)从Mybatis的配置中获取到对应的MappedStatement对象。MappedStatement对象包含了SQL语句的详细信息,如参数类型、结果映射等。

  3. 缓存处理

    Mybatis支持一级缓存和二级缓存。在执行SQL之前,会先检查缓存中是否存在相同查询的结果。

    如果开启了二级缓存,并且缓存中存在结果,则直接返回缓存中的结果,不再执行SQL语句。

    如果二级缓存中不存在结果,或者没有开启二级缓存,则会检查一级缓存。一级缓存通常是在SqlSession级别的,如果一级缓存中存在结果,也会直接返回。

  4. Executor执行

    如果缓存中没有结果,Mybatis会将查询任务交给Executor执行。Executor是Mybatis的核心组件之一,负责执行SQL语句并返回结果。

    Executor有多种实现,如CachingExecutor(支持缓存的Executor)、BaseExecutor(基础Executor)、SimpleExecutor(简单Executor,直接执行SQL)等。

    在执行查询时,通常会先尝试使用CachingExecutor,如果开启了缓存并且缓存中有结果,则直接返回。否则,会调用BaseExecutor的query()方法,该方法会进一步调用SimpleExecutor的doQuery()方法执行SQL语句。

  5. StatementHandler处理

    在SimpleExecutor的doQuery()方法中,会生成一个StatementHandler对象。StatementHandler负责处理SQL语句的生成、参数的设置以及SQL的执行。

    StatementHandler有多种实现,如PreparedStatementHandler(处理预编译SQL语句)、CallableStatementHandler(处理存储过程)等。

    在执行SQL之前,StatementHandler会调用ParameterHandler设置SQL语句的参数。ParameterHandler会根据MappedStatement中的参数类型信息,使用TypeHandler将Java对象转换为数据库能够识别的类型。

    参数设置完成后,StatementHandler会调用JDBC的PreparedStatement对象执行SQL语句。

  6. ResultSetHandler处理结果

    SQL语句执行后,会返回一个ResultSet对象。Mybatis使用ResultSetHandler对ResultSet进行处理,将结果映射为Java对象。

    ResultSetHandler会根据MappedStatement中的结果映射信息,使用TypeHandler将数据库中的数据类型转换为Java对象中的数据类型。

    处理完成后,ResultSetHandler会返回映射后的Java对象列表。

  7. 返回结果

    最后,SqlSession的selectList()方法会将ResultSetHandler返回的结果返回给调用者。

以下是Mybatis执行Select语句的流程图和相关图片:

流程图:(由于文本格式限制,无法直接绘制流程图,但可以参考Mybatis源码中的流程图或相关文档)

相关图片

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