【Java高级】教你仿Mybatis自己定义、加载和代理一个Mapper

本文为原创文章,转载请注明出处
查看[Java]系列内容请点击:https://www.jianshu.com/nb/45938443

我们知道,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

看吧,这里就是使用动态代理,没有定义具体的接口的实现类,但是实现了相应的效果。

你可能感兴趣的:(【Java高级】教你仿Mybatis自己定义、加载和代理一个Mapper)