架构组成
sqlsession
sqlsession 是我们直接操作数据的入口,我们通过它来获取代理mapper,进而操作数据库,获取数据。其中包含了configuration、executor的引用,sqlsession 本身不做具体的事情,而是委托configuration、executor去做具体的操作。
configuration
configuration 是一个配置类,用它来做一些框架的配置,包括初始化所有 mapper 、statement。用它来真正的获取mapper、statement。
executor
executor 主要用来数据库的连接、执行 crud 等操作。
proxy
proxy 主要用来生成代理mapper,我们不是通过真实的mapper接口去执行具体的业务,而主要是通过代理mapper去执行。
主要原理:
- sqlssion 持有 configuration、executor 的引用,以及获取 mapper 代理、执行 crud 的外露接口,当然,获取 mapper 代理由configuration 去具体执行,crud 操作由 executor 去具体执行,sqlsession 只是一个主管,分配任务即可。
- configuration 在实例化时,会初始化且保存所有 mapper 代理,以及 statement(sql语句),并且外露一个获取 mapper 代理的接口、一个获取statement的接口给 sqlsession。(mapper代理的保存方式是一个map,key是真实的mapper接口,value是该接口的代理对象;statement 的保存方式是一个map,key是 mapper 接口的方法名,value是该方法的sql语句)
- executor 就是建立数据库连接,外露crud接口给 sqlsession,供其差遣。
- proxy 通过 sqlsession 委托 configuration 获取 statment , 委托 executor 去执行 sql 语句获取结果。(我们知道 proxy 生成的代理对象必会走invoke方法,在invoke方法中,我们可以得到mapper具体执行的哪个方法,根据该方法名获取到statment,委托给configuration、sqlsession)。
核心代码
sqlsession
1 | public class SqlSession { |
configuration
1 | public class ConfiguRation { |
executor
1 | public class Executor { |
proxy
1 | public class BatisProxy implements InvocationHandler { |
1 | public class BatisProxyFactory<T> { |
mapper
1 | public interface UserMapper { |
Test
1 |
|
1 | 4j |
1 | /* 执行结果 */ |