/**
* Copyright (c) 2011-2014, hubin (jobob@qq.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.baomidou.mybatisplus.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import com.baomidou.mybatisplus.test.proxy.mapper.IUserMapper;
import com.baomidou.mybatisplus.test.proxy.mapper.UserMapperImpl;
/**
* <p>
* 类似 org.apache.ibatis.binding.MapperProxy<T>
* </p>
*
* @author hubin
* @Date 2016-07-06
*/
public class MapperProxy<T> implements InvocationHandler {
private final Class<T> methodInterface;
public MapperProxy(Class<T> methodInterface) {
this.methodInterface = methodInterface;
}
/**
* <p>
* MyBatis 实现原理,在该方法中通过 Method 获取接口和方法名,
* 接口的全名相当于MyBatis XML中的namespace,方法名相当于具体一个方法中的id。
* </p>
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);
}
/* 执行 SQL */
return execute(method, args);
}
/**
* <p>
* 这里测试模拟已经注入了实现 SQL
* </p>
* <p>
* 通过动态代理 SqlSession 根据 namespace.id 调用 org.apache.ibatis.binding.MapperMethod 对应方法执行。
* </p>
*/
public Object execute(Method method, Object[] args) {
if (IUserMapper.class.isAssignableFrom(methodInterface)) {
System.out.println("类名: " + methodInterface.getName() + " , 方法名: " + method.getName());
}
return new UserMapperImpl().selectById((Long) args[0]);
}
}