mybatis的解析和运行原理(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43756756/article/details/91910756

PS:

读者可以直接观看标题,如果明白该技术可以直接跳过.如果该文章并没有你所需要的mybatis原理可以直接跳过去阅读后面的文章,本章节讲解的知识mybatis所需要用到的一些技术,对于长期使用的人来说可以直接跳过.

前言:

本文章不会着重介绍mybatis的配置,映射和动态sql这些,所谈的原理只涉及基本的框架和核心代码,不会面面俱到,文中的都是集中在mybatis框架的设计和核心代码的实现上,无关的细节适当忽略.如果没有学习或者对java没有经验的人,个人建议还是学习过一定java基础的人来进行阅读.

mybatis的层次结构图:

在这里插入图片描述

技术简介:

一.动态代理:

首先我提出一个问题:为什么Mapper只是一个接口,不是一个实现类却可以运行的?
答案就是动态代理.Mapper产生了代理类,这个代理类由Mybatis为我们创建了
代理模式链接地址:https://blog.csdn.net/carson_ho/article/details/54910472 (本文写得很好,可以方便读者很好的理解java中的代理模式这个设计模式)

二.反射技术:

参考反射的一些基础文档:https://blog.csdn.net/ylyang12/article/details/53469957

import com.java.entity.User;

public class Test {
	public static void main(String[] args) throws ClassNotFoundException {
		System.out.println(int.class);
		System.out.println(void.class);
		int[] arrA = new int[10];
		int[] arrB = new int[10];
		/**维数相同和类型相同的数组共享同一个Class对象*/
		System.out.println(arrA.getClass()==arrB.getClass());
		
		/**同一个类的N多对象,共享同一个Class对象*/
		User u1 = new User();
		User u2 = new User();
		System.out.println(u1.getClass()==u2.getClass());
		
		/**获取Class对象的三种方式*/
		//(1)通过对象的getClass()方法获取
		Class c1 = u1.getClass();
		//(2)通过字节码文件获取
		Class c2 = User.class;
		//(3)通过Class类的静态方法获取
		Class c3 = Class.forName("com.java.entity.User");
		System.out.println((c1==c2)+"\t"+(c1==c3));
	}
}

这上面这段代码通过反射技术去获取了Class对象,我们可以依靠该技术去创建我们所需要的对象,反射的最大好处是配置性大大提高,就如同Spring IOC容器一样,我们可以给很多配置设置参数,使java应用可以顺利的运行起来,大大提高了Java的灵活性和可配置性,降低模块之间的耦合.

三.JDK动态代理:

上文中提到的动态代理其实分为两种一种就是JDK的动态代理,一种就是CGLIB框架提供的动态代理,现在我们要分别说一下这两种的不同点.
JDK的动态代理基于接口在我们常常使用mybaits的时候默认的动态代理就是JDK的动态代理,这里我也不详细介绍分享一篇文章:https://www.jianshu.com/p/269afd0a52e6

四.CGLIB动态代理:

因为JDK提供的动态代理必须提供接口才能使用,为了克服这个缺陷,于是产生了CGLIB的开源框架,它也是一种流行的动态代理.
一般情况下我们不会使用到CGLIB的动态代理,通常只有在Mybatis中延迟加载的时候才会用到CGLIB的动态代理.
依然分享CGLIB动态代理的一篇文章:https://blog.csdn.net/yhl_jxy/article/details/80633194

展开阅读全文

没有更多推荐了,返回首页