• MyBaties源码解析


           觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个部分也花了几个小时的时间去琢磨 但是感觉值了,我觉得对mybaties的原理更加清晰了 

           学了mybaties也有一段时间了 今天抽空来聊聊mybaties是如何来操作数据库的 它为什么能够方便我们不用再去关注如何创建连接编写预编译语句 它又是如何实现的呢?我们都知道 要操作数据库数据库 必须先要有数据源 执行语句 还要有操作

    1.数据源 是用来连接数据库的 他是如何获取到数据库的连接的呢 我们知道mybatais有一个核心配置文件mybatis-config.xml 而这个文件里面 里面有很多数据库连接信息

    接下里我们来看一下源码是如何获取到数据源的

        org.apache.ibatis.session.SqlSessionFactoryBuilder.build(InputStream)

           org.apache.ibatis.session.SqlSessionFactoryBuilder.build(InputStream, String, Properties)

                org.apache.ibatis.builder.xml.XMLConfigBuilder.XMLConfigBuilder(InputStream, String, Properties)

                     org.apache.ibatis.builder.xml.XMLConfigBuilder.parse()

                          org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XNode)

       最后我们可以通过parseConfiguration(XNode)这个方法就可以得到 连接数据源的信息           

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration
     3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
     4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
     5 
     6 <configuration>
     7     <!-- 配置环境信息,即数据源信息 -->
     8     <environments default="d1">
     9         <environment id="d1">
    10             <!-- 配置事务管理器 -->
    11             <transactionManager type="JDBC" />
    12             <!-- 配置数据源以及数据库连接信息 -->
    13             <dataSource type="POOLED">
    14                 <property name="driver" value="com.mysql.jdbc.Driver" />
    15                 <property name="url"
    16                     value="jdbc:mysql://localhost:3306/fresh?characterEncoding=UTF-8" />
    17                 <property name="username" value="root" />
    18                 <property name="password" value="root" />
    19             </dataSource>
    20         </environment>
    21     </environments>
    22     <!-- 关联隐射文件 -->
    23     <mappers>
    24         <mapper resource="com/newroad/dao/StudentMapper.xml" />
    25     </mappers>
    26 </configuration> 
    27   

         

    2.执行语句 首先来了解以下这四种语句 那么他们又是如何执行的呢

          org.apache.ibatis.session.SqlSession. (Class<T>)

               org.apache.ibatis.session.Configuration.getMapper(Class<T>, SqlSession) 

                         org.apache.ibatis.binding.MapperRegistry.getMapper(Class<T>, SqlSession)

                               org.apache.ibatis.binding.MapperProxyFactory.newInstance(SqlSession)

                                    org.apache.ibatis.binding.MapperProxy.MapperProxy(SqlSession, Class, Map)

                                            java.lang.reflect.Method.invoke(Object, Object...)

                                                  org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(Method)

                                                        org.apache.ibatis.binding.MapperMethod.execute(SqlSession, Object[])

                                                                  org.apache.ibatis.session.SqlSession.selectOne(String, Object)
                                                     
                             
    DDLDMLDQLDCL
    数据定义语言 数据操纵语言 数据查询语言 数据控制语言,定义访问权限、取消访问权限,安全设置
    create、drop、alter insert、update、delete select grant

    3.操作  

            org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()

               org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType, TransactionIsolationLevel, boolean)     
                      org.apache.ibatis.session.Configuration.newExecutor(Transaction, ExecutorType)
                         org.apache.ibatis.executor.SimpleExecutor
                             org.apache.ibatis.executor.BaseExecutor.query(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql)
                                  org.apache.ibatis.mapping.SqlSource.getBoundSql(Object)
                                      org.apache.ibatis.executor.SimpleExecutor.doQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql)
                                              org.apache.ibatis.executor.statement.StatementHandler
                                                 org.apache.ibatis.executor.SimpleExecutor.prepareStatement(StatementHandler, Log)

         

        

  • 相关阅读:
    使用 console.time() 计算js代码执行时间
    javascript 如何创建只能执行一次的事件。
    Javascript 的addEventListener()及attachEvent()对比
    使用jasmine-node 进行NodeJs单元测试 环境搭建
    Karma和Jasmine 自动化单元测试环境搭建
    3487. 【NOIP2013模拟联考11】剑与魔法(dragons) (Standard IO)
    3470. 【NOIP2013模拟联考8】最短路(path) (Standard IO)
    2018洛谷8月月赛第一题_U28036 Nagisa loves Tomoya
    NOIP2017提高组Day2第一题
    3464. 【NOIP2013模拟联考6】秀姿势(sugata) (Standard IO)
  • 原文地址:https://www.cnblogs.com/hengly/p/10992652.html
Copyright © 2020-2023  润新知