mybaties的执行流程

来源:互联网 发布:微信加粉软件 编辑:程序博客网 时间:2024/06/02 19:28

1.加载配置文件 进行初始化都干了什么?

把配置文件通过xml解析产生configruation配置信息对象

SqlSessionFactoryBuilder通过Configuration对象创建一个DefaultSessionFactory对象并返回

配置文件中的SQL块解析并放到一个MappedStatement里面,后面根据sql的id就能获得对应的MappedStatement

/ 创建XMLConfigBuilder对象用来解析XML配置文件,生成Configuration对象 
     XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);  
  //将XML配置文件内的信息解析成Java对象Configuration对象  
        Configuration config = parser.parse();  
  //SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象并返回; 
        return build(config);  

2.从sqlSessonFactory打开一个sqlSesson 都干了什么?

第一步:打开一个会话,我们看看里面具体做了什么事情。

 

的Java代码  收藏代码
  1. SqlSession session = ssf.openSession();  

 

 

DefaultSqlSessionFactory的openSession()方法内容如下:

 

的Java代码  收藏代码
  1. public  SqlSession openSession(){  
  2.     返回 openSessionFromDataSource(configuration.getDefaultExecutorType(),  null ,  false );  
  3.   }  
 

 

跟进去,我们看一下openSessionFromDataSource方法到底做了啥:

 

的Java代码  收藏代码
  1. private  SqlSession openSessionFromDataSource(ExecutorType execType,TransactionIsolationLevel level,  boolean  autoCommit){  
  2.     连接连接=  null ;  
  3.     尝试 {  
  4.       final  environment environment = configuration.getEnvironment();  
  5.       最终的 DataSource dataSource = getDataSourceFromEnvironment(environment);  
  6.       TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);  
  7.       connection = dataSource.getConnection();  
  8.       if  (level!=  null ){  
  9.         connection.setTransactionIsolation(level.getLevel());  
  10.       }  
  11.       connection = wrapConnection(connection);  
  12.       事务tx = transactionFactory.newTransaction(connection,autoCommit);  
  13.       执行者executor = configuration.newExecutor(tx,execType);  
  14.       返回新的 DefaultSqlSession(配置,executor,autoCommit);   
  15.     }  catch  (Exception e){  
  16.       closeConnection(连接);  
  17.       throw  ExceptionFactory.wrapException(“打开会话错误原因:”  + e,e);  
  18.     }  finally  {  
  19.       ErrorContext.instance()复位();  
  20.     }  
  21.   }  
 

 

这里我们分析一下这里所涉及的步骤:

(1)获取前面我们加载配置文件的环境信息,并且获取环境信息中配置的数据源。

(2)通过数据源获取一个连接,对连接进行包装代理(通过JDK的代理来实现日志功能)。

(3)设置连接的事务信息(是否自动提交,事务级别),从配置环境中获取事务工厂,事务工厂获取一个新的事务。

(4)传入事务对象获取一个新的执行器,并传入执行器,配置信息等获取一个执行会话对象。

 

从上面的代码我们可以得出,一次配置加载只能有且对应一个数据源。对于上述步骤,我们不难理解,我们重点看看新建执行器和DefaultSqlSession。

首先,我们看看newExecutor到底做了什么?

 

的Java代码  收藏代码
  1. public  Executor newExecutor(Transaction transaction,ExecutorType executorType){  
  2.    executorType = executorType ==  null  ?defaultExecutorType:executorType;  
  3.    executorType = executorType ==  null  ?ExecutorType.SIMPLE:executorType;  
  4.    执行执行人  
  5.    if  (ExecutorType.BATCH == executorType){  
  6.      executor =  new  BatchExecutor(this ,transaction);  
  7.    }  else if  (ExecutorType.REUSE == executorType){   
  8.      executor =  new  ReuseExecutor(this ,transaction);  
  9.    }  else  {  
  10.      executor =  new  SimpleExecutor(this ,transaction);  
  11.    }  
  12.    if  (cacheEnabled){  
  13.      executor =  new  CachingExecutor(executor);  
  14.    }  
  15.    executor =(Executor)interceptorChain.pluginAll(executor);  
  16.    退货 执行人  
  17.  }  

 

上面代码的执行步骤如下:

(1)判断执行器类型,如果配置文件中没有配置执行器类型,则采用默认执行类型ExecutorType.SIMPLE。

(2)根据执行器类型返回不同类型的执行器(执行器有三种,分别是BatchExecutor,SimpleExecutor和CachingExecutor,后面我们再详见看看)。

(3)跟执行器绑定拦截器插件(这里也是使用代理来实现)。

 

DefaultSqlSession到底是干什么的呢?

DefaultSqlSession实现了SqlSession的接口,里面有各种各样的SQL执行方法,主要用于SQL操作的对外接口,它会的调用执行器来执行实际的SQL语句。

 

接下来我们看看SQL查询是怎么进行的

3-1).通过sqlSession直接调用封装好的crud的方法操作数据库


根据sql的id去configuration对象中找到对应的sql,返回的是一个 MappedStatement,这里面有所有这个sql的信息



原创粉丝点击