zoukankan      html  css  js  c++  java
  • MyBatis源码部分简单地解析

    .

    一、解析xml:
    > org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.lang.String, java.util.Properties)
        > org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
            > org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
                > org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement "environments"
                > org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement "mappers" "package/resource/url/class"
                    > org.apache.ibatis.builder.xml.XMLMapperBuilder.parse
                        > org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement
                            > org.apache.ibatis.builder.xml.XMLMapperBuilder.parameterMapElement "/mapper/parameterMap"
                            > org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements "/mapper/resultMap"
                            > org.apache.ibatis.builder.xml.XMLMapperBuilder.sqlElement(java.util.List<org.apache.ibatis.parsing.XNode>) "/mapper/sql"
                            > org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode>) "select|insert|update|delete" 构建statement
                                > org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode 将mapper里写的sql转化为statement
                                    ↓创建statement sql语句RawSqlSource对象,将#{}转为?,并将#{}里的参数名存在对象中
                                    ↓关于${}:封装为DynamicSqlSource
                                    > org.apache.ibatis.scripting.LanguageDriver.createSqlSource(org.apache.ibatis.session.Configuration, org.apache.ibatis.parsing.XNode, java.lang.Class<?>)
                                        > org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseScriptNode
    
                                    > org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
                            ↑以上是解析xml文件,解析出statement,SqlSource
    
                        ↓以下是将mapper接口和命名空间绑定
                        > org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace
                            >
    
    二、openSession操作:
    > org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
        > org.apache.ibatis.transaction.TransactionFactory.newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)
        > org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
        > org.apache.ibatis.session.defaults.DefaultSqlSession new
    
    三、getMapper:
    > org.apache.ibatis.binding.MapperRegistry.getMapper
        > org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.session.SqlSession)
            ↓jdk动态代理
            > org.apache.ibatis.binding.MapperProxy
            > org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.binding.MapperProxy<T>)
    
    四、查询:
    > org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
        > org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
            > org.apache.ibatis.session.defaults.DefaultSqlSession.wrapCollection
            ↑封装参数
            ↓关于绑定参数名@Param:
            > org.apache.ibatis.session.Configuration.getMappedStatement(java.lang.String)
            > org.apache.ibatis.executor.BaseExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
                ↓通过SqlSource,解析出sql,解析成?,得到参数
                > org.apache.ibatis.mapping.MappedStatement.getBoundSql
                > org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
                    > org.apache.ibatis.executor.SimpleExecutor.doQuery
                        > org.apache.ibatis.executor.SimpleExecutor.prepareStatement 拼装sql的parameter查询条件 ****
                            > org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters 将得到的参数设置到对应的顺序,还包括JdbcType等 ****
                        > org.apache.ibatis.executor.statement.StatementHandler.query 执行查询
                            > java.sql.Statement.execute(java.lang.String) 提交查询
                            > org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets 处理结果集

    .

  • 相关阅读:
    SQL Server 【应用】行列转换Pivot&Unpivot
    SQL Server 【优化】in & exists & not in & not exists
    SQL Server 【提高】 死锁
    SQL Server 【提高】 锁
    SQL Server 【提高】 游标
    .Net 【基础回顾】关键字
    .Net 【基础回顾】值类型与引用类型
    mysql中point类型数据的操作
    CGI环境配置(Ubuntu)
    CGI环境配置(CentOS)
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/12340588.html
Copyright © 2011-2022 走看看