Mybatis源码学习

目标: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,

会用设计模式但🈶不能滥用设计模式?

学习方式是什么?直接决定学习结果

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值