mybatis原理和实现机制?MyBatis
- 前端设计
- 2023-08-13
- 100
大家好,关于mybatis原理和实现机制很多朋友都还不太明白,今天小编就来为大家分享关于MyBatis的知识,希望对各位有所帮助!了解Mybatis的工作原理吗MyBa...
大家好,关于mybatis原理和实现机制很多朋友都还不太明白,今天小编就来为大家分享关于MyBatis的知识,希望对各位有所帮助!
了解Mybatis的工作原理吗
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
jpa和mybatis如何选择
MyBatis详解与配置MyBatis+Spring+MySqlMyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Map接口和POJO到数据库记录。相对Hibernate和ApacheOJB等“一站式”ORM解决方案而言,Mybatis是一种“半自动化”的ORM实现。需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。MyBatis简介MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Map接口和POJO到数据库记录。相对Hibernate和ApacheOJB等“一站式”ORM解决方案而言,Mybatis是一种“半自动化”的ORM实现。需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。-------------如果我回答对你有帮助,请关注我一下。或有其他问题也可以关注我,给我发私信
映射器原理
当接口方法执行时,首先通过反射拿到当前接口的全路径当做namespace,然后把执行的方法名当成id,拼接成namespace.id,最后在xml映射文件中寻找对应的sql。
在匹配上某个sql之后,底层实际上还是利用SqlSession的相关方法来进行操作,只不过这个过程对于用户来说屏蔽了。
另外,mybatis还会自动的根据Mapper接口方法的返回值类型,选择调用SqlSession的不同方法
mybatis原理,接口怎么变成类的
用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用?
那是因为MyBatis使用Java动态代理实现的接口。
这里仅仅举个简单例子来说明原理,不是完全针对MyBatis的,这种思想我们也可以应用在其他地方。
定义一个接口
publicinterfaceMethodInterface{
StringhelloWorld();
}123
实现动态代理接口
publicclassMethodProxy<T>implementsInvocationHandler{
privateClass<T>methodInterface;
publicMethodProxy(Class<T>methodInterface){
this.methodInterface
=methodInterface;}
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
System.out.println("=========================");
System.out.println("方法名:"+method.getName());
//针对不同的方法进行不同的操作
returnnull;
}
}123456789101112131415
这里针对invoke方法简单说说MyBatis的实现原理,在该方法中,我们通过Method能够获取接口和方法名,接口的全名相当于MyBatisXML中的namespace,方法名相当于具体一个方法中的id。也就是说通过动态代理后,可以通过SqlSession来通过
namespace.id
方式来调用相应的方法。使用接口更方便,但是是一种间接的方式。动态代理工厂类
publicclassMethodProxyFactory{
publicstatic<T>TnewInstance(Class<T>methodInterface){
finalMethodProxy<T>methodProxy=newMethodProxy<T>(methodInterface);
return(T)Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
newClass[]{methodInterface},
methodProxy);
}
}123456789
通过该工厂类可以生成任意接口的动态代理类。
测试
MethodInterfacemethod=MethodProxyFactory.newInstance(MethodInterface.class);
method.helloWorld();12
可以看到MethodInterface没有实现类也可以执行。
总结
一般谈到动态代理我们通常的用法都是处理事务、日志或者记录方法执行效率等方面的应用。都是对实现类方法的前置或者后置的特殊处理。
faas连数据库的原理
mybatisdao层只有接口,但是没有实现类,却能完成对数据库的CRUD,主要是因为mybatis框架对mapper.xml文件中的sql进行了动态代理,通过动态代理的方式,在运行时生成接口的实现类,完成对数据库的操作
关于mybatis原理和实现机制,MyBatis的介绍到此结束,希望对大家有所帮助。
本文链接:http://www.xinin56.com/qianduan/9623.html