Mybatis * 的实现介绍

作者:CZengze 时间:2023-07-04 04:23:31 

 MyBatis介绍

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。它支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis * 介绍

MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是 * 功能。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。对于 * Mybatis为我们提供了一个Interceptor接口,通过实现该接口就可以定义我们自己的 * 。

MyBatis默认调用四种类型的方法:

1.Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

2.ParameterHandler (getParameterObject, setParameters)

3.ResultSetHandler (handleResultSets, handleOutputParameters)

4.StatementHandler (prepare, parameterize, batch, update, query)

以上4个都是Configuration的方法,这些方法在MyBatis的一个操作(新增,删除,修改,查询)中都会被执行到,执行的先后顺序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。

接口的定义是:

Mybatis * 的实现介绍

这三个方法中,plugin用于处理器的构建,intercept用于处理代理类,setProperties用语 * 属性设置。
Plugin类实现了InvocationHandler的接口,返回了一个JDK自身的动态 * 类,对于plugin的wrap方法:

Mybatis * 的实现介绍

判断当前目标对象是否有实现对应需要拦截的接口,如果没有则返回目标对象本身,如果有则返回一个代理对象。

代理对象的InvocationHandler正是一个Plugin,当目标对象执行接口方法时,如果是通过代理对象执行的,会调用invocationHandler的invoke方法,就是Plugin的invoke方法:

Mybatis * 的实现介绍

如果当前执行的方法是定义好的需要拦截的方法,则把目标对象、要执行的方法以及方法参数封装成一个Invocation对象,再把封装好的Invocation作为参数传递给当前 * 的intercept方法。如果不需要拦截,则直接调用当前的方法。

对于getSignatureMap方法

Mybatis * 的实现介绍

getSignatureMap是首先会拿到 * 这个Intercept注解,遍历拿到type属性,然后根据这个type得到带有method属性和args属性的method,最终返回一个type为key,value为Set<Method>的Map。例对Executor.class的update方法进行过滤,会产生key为Executro,value为Method实例,里面带有MappedStatement和method方法对应的参数。

Mybatis * 的实现介绍

* 的可配置性:

Mybatis * 的实现介绍

来源:http://blog.csdn.net/czengze/article/details/52976457

标签:mybatis, ,
0
投稿

猜你喜欢

  • Java解析XML格式数据的方法详解

    2022-03-25 09:28:25
  • Springboot 使用内置tomcat禁止不安全HTTP的方法

    2022-07-12 10:45:45
  • 采用C#实现软件自动更新的方法

    2021-12-30 19:13:38
  • 浅谈VS中添加头文件时显示无法找到文件的问题

    2022-05-25 08:13:46
  • Android基于TextView属性android:ellipsize实现跑马灯效果的方法

    2022-09-28 15:59:55
  • Java 多线程学习详细总结

    2023-11-18 22:55:24
  • Java实现map转换成json的方法详解

    2022-09-09 12:26:03
  • Android Google AutoService框架使用详解

    2023-07-19 22:48:14
  • android图像绘制(六)获取本地图片或拍照图片等图片资源

    2021-07-26 14:20:51
  • java取两个字符串的最大交集

    2021-07-30 17:23:08
  • Android网络访问之Retrofit使用教程

    2023-08-30 01:02:08
  • android使用viewpager计算偏移量实现选项卡功能

    2023-12-06 12:53:02
  • java多线程编程学习(线程间通信)

    2023-04-02 05:25:34
  • SpringBoot如何通过Feign调用传递Header中参数

    2023-11-24 21:39:29
  • Android使用gradle读取并保存数据到BuildConfg流程详解

    2022-01-07 19:31:43
  • java虚拟机原理:类加载过程详解

    2023-08-09 11:35:37
  • winform 调用摄像头扫码识别二维码的实现步骤

    2022-08-08 21:50:20
  • Netty如何设置为Https访问

    2021-12-06 02:00:40
  • IDEA2020.1个性化设置的实现

    2023-10-17 09:31:34
  • java 使用HttpURLConnection发送数据简单实例

    2023-12-12 01:44:00
  • asp之家 软件编程 m.aspxhome.com