mybatis

初始化:获取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 中获取主键数据,并填充到参数中

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。