在MyBatis中,StatementHandler和MappedStatement分别是什么?它们有何区别?

参考回答

StatementHandlerMappedStatement是MyBatis中的两个重要概念,它们在SQL语句的执行过程中扮演着不同的角色。

  • MappedStatement:它是MyBatis中的一个重要对象,表示对一个SQL语句的封装。它包含了SQL语句的详细信息(如SQL、参数类型、返回类型等),是MyBatis执行映射操作时的一个关键对象。

  • StatementHandler:它是用于执行SQL语句的对象,负责构建SQL语句的执行对象(如PreparedStatement)。在MyBatis执行数据库操作时,StatementHandler负责将SQL语句传递给数据库并执行,处理执行过程中的参数设置、SQL语句的执行等。

详细讲解与拓展

1. MappedStatement

  • 作用MappedStatement是MyBatis用于存储映射SQL语句的对象,它包含了SQL语句的所有配置信息,如:

    • SQL语句的内容。
    • SQL语句对应的参数和结果的映射。
    • 执行SQL语句所需的执行器类型(例如SELECTINSERT等)。
  • 结构MappedStatement是通过SqlSessionFactoryConfiguration的配置文件中的SQL映射生成的,它封装了一个Statement对象,负责保存具体的SQL查询、更新等操作的元数据。

  • 举例

    <select id="selectUser" parameterType="int" resultType="User">
      SELECT * FROM users WHERE age > #{age}
    </select>
    

    上面的selectUser就是一个MappedStatement对象,MyBatis会根据该配置构建MappedStatement,其中保存了SQL、参数类型和返回类型等信息。

  • 使用:在MyBatis的执行过程中,MappedStatement用来获取SQL语句、映射参数类型、查询结果类型等,并传递给StatementHandler来执行。

2. StatementHandler

  • 作用StatementHandler的主要职责是将MappedStatement中的SQL语句执行,并处理数据库交互。它负责以下几个方面:

    • 创建PreparedStatement:根据MappedStatement中的SQL语句,StatementHandler创建一个PreparedStatement
    • 设置SQL参数StatementHandler负责将查询或更新操作的参数设置到PreparedStatement对象中。
    • 执行SQL语句StatementHandler负责执行PreparedStatement(比如执行查询、插入、更新等操作)。
    • 处理结果映射:对于查询操作,StatementHandler还会处理查询结果的映射,将数据库结果集转换成Java对象。
  • 结构StatementHandler在MyBatis中有多个实现类,主要有:
    • SimpleStatementHandler:用于执行简单的SQL语句。
    • PreparedStatementHandler:用于执行带有PreparedStatement的SQL语句(通常是SELECTINSERT等带有参数的操作)。
    • CallableStatementHandler:用于执行存储过程调用的SQL语句。
  • 示例:当MyBatis执行SQL时,StatementHandler负责创建PreparedStatement并将MappedStatement中的参数传递给它。
    StatementHandler statementHandler = configuration.newStatementHandler();
    statementHandler.prepare(sqlSession, statement, parameters);
    

3. 两者的区别

比较项 MappedStatement StatementHandler
作用 封装SQL语句的配置信息,描述SQL语句的元数据。 执行SQL语句,处理SQL执行过程中的所有操作,包括参数设置、执行SQL等。
包含信息 包含SQL语句、SQL类型、参数类型、返回类型等信息。 包含执行SQL所需的逻辑和执行方法。
主要功能 存储和管理SQL语句映射的配置信息,用于在执行SQL时调用。 创建并执行SQL语句,通过PreparedStatement执行SQL。
使用时机 在映射文件中定义SQL语句时由MyBatis生成并存储。 在执行SQL时由MyBatis使用,通常是每个执行操作时都会涉及。
实现方式 MappedStatement通常由MyBatis根据映射文件(XML或注解)自动创建并管理。 StatementHandler可以根据不同类型的SQL语句,选择不同的实现(如PreparedStatementHandler)。

4. 工作流程

  • MappedStatement的工作流程
    1. 开发者在MyBatis的映射文件中定义SQL语句,并指定参数和返回结果类型。
    2. MyBatis根据映射文件中的配置,创建MappedStatement对象,封装SQL语句、参数类型等元数据。
  • StatementHandler的工作流程
    1. 当执行SQL时,SqlSession会根据MappedStatement创建对应的StatementHandler
    2. StatementHandler通过MappedStatement获取SQL、参数类型等信息,构建并准备SQL语句的执行。
    3. 它会将参数设置到PreparedStatement中,然后执行SQL语句,并将查询结果映射到Java对象(如果是查询操作)。

5. 总结

  • MappedStatement是一个表示SQL映射配置的对象,包含了SQL语句、参数、返回类型等信息,而StatementHandler负责根据MappedStatement执行SQL语句,并处理SQL参数设置和结果映射等操作。
  • MappedStatement更多的是一个“数据持有者”,它存储了SQL操作的元数据;而StatementHandler则是实际执行SQL操作的对象,负责SQL的执行过程。

发表评论

后才能评论