Mybatis3.5.8
2022-01-21 16:28:09 84 举报
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。MyBatis3.5.8 是其一个版本,该版本中包含了许多新特性和改进,例如对动态 SQL 的支持更加完善,以及对缓存机制的优化等。使用 MyBatis3.5.8,可以大大提高开发效率,减少出错率,同时也能够更好地保证系统的稳定性和可维护性。
作者其他创作
大纲/内容
向Configuration的knownMappers中添加MapperProxyFactorykey = 接口全限定名,value = MapperProxyFactory
handler.query执行sql语句并完成结果集的映射
PreparedStatementHandler#queryjdbc原生代码在这里执行
放入二级缓存
实例化MethodSignature对象
statementParser.parseStatementNode()遍历每个增删改查操作
queryFromDatabase从数据库查询数据
buildStatementFromContext为增删改查生成statement对象
handler.parameterize处理sql占位符
getSignatureMap解析插件上的@Signture注解
是
configuration.addMappedStatement添加到configuration的mappedStatements中
typeAliasesElement(root.evalNode(\"typeAliases\"))
BatchExecutor
Resources.getResourceAsStream(mybatis-config.xml)将配置文件加载成InputStream流
new SqlSessionFactoryBuilder().build(inputStream)构建SqlSessionFactory对象
executor.update
返回值为void并且有结果处理器
sqlSession.getMapper获取mapper的代理对象
创建MapperMethodInvoker对象,如果不存在创建并放入缓存中方便下次直接获取
调用插件的intercept方法
flushCacheIfRequired(ms)刷新二级缓存再更新
rowCountResult
方法是或否返回多条数据
executeWithResultHandler
configurationElement(parser.evalNode(\"/mapper\"))
是否select操作
interceptorChain.pluginAll(executor)通过动态代理实现插件功能
否
是否开启二级缓存默认为true
数据是否为空
二级缓存是否为空
检测是否加载过对应的映射配置文件,如果未加载,则创建XMLMapperBuilder对象解析对应的映射文件
分布式环境下,缓存会存在脏读的问题
解析mapper文件的各个标签
executeForCursor
创建XMLMapperBuilder
pluginElement(root.evalNode(\"plugins\"))解析插件,添加到configuration的interceptorChain中
knownMappers.get
parseConfiguration
executeForMap
创建动态代理对象使用InvocationHandler对象就是Plugin对象
STATEMENT SimpleStatementHandler
获取执行影响行数,返回结果
是否为空
根据数据源、隔离级别、是否自动提交创建Transaction对象
handleRowValues查询到的结果会被放到multipleResults集合中
getNextResultSet(stmt)获取下一个结果集
createCacheKey创建CacheKey对象,二级缓存用
MapperProxy包含了SqlSession、对应的接口、接口的方法。作为动态代理对象的InvocationHandler。
SqlSessionFactory包含了Configuration对象,用来创建SqlSession对象
handleResultSet根据ResultMap映射规则,对结果集进行映射
返回缓存中的数据
ReuseExecutor
是否返回游标
每个DAO接口都对应了一个MapperProxyFactory
CachingExecutor#query
MapperMethod包含了SqlCommand(sql语句语句类型)和MethodSignature(mapper方法相关信息)对象
PREPAREDPreparedStatementHandler
handler.prepare实例化Statement对象
configuration.newStatementHandler获取StatementHandler对象(RoutingStatementHandler)
循环处理多个结果
cachedInvoker(method)
executor.query
准备工作:1.解析mybatis-config.xml文件,构建configuration对象
mappedStatement.getKeyGenerator获取主键生成器策略
StatementHandler可以理解成就是原生JDBC的PrepareStatement
mapperProxyFactory.newInstance创建MapperProxy对象
prepareStatement完成Statement的创建和初始化
MapperMethodInvoker包含了MapperMethod对象,用来执行sql的一层包装
CALLABLECallableStatementHandler
handler.update(stmt)
构建SqlSource对象、获取StatementType类型、返回值类型
DefaultSqlSession#selectList
resultSetHandler.handleResultSets处理结果集映射
sqlSessionFactory.openSession()获取SqlSession对象
构建XMLStatementBuilder对象
new MapperMethod
getConnection获取数据库连接对象
cleanUpAfterHandlingResultSet 清空nestedResultObjects集合
Transaction事务对象,包含了Connection和数据源,包含提交和回滚方法
loadXmlResource()
sqlSession.insert | update | delete
执行plugin的invoke方法
propertiesElement(root.evalNode(\"properties\"))解析properties标签,并将解析出来的值追加到Configuration的variables属性中
clearLocalCache()清除一级缓存
configuration.newStatementHandler获取StatementHandler
addMapper(mapperClass)遍历扫描到所有的mapper类
parser.parse()解析config文件
delegate.query查询数据库
CachingExecutor通过装饰器模式实现缓存功能
key = 方法名value = MapperStatement对象
executeForMany
configuration.addMappers(mapperPackage)
mapperRegistry.getMapper
MapperProxyFactory每个DAO都会对应一个MapperProxy对象
RoutingStatementHandler#updatejdbc原生代码在这里执行
Executor定义了已增删改查和操作缓存的一些操作
循环遍历节点
tcm.getObject从二级缓存中取出数据
closeStatement(stmt)关闭Statement对象
这里主要是用了MyBatis对反封装的一些类和方法来进行属性赋值的,ObjectFactory、ReflectorFactory、MetaObject等
sqlSession.selectOne
keyGenerator.processAfter主键赋值操作,默认策略不进行操作
configuration.getMappedStatement获取方法对应的MappedStatement对象
configuration.getMapper
interceptorChain.pluginAll插件处理,决定是否执行插件
mapper.findEmpByEmpno(7369)通过代理对象执行mapper方法的调用
通过TypeHandler来对参数类型转换并设置参数
newInstance(mapperProxy)动态代理生成对象,InvocationHandler是MapperProxy对象
解析sql语句中设置的的属性useCache、flushCache
增删改操作
mapperElement(root.evalNode(\"mappers\"))
includeParser.applyIncludes解析include节点
单一结果值处理
localCache.putObject结果放到一级缓存中
mappedStatement.getResultMaps获取ResultMapsSQL返回的ResultMap
getTransactionFactoryFromEnvironment获取TransactionFactory对象
ResultSetHandler结果集处理器(将结果映射成结果对象)
获取参数类型、设置KeyGenerator
里面包含的就是结果对象属性和类型和对应的sql字段类型以及所有的类型转换器
一级缓存范围为:SqlSession二级缓存范围(默认关闭):SqlSessionFactory
xmlParser.parse()解析*mapper.xml文件
通过动态代理实现,多个插件通过多次动态代理生成对象
new PlainMethodInvoker
根据类型获取执行器类型
builderAssistant.addMappedStatement创建MappedStatement对象,添加到mappedStatements集合中
localCache.getObject(key)根据CacheKey从一级缓存中取
openSessionFromDataSource获取默认的执行器类型
doQuery
Configurationmybatis-config配置文件的所有属性包装类
是否使用二级缓存
invoke
实例化SqlCommand对象
flushCacheIfRequired(ms)根据select标签配置是否刷新缓存
settingsAsProperties(root.evalNode(\"settings\"))解析settings标签,这里可以指定自定义日志实现类,并设置到configuration日志属性中
SimpleExecutor
SqlSession包含了Configuration对象,包含了Transaction、Executor对象、提供了增删改查方法调用入口,实际是调用Executor对应方法
MappedStatement可以理解为为每个增删改查标签创建的一个对象
parser.parse()注解方式解析
返回值为map
doUpdate
getFirstResultSet获取第一个ResultSet对象
构建XMLConfigBuilder对象这里会创建好Configuration对象
根据statementType类型获取对应的Handler
收藏
收藏
0 条评论
下一页