由于我们不考虑DefaultMethodInvoker的情况,所以,这里直接进入到MapperProxy.PlainMethodInvoker.invoke(Object, Method, Object[], SqlSession)。 private final MapperMethod mapperMethod; @Override public Object invoke(Object proxy, Method method, Object[] args, SqlSession sqlSession) throws Throwable { // 直接调...
final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache); return newInstance(mapperProxy); } 6. 找到MapperProxy类,发现其确实实现了JDK动态代理必须实现的接口InvocationHandler,所以我们重点关注invoke()方法,这里看到在invoke方法里先获取MapperMethod类,然后调用mapperMethod...
在MyBatis中,Mapper接口用于定义数据库操作的方法。每个Mapper接口对应一个数据库操作的映射。在Mapper接口中,我们可以定义多个方法,这些方法对应数据库中的多个表。每个方法都包含一个SQL语句和多个参数。 MapperMethod是一个接口,它继承了MethodHandler,用于处理Mapper接口中的方法。在Mapper接口中,我们需要实现MapperMethod...
}privateMapperMethodInvokercachedInvoker(Method method)throwsThrowable {try{// 缓存有就拿,没有需创建并放入缓存returnmethodCache.computeIfAbsent(method, m -> {// 如果是接口中定义的default方法,创建MapperMethodInvoker实现类DefaultMethodInvoker// 这种情况我们不关注if(m.isDefault()) {try{if(privateLookupIn...
上期中我们主要学习了Spring的动态bean注册,其中的主要接口是ImportBeanDefinitionRegistrar,在文中我们还主要学习接口的上游做了哪些事情。今天我们主要通过mybatis的mapper管理来学习一下该接口的下游方法调用过程。据此也尝试搞清楚mybatis的mapper的管理过程。
在 MyBatis 中,MapperMethod 是一个非常重要的内部类。它的主要作用是将 Java 接口中的方法映射为实际的 Sql 操作。MapperMethod 能够解析接口方法的元数据,包括方法名、参数等信息,并根据这些信息生成对应的 Sql 语句。这意味着开发者可以通过接口的方式来进行数据库操作,而无需直接编写繁琐的 Sql 语句。通过 ...
这段代码的意思是根据method创建一个MapperMethod对象,并调用其execute()方法执行XML中映射的Sql语句。MapperMethod对象是缓存的,这里利用了享元模式避免了对象频繁的创建和回收。MapperMethod对象是对Mapper接口方法信息的封装,可以方便的获取方法的签名、Sql语句的类型等信息。
//如果是默认方法,也就是java8中的default方法 } else if (isDefaultMethod(method)) { // 直接执行default方法 return invokeDefaultMethod(proxy, method, args); } } catch (Throwable t) { throw ExceptionUtil.unwrapThrowable(t); } // 从缓存中获取MapperMethod ...
这里面就会把要执行的sql语句,请求参数,方法返回值全部解析封装成MapperMethod对象,然后后面就可以开始准备执行sql语句了 执行sql语句 还是先来看一下执行Sql语句的时序图: 1、我们继续上面的流程进入execute方法: 2、这里面会根据语句类型以及返回值类型来决定如何执行,本人这里返回的是一个集合,故而我们进入executeFor...
break;caseFLUSH:result=sqlSession.flushStatements();break;default:thrownewBindingException("Unknown execution method for: "+command.getName());}if(result==null&&method.getReturnType().isPrimitive()&&!method.returnsVoid()){thrownewBindingException("Mapper method '"+command.getName()+" attempted to ...