mybatis学习::动态代理

分析源码基于mybatis 3.0.1

JDK 动态代理

mybatis采用jdk的动态代理机制来实现自己的动态代理

使用jdk实现动态代理

    1. 代理类实现 InvocationHandler
    1. 工具类Proxy newProxyInstance方法

mybatis 实现小技巧

  • mapper 方法统一由MapperMethod 来实现执行
  • MapperProxy 是代理工具类

MapperMethod
1.代理sql方法
2.方法路由

public Object execute(Object[] args) throws SQLException {
    Object result;
    if (SqlCommandType.INSERT == type) {
      Object param = getParam(args);
      result = sqlSession.insert(commandName, param);
    } else if (SqlCommandType.UPDATE == type) {
      Object param = getParam(args);
      result = sqlSession.update(commandName, param);
    } else if (SqlCommandType.DELETE == type) {
      Object param = getParam(args);
      result = sqlSession.delete(commandName, param);
    } else if (SqlCommandType.SELECT == type) {
      if (returnsList) {
        result = executeForList(args);
      } else {
        Object param = getParam(args);
        result = sqlSession.selectOne(commandName, param);
      }
    } else {
      throw new BindingException("Unkown execution method for: " + commandName);
    }
    return result;
  }

MapperProxy

  1. 实现InvocationHandler
  2. 通过内部泛型封装,封装了使用Proxy工具类。简单方便
//1. 实现InvocationHandler 
public class MapperProxy implements InvocationHandler 

//2. 通过内部泛型方法的方式,封装了使用Proxy工具类。简单方便
public static <T> T newMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {
    ClassLoader classLoader = mapperInterface.getClassLoader();
    Class[] interfaces = new Class[]{mapperInterface};
    MapperProxy proxy = new MapperProxy(sqlSession);
    return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
  }

小结

  1. 分析梳理mybatis动态代理的基本手法
  2. 学习一点牛人的代码小技巧
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容