美文网首页
【Java高级】教你仿Mybatis自己定义、加载和代理一个Ma

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

作者: 大栗几 | 来源:发表于2020-06-22 23:14 被阅读0次

    本文为原创文章,转载请注明出处
    查看[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自己定义、加载和代理一个Ma

          本文链接:https://www.haomeiwen.com/subject/rydqfktx.html