InnerInterceptor接口定义了一系列的方法,这些方法提供了在MyBatis执行SQL操作过程中的各个环节插入自定义逻辑的钩子(hooks)。这使得开发者可以在查询(query)或更新(update`)操作的不同阶段执行自定义逻辑,例如修改SQL语句、处理参数等。下面是对这些方法用途和作用时机的解释:

willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)

  • 在执行查询操作之前被调用。

  • 可以用来决定是否继续执行后续的查询操作。

  • 返回false可以阻止查询的执行。

beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)

  • 在执行查询操作之前被调用,紧接着willDoQuery之后。

  • 可以用来修改查询的环境或参数,例如修改BoundSql对象中的SQL语句。

willDoUpdate(Executor executor, MappedStatement ms, Object parameter)

  • 在执行更新操作之前被调用,例如insertupdatedelete操作。

  • 可以用来决定是否继续执行后续的更新操作。

  • 返回false可以阻止更新操作的执行。

beforeUpdate(Executor executor, MappedStatement ms, Object parameter)

  • 在执行更新操作之前被调用,紧接着willDoUpdate之后。

  • 可以用来修改更新操作的环境或参数。

beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout)

  • StatementHandler准备SQL语句(即调用PreparedStatementprepare方法)之前被调用。

  • 可以用来修改准备SQL语句的环境,例如修改超时时间。

beforeGetBoundSql(StatementHandler sh)

  • 在获取BoundSql(即包含最终执行SQL语句的对象)之前被调用。

  • 可以用来修改或替换BoundSql对象。

setProperties(Properties properties)

  • 在拦截器初始化时被调用,用于设置拦截器的属性。

  • 可以通过XML配置或编程方式为拦截器传入自定义的属性。

通过实现InnerInterceptor接口,开发者可以在MyBatis的SQL执行流程中的关键点插入自定义逻辑,从而实现如SQL日志记录、性能监控、动态数据权限过滤等高级功能。这种方式为MyBatis提供了强大的扩展能力,使其更加灵活和强大。

InnerInterceptor接口中,各个方法的参数提供了执行SQL操作时的上下文信息,允许自定义逻辑根据这些信息进行相应的处理。以下是这些参数的作用说明:

共通参数

  • Executor executor: MyBatis中负责执行SQL命令的组件。通过这个对象,你可以获取到执行SQL所需的所有上下文信息,包括数据库连接等。

  • MappedStatement ms: 包含了执行SQL所需的映射语句信息,如SQL语句、参数映射等。它是MyBatis映射文件中一个<select><insert><update><delete>节点的内存表示。

  • Object parameter: 执行SQL时传入的参数对象。这可以是任意类型的对象,具体类型取决于你在Mapper接口中方法的定义。

查询(query)相关参数

  • RowBounds rowBounds: 用于支持物理分页查询的辅助对象。它包含了查询的偏移量(offset)和限制数量(limit)。

  • ResultHandler resultHandler: 处理查询结果的处理器。如果提供,查询结果将由这个处理器进行处理,而不是直接返回。

更新(update)相关参数

更新操作的方法通常没有特定于查询的RowBoundsResultHandler参数。

SQL准备(prepare)相关参数

  • StatementHandler sh: 负责准备(预编译)、参数设置、执行SQL命令的处理器。通过这个对象,你可以获取或修改即将执行的SQL语句或参数。

  • Connection connection: 当前操作使用的数据库连接。可以用于获取数据库连接的详细信息,或者对连接进行设置。

  • Integer transactionTimeout: 当前操作的事务超时时间。它可以用于设置SQL语句执行的超时时间。

BoundSql boundSql

  • BoundSql boundSql: 包含了最终要执行的SQL语句和对应的参数信息的对象。BoundSql对象通常由MappedStatement和参数对象共同生成,它是执行SQL前的最后一步准备。

Properties properties

  • 在拦截器被创建时,通过setProperties(Properties properties)方法传入的配置属性。这些属性可以在MyBatis配置文件中配置,用于自定义拦截器的行为。

通过这些参数,拦截器可以获取执行SQL所需的全部上下文信息,并在SQL执行前后插入自定义逻辑,如修改SQL语句、调整参数值、处理执行结果等。