本文为原创文章,转载请注明出处
我们知道,Mybatis的Mapper一般只有一个接口和对应的XML文件,实际上,Mybatis也是通过动态代理来生成的对应接口的实体对象,这里可以仿着原理实现一个简单的,复杂的读者可自行实现。
实现总体上比较简单,首先我们需要准备几个东西:
- 一个Mapper接口:
MyMapper,为了简化,里面只定义两个简单的方法,并返回String- 一个仿Mapper的XML的txt文件:
MyMapper.txt,里面用分号分割了两个字段:方法名和返回值- 一个代理类:
MapperProxy,用来动态生成MyMapper的对象- 一个测试的
Main类和main方法
MyMapper接口定义:
public interface MyMapper {
String getName();
String getAge();
}
MyMapper.txt内容:
getName:wanli
getAge:29
MapperProxy类定义:
public class MapperProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 这里直接解析txt文件,并将txt文件中得到的值作为函数返回值
BufferedReader reader = new BufferedReader(new FileReader("MyMapper.txt"));
String line = null;
Object result = null;
while ((line = reader.readLine()) != null) {
String[] lineStrs = line.split(":");
if (lineStrs[0].trim().equals(method.getName())) {
result = lineStrs[1].trim();
break;
}
}
reader.close();
return result;
}
}
测试类和方法:
public class Main {
public static void main(String[] args) {
// 实际动态代理生成动态的对象
MyMapper mapper = (MyMapper) Proxy.newProxyInstance(MyMapper.class.getClassLoader(), new Class[]{MyMapper.class}, new MapperProxy());
System.out.println(mapper.getName());
System.out.println(mapper.getAge());
}
}
输出结果:
wanli
29
看吧,这里就是使用动态代理,没有定义具体的接口的实现类,但是实现了相应的效果。