一、environments配置信息:

environments的作用是用来配置数据库信息,可以配置多个,其有两个可配的子元素,分别是:事务管理器transactionManager和数据源dataSource,先看一下我配置的例子:

 <!-- 环境模式:development开发模式 work工作模式 -->
<environments default="development">
<!--环境变量 -->
<environment id="development">
<!--事务管理器 -->
<transactionManager type="JDBC" />
<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
</environments>

配置项说明:

1⃣️environments-default:该属性指定当前的环境,有development和work两种选择,默认是development开发模式;

2⃣️environment-id:该属性是每个environment定义的环境,也有development和work两种选择,默认是development开发模式;

3⃣️transactionManager-type:该属性是配置事务管理器的类型,mybatis中有JDBC和MANAGED两种,一次只能配置一个,后面会介绍;

4⃣️dataSource-type:该属性用来配置数据源类型,有UNPOOLED、POOLED和JNDI三种选择,后面会介绍;

5⃣️dataSource中的property元素就是数据库相关的信息

注意:environment可以配置多个,但是如果同一种模式,如development模式,配置了两个环境environment,mybatis会用后面的覆盖前面的,如下配置:

 <environments default="development">
<!--环境变量 -->
<environment id="development">
<!--事务管理器 -->
<transactionManager type="MANAGED" />
<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
<!--环境变量 -->
<environment id="development">
<!--事务管理器 -->
<transactionManager type="JDBC" />
<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
</environments>

上面的例子中我配了两个environment,但是它们的环境模式都是开发模式,此时在开发环境中生效的是后面的,即事务管理器为JDBC的配置,所以一般多个最多配置两个环境,且开发模式不同,一个是开发环境,一个是工作环境。下面通过代码获取环境配置信息:

    /**
* 获取环境信息
*/
public static void getEnvironment() {
SqlSession sqlSession = getSqlSession();
Environment env = sqlSession.getConfiguration().getEnvironment();
TransactionFactory tf = env.getTransactionFactory();
System.out.println(tf.getClass().getSimpleName());
}

输出结果:

 JdbcTransactionFactory

可以看到返回的事务管理器类型为JdbcTransactionFactory,而当我在配置中把事务管理器改成MANAGED时,会获取到ManagedTransactionFactory类型。下面分开介绍事务管理器和数据源的配置内容。

二、transactionManager事务管理器配置

在MyBatis中,transactionManager提供了两个实现类,都需要实现接口Transaction,我们可以查看以下它的源代码:

 public interface Transaction {

   Connection getConnection() throws SQLException;

   void commit() throws SQLException;

   void rollback() throws SQLException;

   void close() throws SQLException;

   Integer getTimeout() throws SQLException;

 }

从提供的方法中可以知道,它主要完成提交、回滚、关闭数据库的事务。MyBatis中为Transaction接口提供了两个实现类,分别是JdbcTransaction和ManagedTransaction,并且分别对应着JdbcTransactionFactory和ManagedTransactionFactory两个工厂,这两个工厂实现了TransactionFactory这个接口,当我们在配置文件中通过transactionManager的type属性配置事务管理器类型的时候,mybatis就会自动从对应的工厂获取实例。下面说一下这两者的区别:

1⃣️JDBC使用JdbcTransactionFactory工厂生成的JdbcTransaction对象实现,以JDBC的方式进行数据库的提交、回滚等操作;

2⃣️MANAGED使用ManagedTransactionFactory工厂生成的ManagedTransaction对象实现,它的提交和回滚不需要任何操作,而是把事务交给容器进行处理,默认情况下会关闭连接,如果不希望默认关闭,只要将其中的closeConnection属性设置为false即可。

我在测试的过程中发现的最明显的区别就是,如果我使用JDBC的事务处理方式,当我向数据库中插入一条数据时,在调用完插入接口执行SQL之后,必须 执行sqlSession.commit();进行提交,否则虽然插入成功但是数据库中还是看不到刚才插入的数据;而使用MANAGED方式就不一样了,只需调用接口即可,无需手动提交。

当然,除了使用默认的,我们还可以根据需要自定义一个事务管理器,需要以下三步:

第一步:创建一个事务管理类,继承ManagedTransaction或JdbcTransaction类或实现Transaction接口;

 /**
* 定义自己的事务管理器
*/
public class MyTransaction extends JdbcTransaction implements Transaction { // 重写父类方法
public MyTransaction(Connection connection) {
super(connection);
} public MyTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
super(ds, desiredLevel, desiredAutoCommit);
}
}

第二步:创建一个事务管理工厂类,实现TransactionFactory接口,提供生产事务处理相关接口;

 /**
* 定义自己的事务管理器,实现获取连接、提交、回滚、关闭数据库连接等操作
*/
public class MyTransaction extends JdbcTransaction implements Transaction { public MyTransaction(Connection connection) {
super(connection);
} public MyTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
super(ds, desiredLevel, desiredAutoCommit);
} @Override
public Connection getConnection() throws SQLException {
return super.getConnection();
} @Override
public void commit() throws SQLException {
super.commit();
} @Override
public void rollback() throws SQLException {
super.rollback();
} @Override
public void close() throws SQLException {
super.close();
} @Override
public Integer getTimeout() throws SQLException {
return super.getTimeout();
}
}

第三步:配置自定义事务管理器

 <transactionManager type="com.daily.objectfactory.MyTransactionFactory" />

注意⚠️:这个地方配置的是自定义的工厂类,而不是事务管理类,因为mybatis是根据配置的工厂获取具体实例对象的。

要不是亲手实践,差点就忽略了这点呢!!!

通过以上三步就完成了自定义事务管理器的配置,其实我们还可以在别名设置这个工厂的别名,然后在此处引用,如下:

先在别名中配置工厂所在的包

 <typeAliases>
<!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
<package name="com.daily.objectfactory" />
</typeAliases>

然后按照规则,该包下所有类的别名是将类的第一个字母变成小写,所以我自定义的这个事务管理器工厂MyTransactionFactory的别名就是myTransactionFactory,这样我就可以在事务管理配置中使用该别名了,如下:

 <!--事务管理器 -->
<transactionManager type="myTransactionFactory" />

三、dataSource数据源配置

在mybatis中,数据库是通过PooledDataSourceFactory、UnpooledDataSourceFactory和JndiDataSourceFactory三个工厂类来提供,前两者分别产生PooledDataSource和UnpooledDataSource类对象,第三个则会根据JNDI的信息拿到外部容器实现的数据库连接对象,但是不管怎样,它们最后都会生成一个实现了DataSource接口的数据库连接对象。

它们的配置信息如下:

 <dataSource type="POOLED">
<dataSource type="UNPOOLED">
<dataSource type="JNDI">

这三种数据源的意义如下:

1⃣️UNPOOLED

采用非数据库池的管理方式,每次请求都会新建一个连接,所以性能不是很高,使用这种数据源的时候,我们可以配置以下属性:

driver数据库驱动名

url数据库连接URL

username用户名

password密码

defaultTransactionIsolationLevel默认的事务隔离级别,如果要传递属性给驱动,则属性的前缀为driver

2⃣️POOLED

采用连接池的概念将数据库链接对象Connection组织起来,可以在初始化时创建多个连接,使用时直接从连接池获取,避免了重复创建连接所需的初始化和认证时间,从而提升了效率,所以这种方式比较适合对性能要求高的应用中。除了UNPOOLED中的配置属性之外,还有下面几个针对池子的配置:

poolMaximumActiveConnections:任意时间都会存在的连接数,默认值为10

poolMaxmumIdleConnections:可以空闲存在的连接数

poolMaxmumCheckoutTime:在被强制返回之前,检查出存在空闲连接的等待时间。即如果有20个连接,只有一个空闲,在这个空闲连接被找到之前的等待时间就用这个属性配置。

poolTimeToWait:等待一个数据库连接成功所需的时间,如果超出这个时间则尝试重新连接。

还有其他的一些配置,不详述了。

3⃣️JNDI

数据源JNDI的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这种数据源只需配置两个属性:

initial_context:用来在InitialContext中寻找上下文。可选,如果忽略,data_source属性将会直接从InitialContext中寻找;

data_source:引用数据源实例位置上下文的路径。当提供initial_context配置时,data_source会在其返回的上下文进行查找,否则直接从InitialContext中查找。

除了上述三种数据源之外,mybatis还提供第三方数据源,如DBCP,但是需要我们自定义数据源工厂并进行配置,这一点暂时不做研究。

以上就是environments运行环境的配置。







MyBatis配置文件(七)--environments运行环境的更多相关文章

  1. MyBatis基本运行环境

    MyBatis基本运行环境 1. 创建项目 2.拷贝jar加入到项目中build path jar包 3.创建数据库的表及数据添加 USE [mybatis] CREATE TABLE [dbo].[ ...

  2. mybatis3.0-[topic10-14] -全局配置文件_plugins插件简介/ typeHandlers_类型处理器简介 /enviroments_运行环境 /多数据库支持/mappers_sql映射注册

    mybatis3.0-全局配置文件_   下面为中文官网解释 全局配置文件的标签需要按如下定义的顺序: <!ELEMENT configuration (properties?, setting ...

  3. 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)

    第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...

  4. maven根据不同的运行环境,打包不同的配置文件

    使用maven管理项目中的依赖,非常的方便.同时利用maven内置的各种插件,在命令行模式下完成打包.部署等操作,可方便后期的持续集成使用. 但是每一个maven工程(比如web项目),开发人员在开发 ...

  5. centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课

    centos shell基础知识 alias  变量单引号 双引号   history 错误重定向 2>&1  jobs  环境变量 .bash_history  source配置文件 ...

  6. maven根据不同的运行环境,打包不同的配置文件(转载)

    使用maven管理项目中的依赖,非常的方便.同时利用maven内置的各种插件,在命令行模式下完成打包.部署等操作,可方便后期的持续集成使用. 但是每一个maven工程(比如web项目),开发人员在开发 ...

  7. coding++:maven根据不同的运行环境,打包不同的配置文件

    1.使用maven管理项目中的依赖,非常的方便.同时利用maven内置的各种插件,在命令行模式下完成打包.部署等操作,可方便后期的持续集成使用. 2.但是每一个maven工程(比如web项目),开发人 ...

  8. 详解mybatis配置文件

    在前面两篇文章中,大致与大家分享了基于Java的ORM框架,Mybatis基本架构和Mybatis实现CRUD的基本原理与流程,在本篇文章中,继续与大家分享Mybatis配置文件. 通过研究Mybat ...

  9. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

随机推荐

  1. 如何上传文件到git

    具体有三大步骤: 一.创建新的仓库 二.本地仓库 三.git命令上传(需要下载git) 一.创建新的仓库   二.本地仓库 其实这个本地仓库就是文件的所在地,在哪都可以 三.git命令上传(需要下载g ...

  2. Java代码启动/关闭进程

    ProcessBuilder builder = new ProcessBuilder(命令,参数,参数...); Process process = builder.start(); br = ne ...

  3. namespace 命名空间

    namespace作用:资源隔离 当我们不指定namespace时,默认放在default下 创建namespace kubectl create namespace 资源名称 在生产中,我们建议一个 ...

  4. 【LGP5350】序列

    题目 可能\(\operatorname{fhq\ treap}\)能做,但是珂朵莉树显然更好写 珂朵莉树是个很玄学的东西啊,就是直接使用\(\operatorname{std::set}\)维护每一 ...

  5. shell脚本练习04

    ######################################################################### # File Name: -.sh # Author ...

  6. WPF实现Drag/Drop操作

    原文:WPF实现Drag/Drop操作 有时候我们方便用户操作,总会把一下Copy/Paste 或者 input操作转换为Drag/Drop, WPF 跟之前WinForm 一样提供了一些实现方式方便 ...

  7. linux 文件类型的颜色

    linux文件颜色的含义:蓝色代表目录 绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件 蓝色文件----------目录 ...

  8. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception

    近年提出的四个轻量化模型进行学习和对比,四个模型分别是:SqueezeNet.MobileNet.ShuffleNet.Xception. SqueezeNet https://arxiv.org/p ...

  9. I-country

    I-country 在\(n\times m\)的网格图中,给出每个格子的权值,寻找有k个格子的凸联通块,使包含的权值最大,\(N,M≤15,K≤225\). 解 我们首先要知道凸联通块的定义 从任意 ...

  10. LeetCode第一题—— Two Sum(寻找两数,要求和为target)

    题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...