Mybatis的核心就是动态sql以及通过jdk的动态代理注入
完整代码可以查看我的
GitHub
Jdk的动态代理仅仅需要接口就能生成子类
我们需要写一个InvocationHandler,然后重写invoke方法
Mybatis的工作流程和Spring差不多,详情参考这个链接
需要扫描类,然后对加了注解的接口放到容器里
然后通过容器里的接口生成代理类放到容器里
然后遍历调用了Mapper的类,对字段进行注入
与Spring 不同的地方就是方法返回值的处理
我们在InvocationHandler的invoke方法中通过上面的sql注解以及返回值来得到结果并返回
我们先判断方法是否加了Select注解
然后获得上面的sql语句
然后获得datasource(之前就从配置类中得到了)
然后得到resultSet
然后判断方法返回值是否是List
如果是List就获得泛型里面的类型,然后通过写的一个类来获得List数据
我们来看看ListHandler中写了什么
ListHandler中的handle方法遍历了resultset,然后调用了beanhandler的convertToBean方法
convertToBean方法浅显易懂,就是通过反射设置值,然后返回对象