MyBatis入门(二)

本文通过跟踪MyBatis的初始化过程,详细解析了如何加载配置文件、创建SqlSessionFactory对象,并进一步打开SqlSession进行数据库操作的具体步骤。

MyBatis入门(二)

本文接上一编,来看看测试示例中中几行代码,究竟都干了些什么。我们采用在eclipse中设置断点的方式查看调用过程。

package org.stenio.blog.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.stenio.blog.model.Blog;

public class App {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// MyBatis配置文件所在地址
		String resource = "mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource); //(1)
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 创建session factory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //(2)
		// 利用session factory 生成 sql session
		SqlSession session = sqlSessionFactory.openSession(); //(3)
		try {
			// 查询一条数据
			Blog blog = session.selectOne("org.stenio.blog.selectBlog", "123"); //(4)
			System.out.println(blog.getBlog_title());
		} finally {
			// 关闭session
			session.close(); //(5)
		}
	}
}

再来回顾一下测试代码测试代码,为了方便查看,我们为关键代码标注了序号。


(1) 处代码,将mybatis-config.xml文件以输入流的形式读入内存,这里不涉及太多的技术,因为不多说。读者有兴趣可以自己去跟。


(2)处首先创建了个SqlSessionFactoryBuilder对象。我们来看下SqlSessionFactoryBuilder类。

SqlSessionFactoryBuilder类中没有任何成员属性,只有各种形式的builder方法,方法参数主要有InputStream、Reader、Properties、Configration。返回值统一为SqlSessionFactory。

示例中我们用到了build(InputStream)这个方法,下面是该方法的代码:

  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }

  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

首先根据InputStream、environment、properties创建了一个XMLConfigBuilder对象。我们的evironment和properties是null。

然后调用了XMLConfigBuilder类的parse()方法。parse()方法的返回值是org.apache.ibatis.session.Configuration类型。 

最后调用了build(Configration)方法。

  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }
方法中,返回了一个根据Configration新建的DefaultSqlSessionFactory对象。

再分别看Confirgration和DefaultSqlSessionFactory两个类。

Confirgration:

这里有无数属性和方法,超级多。我们没精力看下去吧。就把它理解成mybatis中的核心配置类。还是截个图吧。


再看DefaultSqlSessionFactory类:

此类中,持有一个configuration对象,各种openSession()方法、以及私有的获取和关闭transaction的方法。


这样,代码(2)处就执行完毕。


接下来看(3)处,SqlSessionFactory接口的openSession()方法。我们这里SqlSessionFactory的实例是DefaltSqlSessionFactory,所以看下DefaltSqlSessionFactory类中的openSession()方法。

  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }

其中参数ExecutorType为SIMPLE,除此之外还有REUSE, BATCH

  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

上段代码主要的行为有

1.获取Environment对象

2.获取TransactionFactory

3.获取Transaction对象

4.最终获取Executor对象

5.根据configuration和executor,autoCommit生成DefaultSqlSession。










(SCI三维路径规划对比)25年最新五种智能算法优化解决无人机路径巡检三维路径规划对比(灰雁算法真菌算法吕佩尔狐阳光生长研究(Matlab代码实现)内容概要:本文档主要介绍了一项关于无人机三维路径巡检规划的研究,通过对比2025年最新的五种智能优化算法(包括灰雁算法、真菌算法、吕佩尔狐算法、阳光生长算法等),在复杂三维环境中优化无人机巡检路径的技术方案。所有算法均通过Matlab代码实现,并重点围绕路径安全性、效率、能耗和避障能力进行性能对比分析,旨在为无人机在实际巡检任务中的路径规划提供科学依据和技术支持。文档还展示了多个相关科研方向的案例与代码资源,涵盖路径规划、智能优化、无人机控制等多个领域。; 适合人群:具备一定Matlab编程基础,从事无人机路径规划、智能优化算法研究或自动化、控制工程方向的研究生、科研人员及工程技术人员。; 使用场景及目标:① 对比分析新型智能算法在三维复杂环境下无人机路径规划的表现差异;② 为科研项目提供可复现的算法代码与实验基准;③ 支持无人机巡检、灾害监测、电力线路巡查等实际应用场景的路径优化需求; 阅读建议:建议结合文档提供的Matlab代码进行仿真实验,重点关注不同算法在收敛速度、路径长度和避障性能方面的表现差异,同时参考文中列举的其他研究案例拓展思路,提升科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值