Mybatis中的Sql命令,在枚举类SqlCommandType中定义的。
public enum SqlCommandType {
UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH;
}
下面,我们以Mapper接口中的一个方法作为例子,看看Sql命令的执行完整流程。
public interface StudentMapper {
List<Student> findAllStudents(Map<String, Object> map, RowBounds rowBounds, ResultSetHandler rh);
}
参数RowBounds和ResultSetHandler是可选参数,表示分页对象和自定义结果集处理器,一般不需要。
一个完整的Sql命令,其执行的完整流程图如下:
上面的流程图完整展示了其执行流程。
MapperProxy的功能:
-
因为Mapper接口不能直接实例化,MapperProxy的作用,就是使用JDK动态代理功能,间接实例化Mapper的proxy对象。
-
缓存MapperMethod对象。
private final Map<Method, MapperMethod> methodCache;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (Object.class.equals(method.getDeclaringClass())) {
try {
return method.invoke(this, args);
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
}
//
final MapperMethod mapperMethod = cachedMapperMethod(method);
return mapperMethod.execute(sqlSession, args);
}
// 缓存MapperMethod
private MapperMethod cachedMapperMethod(Method method) {
MapperMethod mapperMethod = methodCache.get(method);
if