天天看點

Mybatis解析mapper

衆所周知,接口是不能被執行個體化的,但是日常開發中,我們經常能直接使用dao層對象的方法,這又是為什麼呢。

帶着這些問題,我們看下mybatis内部做了那些操作。

Mapper解析

上文我們描述了mybatis會解析xml配置檔案,将xml各個節點解析到Configuration中,其中的映射器解析就是解析xml中每條sql

Mybatis解析mapper

看下映射器的解析

Mybatis解析mapper
Mybatis解析mapper

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

Mybatis解析mapper

addMapper方法裡我們看到了mapperRegisty,這是映射器注冊機

Mybatis解析mapper
Mybatis解析mapper

MapperProxyFactory映射器代理工廠,用于生産代理類。

Mybatis解析mapper

以上過程都發生在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();
}      
Mybatis解析mapper
Mybatis解析mapper

 最終還是到了mapperRegisty

Mybatis解析mapper

JDK動态代理生産代理類

Mybatis解析mapper

MapperProxy,每一次的方法調用都會到invoke中去

Mybatis解析mapper