目标:1看源码;2分析原理;3手写mybatis oop面向对象的编程能力
一,什么是mybatis?
官方文档:https://mybatis.org/mybatis-3/
它是一个一流的持久化框架,支持定制化SQL,存储过程和高级映射;
mybatis避免了几乎所有的JDBC冗余代码及结果映射代码;
mybatis可以用xml或注解的形式,将接口和POJOS对象映射成数据库记录。
注意:任何数据库持久化框架底层都是JDBC
二、how it works,先宏观再围观
1,配置,因为用户操作数据库,需要明确操作哪个数据库的哪个表,所以要做响应的配置
2,SQLsession,和数据库的一次会话;用完就关闭
3,
一次和数据库的交互的所有方法操作都是在SQLsession中完成的;但为啥不是只有一个SQLsession的类完成所有操作呢,因为违背了单一职责原则,SQLsession委托configuration去获取mapper, configuration又从mapper注册器mapperRegistry获取mapper
mapperRegistry就有getmapper,addMapper方法;在调用获取SqlSessionFactory时就调用了mapperRegistry的addMapper方法;
SQLMapper接口为什么能直接调用方法??它是怎样实现的呢?
MapperProxyFactory MapperProxy Proxy 三个类,使用动态代理+
Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
策略模式?责任链模式?使用设计模式是为了增加扩展性。开闭原则。装饰器模式,代码特点:定义的类里又引用了兄弟类
恶补动态代理:
InvocationHandler<---ProxyDemoProxy(代理类)——>ProxyImpl(被代理的实现类)----->IproxyInterFace(被代理的接口)
而mybatis的是
InvocationHandler<---MapperProxy(代理类)——>IproxyInterFace(被代理的接口)
重构的正确方式是:
1,抽出共性的东西,写到抽像类里(模板类)
2,还要定义成规范,规范即接口
3,
三、手写mybatis,采用oop编程过程分析
1,定义类:晕:写需求时不知道如何下手,不知道怎么定义类,有哪些类?
人->mybatis->数据库
人和mybatis交互要定义一个类承接:叫configuration,mybatis和数据库交互是SQLsession,SQLsession又委托Executor执行具体的方法,再加上获取mapper的代理类mapperProxy。所以1.0版本就这4个类
2,光有类还不行,还要有类关联关系即类图
configuration<-SQLsession->Executor 同时mapperProxy要持有->SQLsession以便执行具体的selectOne方法 a->b代表a持有b;
SQLsession持有configuration以便获得mapper,SQLsession还要持有Executor以便委托执行!
体现在代码中就是对象中定义了被持有类的成员引用(如:spring的注入);然后用构造方法初始化值,建立关联;
3,
会用设计模式但🈶不能滥用设计模式?
学习方式是什么?直接决定学习结果