当前位置:首页 > 前端设计 > 正文

mybatis原理和实现机制?MyBatis

mybatis原理和实现机制?MyBatis

大家好,关于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的介绍到此结束,希望对大家有所帮助。

最新文章