Mybatis
发布时间:2019-10-08 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象],大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
第一节中,分析了Mybatis的ORM框架的初始化,这篇来分析SQL执行过程中,对象->SQL是如何转换的
其中包含两种映射思想
①DAO接口->Mapper实例
②执行DAO的方法时,参数->SQL的转换
- DAO接口如何转变成具体可执行sql的Mapper
我们在使用mybatis的时候,Mapper会设置命名空间。
s.example.mapper.MybatistestMapper"
Java对象的DAO接口声明如下:
s.example.mapper;
l.List;
s.example.model.Mybatistest;
MybatistestMapper {
从包结构以及命名分析,Dao接口与Mapper有关系(XML 以及Mapper对象)
在不使用Spring的时候,mybatis通过sqlSession.getMapper(MybatistestMapper.class) 来获得DAO-Mapper代理代理类。
查看SqlSession的默认实现类DefaultSqlSession.getMapper(),通过configuration得到Mapper
T getMapper(ClassE) {
configuration.getMapper(type,);
}
查看Configuration.getMapper
T getMapper(Class{
);
}
继续查看mapperRegistry.getMapper。可以得到以下信息
①创建Mapper的工厂被缓存在knownMappers
如果工厂不存在,则报错。查看代码,工厂是在XMLMapperBuilder解析Mapper时候添加进去的。
根据Mapper.xml中的namespace,缓存Factory。有个好处。对获取的DaoMapper需要在配置文件中配置过。限定了使用范围。也避免后期执行时候出错。
代码可自行查找源码
②当缓存中不存在时,则创建动态代理MapperProxyFactory.newInstance
T getMapper(Class{
MapperProxyFactory mapperProxyFactory = (MapperProxyFactorys.get(typE);
(mapperProxyFactory == {
BindingException("Type " + type + " is not known to the MapperRegistry.");
}
{
);
} E) {
BindingException("Error getTing mapper instance. Cause: " +E);
}
}
mapperProxyFactory.newInstance
@SuppressWarnings("un
checked"
T newInstance(MapperProxy{
(T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),{ mapperInterface },mapperProxy);
}
<span style="color: #0000ff">public<span style="color: #000000"> T newInstance(SqlSession sqlSession) { //代理类中实际执行操作的代码
<span style="color: #0000ff">final MapperProxy mapperProxy = <span style="color: #0000ff">new MapperProxy
<span style="color: #000000">(sqlSession,mapperInterface,methodCachE);
<span style="color: #0000ff">return<span style="color: #000000"> newInstance(mapperProxy);
}
通过以上步骤,我们找到了Dao接口的实现(Mapper 实例接口)
- 当调用一个DAO接口中的方法时,如何找到SQL以及转化为SQL的?.
通过上面的代码,可以得知实际执行sql的是mapperProxy 代理类
看下mapperProxy 的invoke方法
Object invoke(Object proxy,Method method,Object[] args) {
{
(Object.{
method.invoke();
} {
);
}
} {
l.unwrapThrowable(t);
}
MapperMethod mapperMethod =); //通过MapperMethod执行
);
}
查看MapperMethod的execute方法
ject execute(SqlSession sqlSession,Object[] args) {
Object result;
{
{
Object param =);
result =);
updatE: {
Object param =); //实际找到SqlSession的update方法。command.getName()是Mapper的Id
result =update(command.getName(),param));
到此为止,我们只是找到了要执行的SQL。由SqlSession来执行。
@H_540_197@@H_540_197@title="mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]" alt="mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]" src="https://cn.js-code.com/res/2019/02-07/10/c1ddabd097f5dba8eaf7468ce2ad1147.png" >
大佬总结
以上是大佬教程为你收集整理的mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]全部内容,希望文章能够帮你解决mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。