初始化:获取xml配置信息,解析xml文件构造出Configuration,通过配置信息生成sqlSessionFactory,生成sqlSession。
具体点:XmlConfigerBuilder将xml转换成Document,dtd文件文件转换成XMLMapperEntityResolver,两者作为入参构造出XpathParser,XpathParser根据xpath表达式解析Document生成出sqlSessionFactory(解析过程涉及环境变量,datasource,事务管理器等,放入configuration)
dataSource:poolDataSource,unPoolDataSource,jndi数据源
connection创建过程:配置dataSource,由dataSourceFactory创建,放入环境变量赋值给configration,生成sqlSessionFactory,产生sqlSession,当执行sql时,sqlSession.getDataSource.getConnection创建连接(Class.forName("com.mysql.jdbc.Driver");//注册数据库驱动con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=root");//获取数据库连接),其中unPoolDataSource每次执行sql建一个新链接
dataSource和连接池:空闲连接池和活动连接池,先从空闲获取,获取不到判断活动是否满,没有满新建放入活动,活动满看活动是否有过期,没过期等待,过期的话删除新建。通过代理方式,当调用connection.close方法会放入连接池而不是关闭
链接方式:
DBCP:最大连接数,断开会全部断开,不能自动回收,有对象池,tomcat等
c3p0:最大链接时间,超过自动断开,有自动回收功能,hibernate,spring等
JNDI:api接口,提供了一套根据资源名称名称的方式,通过datasource放到jndi数树上来找到链接
mybatis缓存:
一级缓存:本地缓存,把查询sql+参数作为HashMap(key),缓存结果,update/delete都会删除一级缓存。
事务开启情况下从threadlocal取sqlsession获取一级缓存,非实物情况下每次新建sqlsession
二级缓存:全局缓存,需要开启,缓存的是mapper,对应莫条select设置useCache。可用mybatis提供的,或者自定义,也可集成三方的。是在进行executor操作之前装饰器模式增加缓存处理,二级缓存存在脏读问题(共享缓存,可通过事务缓存机制解决,不可重复读问题仍然存在)
mybatis动态代理:getMapper生成动态代理实现类,根据方法名和参数找到sql,构建sql片段树(boundSql),查询二级缓存,一级缓存,statementHandler执行查询返回结果
插件:通过拦截器动态代理方式实现方法执行前的拦截处理
KeyGenerator:
获取主键数组(keyProperties)
获取 ResultSet 元数据
遍历参数列表,为每个主键属性获取 TypeHandler
从 ResultSet 中获取主键数据,并填充到参数中