mybatis框架(六)——核心技术与原理

2024-08-26 17:48

本文主要是介绍mybatis框架(六)——核心技术与原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

            衡量我们是否掌握一种知识,标准是我们对它核心技术和原理的掌握程度。

概述

            mybatis核心技术包括:反射和动态代理;mybatis运行原理分为俩部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程。

内容

             一 核心技术

            1 反射技术

                 (1)好处:配置性大大提高,可以给很多配置设置参数,使得java应用程序能够顺利运行起来,大大提高了Java的灵活性和可配置性,降低模块之间的耦合。

                 (2)实例:通过反射技术去创建ReflectService对象,获取服务方法后通过反射调用

		import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectService{/*** 服务方法* @param name -- 姓名*/public void sayHello(String name){System.err.println("hello" + name);}/*** 测试* @param args*/public static void main(String[] args) throw ClassNotFoundException,NoSuchMethodException, InstantiationException, IllegalAccessException,IllegalArgumentException, InvocationTargetException{//通过反射创建ReflectService对象Object service = Class.forName(ReflectService.class.getName()).newInstance();//获取服务方法——sayHelloMethod method = service.getClass().getMethod("sayHello", String.class);//反射调用方法method.invoke(service, "liming");}
}

            2 动态代理

                 (1)代理是什么?

                          在原有的服务上多加一个占位,通过这个占位控制服务的访问。简单理解就是大厨和前台服务员的关系,我们去吃饭,直接和前台服务员沟通要吃什么,不用考虑是哪个大厨做饭,做什么饭,怎么做的。在服务的层面上,这个服务员就是大厨的代理了,也就是代理服务。

                 (2)为什么使用代理模式

                          1)控制如何访问真正的服务对象,提供额外服务。

                          2)通过重写一些类来满足特定的需要。

                 (3)分类

                          1)JDK动态代理:由JDK的java.lang.reflect.*包支持,必须提供接口

                                  步骤:编写服务类和接口,这个是真正的服务提供者,在JDK代理中接口是必须的

                                             编写代理类,提供绑定和代理方法

                                  示例:第一步,编写服务接口                                          

			public interface HelloService{public void sayHello(String name);}
                                            第二步,编写服务接口实现类

			public class HelloServiceImpl implements HelloService{@Overridepublic void sayHello(String name){System.err.println("hello" + name);}}
                                            第三步,编写一个代理类,提供真实对象的绑定和代理方法。代理类的要求是实现InvocationHandler接口的代理方法,当一个对象被绑定后,执行其方法的时候就会进入到代理方法
				public class HelloServiceProxy implements InvocationHandler{//定义真实对象private Object target;/*** 真实对象绑定委托代理对象并返回一个代理类* @param target* @return*/public Object bind(Object target){//获取真实对象this.target = target;//取得代理对象return Proxy.newProxyInstance(target.getClass().getClassLoader,target.getClass().getInterfaces(),this);              //jdk代理需要提供接口}@Override/*** 通过代理对象调用真实对象方法会进入代理方法* @param proxy --代理对象* @param method --被调用方法* @param args --方法的参数*/public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{System.err.println("####我是JDK冬天代理####");Object result = null;//反射方法前调用System.err.println("我准备说hello。");//执行方法,相当于调用HelloServiceImpl类的sayHello方法result = method.invoke(target,args);//反射方法后调用System.err.println("我说过hello了");return result;	}}
                                            第四步:测试客户端代码

				public class client{public static void main(String[] args){HelloServiceProxy HelloHandler = new HelloServiceProxy();HelloServiceProxy proxy = (HelloService)HelloHandler.bind(new HelloServiceImpl());proxy.sayHello("李明");}}

                          2)CGLIB代理:HelloService.java和HelloServiceImpl.java都不需要改变,实现CGLIB的代理类(MethodInterceptor)

                                 代码示例:

		public class HelloServiceCgLib implements MethodInterceptor{private Object target;/***创建代理对象**@param target*@return*/public Object getInstance(Object target){this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());//回调方法enhancer.setCallback(this);//创建代理对象return enhancer.create();}@Override//回调方法public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{System.err.println("#####我是CGLIB的动态代理#####");//反射方法前调用System.err.println("我准备说hello");Object returnObj = proxy.invokeSuper(obj, args);//反射方法后调用System.err.println("我说过hello了");return returnObj;}}

        二 mybatis运行原理

            1 构建SqlSessionFactory过程

                  (1)客户端调用SqlSesisonFactoryBuilder.build,传入对象为SqlMapConfig文件流

                  (2)根据sqlMapCconfig文件流-->  创建XMLConfigBuilder对象

                  (3)直接创建XMLMapperEntityResolver,该对象是SqlMapConfig文件的DTD本地实例    作用:将远程DTD文件转化为本地文件

                  (4)根据sqlMapConfig文件流,确定校验,XMLMapperEntityResolver实例对象 -->创建XPathParser . XPathParser作用:根据Xpath表达式获取基本的DOM节点Node信息的操作

                  (5)根据传入的SqlMapConfig配置文件流--> 创建Document实例

                  (6)返回XMLConfigBuilder实例.实例变量中有一个属性parsed,parserd=false. 代表并没有进行解析

                  (7)调用XMLConfigBuilder实例实例的parse方法

                  (8)在parse方法中,调用该实例属性的XPathParser,让它去处理SqlMapConfig配置文件的的<configuration>节点对应的Node对象,然后依次解析此Node节点的子Node:properties, settings, typeAliases,typeHandlers,objectFactory, objectWrapperFactory, plugins, environments,databaseIdProvider, mappers

                 (9)将XML配置文件内的信息解析成Java对象Configuration

                 (10)将上一步创建的Cofiguration对象作为参数,来创建DefaultSqlSessionFactory对象

                 (11)返回一个DefaultSqlSessionFactory对象

            2 SqlSession运行过程

                  (1)运行图

              

                  (2)说明:SqlSession是通过Executor(执行器)创建StatementHandler来运行的,StatementHandler要经过下面三步:1)prepared预编译SQL , 2)parameterize设置参数, 3)query/update执行SQL

                    其中parameterize调用parameterHandler的方法设置参数,参数根据类型处理器typeHandler去处理。query/update方法是通过resultHandler继续处理结果的封装,如果是update的语句,返回整数;否则通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者。

总结

            mybatis是目前流行的持久层框架,反射技术与动态代理是其核心的内幕技术,同时SqlSessionFactory的创建以及SqlSession运行原理是mybatis核心内容之一,另外一个核心内容就是配置文件与映射。mybatis从构建mapper配置文件再到核心文件配置,再到方法引入配置文件通过SqlSessionFactoryBuilder创建SqlSessionFactory,然后通过SqlSessionFactory打开SqlSession执行数据库的访问操作,完成数据持久化的操作。

这篇关于mybatis框架(六)——核心技术与原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109252

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL