分析源码基于mybatis 3.0.1
JDK 动态代理
mybatis采用jdk的动态代理机制来实现自己的动态代理
使用jdk实现动态代理
- 代理类实现 InvocationHandler
- 工具类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
- 实现InvocationHandler
- 通过内部泛型封装,封装了使用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);
}
小结
- 分析梳理mybatis动态代理的基本手法
- 学习一点牛人的代码小技巧