mybatis拦截为啥进去两次
时间: 2023-11-07 11:33:45 浏览: 28
Mybatis拦截器在执行SQL语句时,可能会被多次调用,这通常是因为Mybatis的工作方式和拦截器的设计有关。具体来说,Mybatis在执行SQL时,会涉及到多个阶段,每个阶段都可能会调用拦截器的方法,因此拦截器可能会被多次调用。
举个例子,当Mybatis执行查询操作时,会依次执行如下阶段:
1. 创建Statement对象
2. 设置Statement参数
3. 执行Statement对象
4. 处理查询结果
在这些阶段中,Mybatis会分别调用拦截器的一些方法,例如创建Statement对象时会调用拦截器的`createStatement`方法,执行Statement对象时会调用拦截器的`query`方法等等。因此,如果你发现拦截器被调用了多次,那么可能是因为Mybatis执行了多个阶段,每个阶段都会调用拦截器的方法。
如果你想避免拦截器被多次调用,可以在拦截器的方法中添加一些逻辑,例如使用一个标记变量来判断是否已经执行过该方法,如果已经执行过则直接返回结果而不再执行。
相关问题
MYBATIs拦截器
MyBatis拦截器是MyBatis提供的一种插件机制,可以在MyBatis执行SQL语句的过程中,对SQL语句进行拦截和修改。通过拦截器,我们可以在执行SQL语句前后进行一些自定义的操作,比如打印SQL语句、分页、加解密等。
MyBatis拦截器主要由四个接口组成:
1. Interceptor:拦截器接口,所有自定义拦截器都需要实现该接口。
2. Invocation:拦截器链中的调用对象,可以通过它来调用下一个拦截器。
3. Plugin:插件接口,用于包装目标对象,返回一个代理对象。
4. InterceptorChain:拦截器链,用于存储所有的拦截器。
在使用MyBatis拦截器时,我们需要实现Interceptor接口,并在配置文件中配置拦截器。配置文件中需要指定要拦截的目标对象和要使用的拦截器。
mybatis拦截器
Mybatis拦截器的设计初衷是为了允许用户在某些时候实现自己的逻辑,而不必修改Mybatis固有的逻辑。通过拦截器,我们可以拦截某些方法的调用,并在这些方法执行前后加入自定义的逻辑,或者完全替代被拦截的方法的执行。因此,Mybatis拦截器的使用范围非常广泛。
然而,需要注意的是,Mybatis拦截器并不能拦截每个对象中的方法。它只能拦截Executor、ParameterHandler、StatementHandler和ResultSetHandler这四个对象中的方法。
要注册一个拦截器,我们需要在@Configuration注解的类中使用@Bean注解来注册我们自定义的拦截器类。举个例子,如果我们需要注册一个名为MybatisInterceptor的自定义拦截器,我们可以在Mybatis的配置类中添加如下代码:
@Configuration
public class MybatisConfiguration {
@Bean
public MybatisInterceptor mybatisInterceptor() {
MybatisInterceptor interceptor = new MybatisInterceptor();
Properties properties = new Properties();
// 可以使用properties.setProperty方法为拦截器设置一些自定义参数
interceptor.setProperties(properties);
return interceptor;
}
}
通过这样的配置,我们成功注册了一个名为MybatisInterceptor的自定义拦截器。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [Mybatis拦截器](https://blog.csdn.net/wuyuxing24/article/details/89343951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]