Mybatis解析mapper

众所周知,接口是不能被实例化的,但是日常开发中,我们经常能直接使用dao层对象的方法,这又是为什么呢。

带着这些问题,我们看下mybatis内部做了那些操作。

Mapper解析


上文我们描述了mybatis会解析xml配置文件,将xml各个节点解析到Configuration中,其中的映射器解析就是解析xml中每条sql

看下映射器的解析

再看看bindMapperForNamespace,将namespace即dao接口反射成一个class

addMapper方法里我们看到了mapperRegisty,这是映射器注册机

 

MapperProxyFactory映射器代理工厂,用于生产代理类。

 

以上过程都发生在mapper解析中,mybatis只是将各个接口存到一个mapper,还没有做出代理。接下来我们看下具体调用dao层接口时的操作

 

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.class);
    List<Order> ordertList = OrderMapper.selectProductList();
    for (Order order : ordertList) {
        System.out.printf(order.toString());
    }
} finally {
    sqlSession.close();
}

 

 最终还是到了mapperRegisty

JDK动态代理生产代理类

MapperProxy,每一次的方法调用都会到invoke中去

 

posted @ 2018-04-09 22:54  XuMinzhe  阅读(360)  评论(0编辑  收藏  举报