众所周知,mybatis实现了接口式编程,简化了我们Dao层的编写,通过定义一个接口和XMl文件即可实现对数据库sql的执行。那它是怎么现实的呢,其实是利用了java的动态代理。
我们先聊聊动态代理模式:
代理模式:对原有功能,进行增强
一、静态代理: 构成--->1.抽象接口 2.目标对象3.代理对象
重新定义一个类继承这接口,并定义此接口的引用,用来引用目标对象,调用原方法
public abstract class AbstractObject {
public abstract void operation();
}
目标对象角色
public class RealObject extends AbstractObject {
@Override
public void operation() {
//一些操作
System.out.println("一些操作");
}
}
代理对象角色
public class ProxyObject extends AbstractObject{
RealObject realObject = new RealObject();
@Override
public void operation() {
//调用目标对象之前可以做相关操作
System.out.println("before");
realObject.operation();
//调用目标对象之后可以做相关操作
System.out.println("after");
}
}
客户端
public class Client {
public static void main(String[] args) {
AbstractObject obj = new ProxyObject();
obj.operation();
}
}
二、动态代理:每个类都存在虚拟的class代理类,只存在于内存中
public class ProxyDemo {
public static void main(String[] args) {
//目标对象
final Dao demoDao = new DemoDao();
//接口Dao的代理类的代理对象
Dao dao = (Dao)Proxy.newProxyInstance(ProxyDemo.class.getClassLoader(),
new Class[]{Dao.class}, //指定代理接口
new InvocationHandler() {//拦截代理对象的所有方法。
@Override //proxy代表代理对象本身 method 调用哪个方法,引用哪个方法对象
//args调用方法的参数封装成对象装进数组
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//System.out.println(method.getName()+" "+Arrays.toString(args));
//1.增强的功能
System.out.println("-----有方法进入,拦截到的方法为-----");
//2.调用目标对象原有的方法
//method.invoke(demoDao, args);
return null;
}
});
//System.out.println(dao); tostring方法被拦截,一直返回null
//System.out.println(dao.getClass());
//dao.add(10, 20);
dao.equals("abc");
}
}
下面说明下mybatis是怎么利用动态代理来现实接口式编程的,首先在mybatis中只定义了接口,如果需要调用接口中的方法必须要有现实类对象,利用动态代理来创建实现类对象:
MapperProxy implements InvocationHandler 覆写类里invoke()方法 --> Proxy.newProxyInstance(类加载器,接口.class数组,MapperProxy对象)-->sql Session.getMapper(接口.class) == Proxy.newProxyInstance()--> IMessage imessage = Proxy.newProxyInstance()
imessage.queryMessageList == MapperProxy.invoke();
根据上面的流程,Proxy.newProxyInstance() 创建了代理对象,可以把它看做接口的实现类对象,MapperProxy 拦截了代理对象的所有方法,就是说代理对象执行什么方法都会进入到invoke()方法中,这就有个实现类对象
下面说说代理对象执行接口中的方法,为什么可以执行xml中配置的sql,这个就涉及接口式编程的规则了,也是为什么要设置这些规则的原因。
加载mybatis配置信息configuratioon,也就加载了Mapper的xml信息-->因为接口全名称.方法名=namespace.id-->所以MapperProxy.invoke()中有这样的代码:sqlSession.selectList(namespace.id,parameter) 根据返回值类型决定用selectOne还是selectList
这样当我们用代理对象调用接口中方法时,就会在Mapper.invoke()方法中,执行sqlSession.selectList方法,也就是imessage.queryMessageList(parameter) = sqlSession.selectList(namespace.id,parameter),也就执行我们xml中的sql,这也是为什么我们namespace必须要是接口的完全限定名,而sql的id必须和接口中方法名一致的原因。
分享到:
相关推荐
本文将深入探讨MyBatis接口编程的原理、优势以及如何实现。 一、MyBatis接口编程的引入 MyBatis 3.x版本开始引入了接口编程模型,这是对传统基于XML配置的SQL映射方式的一种改进。接口编程模型允许我们将SQL语句与...
今天,我们主要介绍Mybatis接口编程的原理。 Mybatis接口编程的原理是指通过定义接口来实现Mybatis的持久层操作,而不是通过xml配置文件。这种方式可以解决掉namespace、传入参数、返回值、与Sql关联等四处风险。 ...
这个压缩包文件“mybatis接口实现原理共2页.pdf.zip”很可能包含了一份简短的文档,讲解了MyBatis接口的实现原理。尽管无法直接提供压缩包内的详细内容,但我们可以基于MyBatis的基本概念和接口实现原理来展开讨论。...
**Spring整合Mybatis原理分析** 在Java Web开发中,Spring框架以其强大的依赖注入和面向切面编程能力,成为了事实上的核心框架。Mybatis则是一个轻量级的持久层框架,它简化了数据库操作,提供了直观的SQL映射。将...
在Spring框架中,MyBatis作为持久层框架与Spring结合使用时,事务管理是一个至关重要的环节。...然而,了解和掌握编码式事务有助于理解Spring事务管理的底层原理,对于解决特定场景的问题或优化事务管理策略具有价值。
为了适应面向接口编程的趋势,MyBatis提供了第二种交互方式,即使用Mapper接口。在MyBatis配置文件中,每一个节点对应一个Mapper接口,这个接口声明的方法名称和参数类型与配置文件中|update|delete|insert>节点项相...
《深入浅出MyBatis技术原理与实战》这本书旨在为Java开发者提供MyBatis框架的全面理解...通过学习,你不仅可以掌握MyBatis的基本用法,还能提升对数据库操作和Java编程的理解,为你的软件开发生涯增添一份强大的工具。
4. **事务管理**:MyBatis支持编程式和声明式两种事务管理方式。编程式事务需要手动开启和提交,而声明式事务通常结合Spring等框架自动管理。 5. **插件机制**:MyBatis提供了插件机制,可以通过拦截器实现对...
《深入浅出Mybatis技术原理与实战》这本书旨在帮助读者全面理解MyBatis的内部工作机制,并通过实例演练提升实际开发技能。 首先,我们要了解MyBatis的核心概念。MyBatis是一个基于Java的持久层框架,它简化了数据库...
《深入浅出MyBatis技术原理与实战》是一本针对Java开发者深度解析MyBatis框架的专业书籍。MyBatis是一个优秀的持久层...通过阅读这本书,读者不仅可以学习到MyBatis的使用,还能进一步提升自己的编程和架构设计能力。
4.《尚硅谷_MyBatis_接口式编程.avi》深入探讨了Mybatis的接口编程模式,讲解如何通过接口定义数据库操作,并与XML配置文件结合,实现动态SQL。 6.《尚硅谷_MyBatis_全局配置文件_引入dtd约束.avi》讲解了Mybatis的...
通过阅读源码,我们可以了解MyBatis的内部工作原理,比如动态SQL的生成机制、SqlSession的管理、Mapper接口的实现方式等。此外,对于想要对MyBatis进行扩展或者调试的开发者,源码包更是必不可少。 其次,`mybatis-...
1. SQL映射:MyBatis的XML配置文件或注解方式允许开发者自由编写SQL语句,提供了灵活性和控制力,避免了简单的模板式编程。 2. 动态SQL:MyBatis的动态SQL功能使得在XML映射文件或注解中可以条件化地构建SQL语句,...
4. **Mapper接口**:MyBatis支持面向接口的编程,可以创建一个接口,然后在XML映射文件中定义这个接口的方法与SQL的对应关系。这样,调用接口方法就能执行相应的SQL操作。 5. **事务管理**:MyBatis支持手动和自动...
在进行面试的时候,开发者需要掌握MyBatis的基本使用方法和原理,例如如何配置和使用SqlSessionFactory,如何编写映射器,以及如何理解和使用MyBatis的高级特性(如延迟加载、缓存机制等)。此外,了解MyBatis和其它...
《深入浅出 MyBatis 技术原理与实战》是一本深入解析 MyBatis 框架的专业书籍,它的源码提供了丰富的实例和详细讲解,帮助读者深入理解 MyBatis 的核心概念、工作原理以及实际应用。在学习过程中,通过研究这本书的...
9. **事务管理**:MyBatis支持编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式提交或回滚事务,而声明式事务管理则可以通过Spring等容器来管理事务。 在"Mybatis学习的demo工程"中,你将有机会...
着手“手撕Mybatis源码,自己动手实现Mybatis”是一项深入理解其内部机制的挑战,也是提升自身编程技能的绝佳途径。下面我们将探讨Mybatis的核心组件和工作原理,以及如何基于这些知识构建一个类似的框架。 1. **...
MyBatis支持编程式和声明式两种事务管理方式。编程式事务管理需要手动开启和提交事务,而声明式事务管理则可以借助Spring等框架自动处理。 10. **日志配置** MyBatis内置了日志模块,可以方便地查看执行的SQL语句...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 在Java开发中,MyBatis作为一款轻量级的数据访问框架,它的主要功能包括...