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)
在执行更新操作之前被调用,例如
insert、update、delete操作。可以用来决定是否继续执行后续的更新操作。
返回
false可以阻止更新操作的执行。
beforeUpdate(Executor executor, MappedStatement ms, Object parameter)
在执行更新操作之前被调用,紧接着
willDoUpdate之后。可以用来修改更新操作的环境或参数。
beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout)
在
StatementHandler准备SQL语句(即调用PreparedStatement的prepare方法)之前被调用。可以用来修改准备SQL语句的环境,例如修改超时时间。
beforeGetBoundSql(StatementHandler sh)
在获取
BoundSql(即包含最终执行SQL语句的对象)之前被调用。可以用来修改或替换
BoundSql对象。
setProperties(Properties properties)
在拦截器初始化时被调用,用于设置拦截器的属性。
可以通过XML配置或编程方式为拦截器传入自定义的属性。
通过实现InnerInterceptor接口,开发者可以在MyBatis的SQL执行流程中的关键点插入自定义逻辑,从而实现如SQL日志记录、性能监控、动态数据权限过滤等高级功能。这种方式为MyBatis提供了强大的扩展能力,使其更加灵活和强大。
在InnerInterceptor接口中,各个方法的参数提供了执行SQL操作时的上下文信息,允许自定义逻辑根据这些信息进行相应的处理。以下是这些参数的作用说明:
共通参数
Executorexecutor: MyBatis中负责执行SQL命令的组件。通过这个对象,你可以获取到执行SQL所需的所有上下文信息,包括数据库连接等。MappedStatementms: 包含了执行SQL所需的映射语句信息,如SQL语句、参数映射等。它是MyBatis映射文件中一个<select>、<insert>、<update>或<delete>节点的内存表示。Objectparameter: 执行SQL时传入的参数对象。这可以是任意类型的对象,具体类型取决于你在Mapper接口中方法的定义。
查询(query)相关参数
RowBoundsrowBounds: 用于支持物理分页查询的辅助对象。它包含了查询的偏移量(offset)和限制数量(limit)。ResultHandlerresultHandler: 处理查询结果的处理器。如果提供,查询结果将由这个处理器进行处理,而不是直接返回。
更新(update)相关参数
更新操作的方法通常没有特定于查询的RowBounds和ResultHandler参数。
SQL准备(prepare)相关参数
StatementHandlersh: 负责准备(预编译)、参数设置、执行SQL命令的处理器。通过这个对象,你可以获取或修改即将执行的SQL语句或参数。Connectionconnection: 当前操作使用的数据库连接。可以用于获取数据库连接的详细信息,或者对连接进行设置。IntegertransactionTimeout: 当前操作的事务超时时间。它可以用于设置SQL语句执行的超时时间。
BoundSql boundSql
BoundSqlboundSql: 包含了最终要执行的SQL语句和对应的参数信息的对象。BoundSql对象通常由MappedStatement和参数对象共同生成,它是执行SQL前的最后一步准备。
Properties properties
在拦截器被创建时,通过
setProperties(Properties properties)方法传入的配置属性。这些属性可以在MyBatis配置文件中配置,用于自定义拦截器的行为。
通过这些参数,拦截器可以获取执行SQL所需的全部上下文信息,并在SQL执行前后插入自定义逻辑,如修改SQL语句、调整参数值、处理执行结果等。