假设一个Mapper接口
public interface MyMapper {
List<MyObject> selectAll();
}
使用java动态代理方式创建一个代理类,代码如下:
public class MyMapperProxy<T> implements InvocationHandler {
private Class<T> mapperInterface;
private SqlSession sqlSession;
public MyMapperProxy(Class<T> mapperInterface, SqlSession sqlSession){
this.mapperInterface = mapperInterface;
this.sqlSession = sqlSession;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
// 针对不同的 sql 类型,需要调用 SQLSession 不同的方法
List<T> list = sqlSession.selectList(
mapperInterface.getCanonicalName() + "." + method.getName());
return list;
}
}
测试代码:
// 获取 sqlSession
SqlSession sqlSession = getSqlSession();
// 获取 MyMapper 接口
MyMapperProxy myMapperProxy = new MyMapperProxy(MyMapper.class, sqlSession);
MyMapper myMapper = (MyMapper)Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class[]{MyMapper.class},
myMapperProxy
);
List<MyObject> list = myMapper.selectAll();
总结:从代理类中可以看到,当调用一个接口的方法时,会先通过接口的全限定名称和当前调用的方法名的组合得到一个方法id,这个id的值就是映射 XML 中namespace 和具体方法 id的组合。