MyBatis拦截器的执行顺序引发的MyBatis源码分析

你猜一下哪个先执行?反正不要按常规来。

1 <plugins>
2     <plugin interceptor="com.Interceptor1"></plugin>
3     <plugin interceptor="com.Interceptor2"></plugin>
4 </plugins>

之前看有的博客分析源码,都没提到这一点。之前我只是用一下而已,这个顺序测试一下其实结论也很容易获得,但是我有一种看源码的屎命感。MyBatis还算人性化提供了拦截器,iBatis里面就没有了,不过也可以实现。这里要探究拦截器的源码就不得不提到MyBatis的源码,也就是执行流程了。这要是摊开说就有点大了,为了写好这篇,我决定今天晚上回去不打dota了,贡献真实够大的了。

MyBatis的作用

名义上来说MyBatis是一个半ORM框架,用了一个半字是因为MyBatis并没有完全起到一个ORM框架的作用(比如Hibernate),还有一半工作是需要我们参与进来——编写SQL语句。MyBatis替我们干的活是啥?帮我们把参数和配置化SQL语句映射成数据库中真正执行的SQL,然后把结果帮我们封装好,并返回回来。好处很容已说明,配置灵活,增强开发人员对SQL语句的控制,减少了冗余的对象封装工作。

官方的说法如下:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis的架构

沿着上面说到的,我们接下来可以看一下MyBatis用了什么架构来完成上面的工作。要注意,talk is cheap,实际上的话还要牵涉很多工作(比如Session,事务等)。在网上看了一些描述MyBatis架构的图,看来一晚上不打dota是不可能了呀。

功能上的架构:

源码中的结构:

架构看上去并不复杂,按三层来分的。之前看的很少,如果你是和我一样的小白话可以一起来看下,从头看起吧,接口和配置文件先开始。

最简单的方式开始MyBatis

这里最简单的意思是,我们先抛开Spring,只在一个简单的Maven项目中使用MyBatis,看看它是如何运行的。先起一个简单的Maven项目并加上MyBatis的依赖。

已经做好了但是,额,写起来估计可以新开一篇了。

单独使用MyBatis分析

其实核心代码只有两个,第一个是SessionUtils用于提供Session,第二个是使用Session进行CRUD操作的代码

 1 public class SessionUtils {
 2     private static SqlSessionFactory sessionFactory;
 3     static {
 4         try {
 5             // 使用MyBatis提供的Resources类加载mybatis的配置文件
 6             Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
 7             // 构建sqlSession的工厂
 8             sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12     }
13
14     /**
15      * 获取SqlSession
16      * @return SqlSession
17      */
18     public static SqlSession getSession() {
19         return sessionFactory.openSession();
20     }
21 }
 1 @Test
 2 public void testInsert() {
 3     SqlSession session = null;
 4     try {
 5         session = SessionUtils.getSession();
 6         StudentMapper studentMapper = session.getMapper(StudentMapper.class);
 7         Long affectedLines = studentMapper.insert(build());
 8         System.out.println("affectedLines = " + (affectedLines == null ? 0 : affectedLines));
 9         session.commit();
10     } catch (Exception e) {
11         e.printStackTrace();
12         if(session != null) {
13             session.rollback();
14         }
15     } finally {
16         if(session != null) {
17             session.close();
18         }
19     }
20 }

观察这两段代码引出了两个核心的类:SqlSessionFactorySession

原文地址:https://www.cnblogs.com/tuhooo/p/9188019.html

时间: 2024-10-10 16:38:14

MyBatis拦截器的执行顺序引发的MyBatis源码分析的相关文章

【Spring框架】 ? 项目启动时执行特定处理及ApplicationListener源码分析

1.背景 在一些业务场景中,在容器启动完成后,需要处理一些诸如:kafka业务注册,数据处理,初始化缓存等的操作. 本文重点介绍如何在服务启动中,或启动完成时执行相关处理. 2.针对上述场景,有如下实现方法 A:实现基于javaweb的ServletContextListener接口,重写contextInitialized()接口   B:实现基于javaweb的javax.servlet包下的Filter接口,重写init(FilterConfig filterConfig)接口   C:继

拦截器的执行顺序

1.在请求到来的时候,拦截器会拦截,执行preHandle方法.如果该方法的返回值为true, 就继续往下执行,否则,就结束执行,往下就不在执行任何方法. 2.在preHandle的返回值为true的情况下,就继续执行请求的jsp页面或者controller. 3.执行完请求后,执行postHandle方法. 4.最后执行afterComplete方法.

mybatis的mapper为什么不用写实现类的源码分析

首先看下我们spring和mybatis扫描包的时候是怎样写: 有两种写法: 第一种写法: <mybatis-spring:scan base-package="com.gupaoedu.crud.dao"/>   第二种写法: <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property n

Mybatis 拦截器实现原理

Mybatis 拦截器实现原理 标签(空格分隔): mybatis 拦截器概述 像springmvc一样,mybatis也提供了拦截器实现,只是他们拦截的对象不同. mybatis给Executor.StatementHandler.ResultSetHandler.ParameterHandler提供了拦截器功能, Executor提供了增删改查的接口. StatementHandler负责处理Mybatis与JDBC之间Statement的交互. ResultSetHandler负责处理St

springmvc中自定义拦截器以及拦截器的执行过程

1.拦截器在一次请求中的执行流程 2.拦截器入门案例 2.1springMVC.xml的编写 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m

Mybatis之拦截器--获取执行SQL实现多客户端数据同步

最近的一个项目是将J2EE环境打包安装在客户端(使用 nwjs + NSIS 制作安装包)运行, 所有的业务操作在客户端完成, 数据存储在客户端数据库中. 服务器端数据库汇总各客户端的数据进行分析. 其中客户端ORM使用Mybatis. 通过Mybatis拦截器获取所有在执行的SQL语句, 定期同步至服务器. 本文通过在客户端拦截SQL的操作介绍Mybatis拦截器的使用方法. 1. 项目需求 客户分店较多且比较分散, 部分店内网络不稳定, 客户要求每个分店在无网络的情况下也能正常使用系统, 同

Mybatis拦截器实现分页

本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model> pageByConditions(RowBounds rowBounds, Model record); } 接下来一步一步来实现分页. 一.创建Page对象: public class Page<T> extends PageList<T> { private int page

mybatis拦截器使用

[toc] mybatis拦截器入门 mybatis 拦截器接口Interceptor Interceptor接口,我们通过这个接口可以自定义我们自己的拦截器,从而实现在拦截的时候写上我们自己的一些逻辑.该接口提供了三个方法, 接口介绍: intercept方法: intercept方法是在进行拦截的时候要执行的方法. plugin方法: 该方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理. setProperties方法: mybatis配置文件中co

MyBatis拦截器原理探究

前言: MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClose