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 都干了什么?
第一步:打开一个会话,我们看看里面具体做了什么事情。
- SqlSession session = ssf.openSession();
DefaultSqlSessionFactory的openSession()方法内容如下:
- public SqlSession openSession(){
- 返回 openSessionFromDataSource(configuration.getDefaultExecutorType(), null , false );
- }
跟进去,我们看一下openSessionFromDataSource方法到底做了啥:
- private SqlSession openSessionFromDataSource(ExecutorType execType,TransactionIsolationLevel level, boolean autoCommit){
- 连接连接= null ;
- 尝试 {
- final environment environment = configuration.getEnvironment();
- 最终的 DataSource dataSource = getDataSourceFromEnvironment(environment);
- TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
- connection = dataSource.getConnection();
- if (level!= null ){
- connection.setTransactionIsolation(level.getLevel());
- }
- connection = wrapConnection(connection);
- 事务tx = transactionFactory.newTransaction(connection,autoCommit);
- 执行者executor = configuration.newExecutor(tx,execType);
- 返回新的 DefaultSqlSession(配置,executor,autoCommit);
- } catch (Exception e){
- closeConnection(连接);
- throw ExceptionFactory.wrapException(“打开会话错误原因:” + e,e);
- } finally {
- ErrorContext.instance()复位();
- }
- }
这里我们分析一下这里所涉及的步骤:
(1)获取前面我们加载配置文件的环境信息,并且获取环境信息中配置的数据源。
(2)通过数据源获取一个连接,对连接进行包装代理(通过JDK的代理来实现日志功能)。
(3)设置连接的事务信息(是否自动提交,事务级别),从配置环境中获取事务工厂,事务工厂获取一个新的事务。
(4)传入事务对象获取一个新的执行器,并传入执行器,配置信息等获取一个执行会话对象。
从上面的代码我们可以得出,一次配置加载只能有且对应一个数据源。对于上述步骤,我们不难理解,我们重点看看新建执行器和DefaultSqlSession。
首先,我们看看newExecutor到底做了什么?
- public Executor newExecutor(Transaction transaction,ExecutorType executorType){
- executorType = executorType == null ?defaultExecutorType:executorType;
- executorType = executorType == null ?ExecutorType.SIMPLE:executorType;
- 执行执行人
- if (ExecutorType.BATCH == executorType){
- executor = new BatchExecutor(this ,transaction);
- } else if (ExecutorType.REUSE == executorType){
- executor = new ReuseExecutor(this ,transaction);
- } else {
- executor = new SimpleExecutor(this ,transaction);
- }
- if (cacheEnabled){
- executor = new CachingExecutor(executor);
- }
- executor =(Executor)interceptorChain.pluginAll(executor);
- 退货 执行人
- }
上面代码的执行步骤如下:
(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的信息
- mybaties的执行流程
- 使用Mybaties的窍门
- Mybaties的动态sql:
- Mybaties的鉴别器
- MyBaties动态的SQL
- myBaties的级联查询
- myBaties的级联查询
- mybaties
- mybaties
- MyBaties
- springmvc和mybaties整合开发流程
- PsLookupProcessByProcessId的执行流程
- struts2的执行流程
- struts2的执行流程
- SSH 的执行流程
- jsp的执行流程
- memcached的执行流程
- libmemcached的执行流程
- C++测试框架Gtest:初探
- C++PrimerV5/Ch09/ex9.40-9.52
- 智能指针
- ubuntu 安装adobe flash
- 我的程序员路(上)
- mybaties的执行流程
- ABAP SORT
- 外网无法访问阿里云服务器解决方案
- Flume之——采集Nginx日志到HDFS
- Unity AssetBundle 加载
- 关于更新用户信息丢失头像的问题
- SSM 三大框架---事务处理
- Retrofit+Rxjava
- iOS 枚举位移