在mybatis-configuration.xml 文件中,我们进行了如下的配置:
其中 是对事务的配置,下篇博客我们会详细介绍。
本篇博客我们介绍 对于数据源的配置。
1、解析 environments 标签
在 XMLConfigBuilder.java 的 parseConfiguration(XNode root) 中:
进入 environmentsElement(root.evalNode("environments")) 方法:
1 private void environmentsElement(XNode context) throwsException {2 //如果标签不为null
3 if (context != null) {4 //如果 environment 值为 null
5 if (environment == null) {6 //获取中的default属性值
7 environment = context.getStringAttribute("default");8 }9 //遍历标签中的子标签
10 for(XNode child : context.getChildren()) {11 //获取中的id属性值
12 String id = child.getStringAttribute("id");13 //遍历所有的时候一次判断相应的id是否是default设置的值
14 if(isSpecifiedEnvironment(id)) {15 //获取配置的事务管理器
16 TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));17 //获取配置的数据源信息
18 DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));19 DataSource dataSource =dsFactory.getDataSource();20 Environment.Builder environmentBuilder = newEnvironment.Builder(id)21 .transactionFactory(txFactory)22 .dataSource(dataSource);23 configuration.setEnvironment(environmentBuilder.build());24 }25 }26 }27 }28
29 private booleanisSpecifiedEnvironment(String id) {30 if (environment == null) {31 throw new BuilderException("No environment specified.");32 } else if (id == null) {33 throw new BuilderException("Environment requires an id attribute.");34 } else if(environment.equals(id)) {35 return true;36 }37 return false;38 }
①、第 3 行代码:if (context != null) 也就是说我们可以不在 mybatis-configuration.xml 文件中配置标签,这是为了和spring整合时,在spring容器中进行配置。
②、第 5 行——第 8 行代码:获取中的default属性值,注意第 5 行 首先判断 environment == null 。因为我们可以配置多个环境,也就是连接多个数据库。
不过需要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一,也就是说每个数据库对应一个 SqlSessionFactory 实例。
可以用如下方法进行区别:
1 SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(reader, environment);2 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
③、第 10 行代码:遍历标签中的子标签,可以配置多个标签。
④、第 14 行代码:遍历所有的时候判断相应的id是否是default设置的值,选择相等的 标签进行数据源的配置。
⑤、第 16 行代码:进行事务的配置(下篇博客进行详解)。
⑥、第 18 行代码:进行数据源的配置,下面我们详细讲解。
2、mybatis 的数据源类图
mybatis 对于数据源的所有类都在如下包中:
注意:DataSource 接口不是mybatis包下的,是JDK的 javax.sql 包下的。
3、mybatis 三种数据源类型
前面我们在 mybatis-configuration.xml 文件中配置了数据源的类型:
mybatis 支持三种数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
①、UNPOOLED:(不使用连接池)这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。
②、POOLED:(使用连接池)这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
③、JNDI : 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
ps:关于连接池的概念请看下面详细介绍。
这三种数据源的类型在 mybatis 在上面所讲的类图中正好对应。那么 mybatis 是如何产生数