mybatis--基础--2.7--xml配置--环境配置(environments)

mybatis–基础–2.7–xml配置–环境配置(environments)


代码地址

https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/mybatis-learn-master

1、环境配置(environments)

  1. 可以配置成适应多种环境,有助于将SQL映射应用于多种数据库之中。
  2. 每个SqlSessionFactory实例只能选择一种环境(数据库),也就是做你想连接N个数据库,那么需要创建N个SqlSessionFactory实例。

1.1、使用环境参数构建SqlSessionFactory

有环境参数
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);



无环境参数,那么将会加载默认环境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);

1.2、environments 定义

<environments default="development1">
    <environment id="development1">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://zhoufei.ali.db.com:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
        </dataSource>
    </environment>
</environments>

1.2.1、environments-default

  1. 默认使用的环境ID,这里默认的环境id是development1

1.2.2、environment-id

  1. 环境id,这里是development1

1.2.3、transactionManager-type

  1. 事务管理器的类型

1.2.4、dataSource-type

  1. 配置数据源类型

1.2.5、dataSource中的property元素

数据库相关的信息

1.2.6、注意

environment可以配置多个,如果环境id都相同,那么后面的会覆盖前面的。

2、事务管理器(transactionManager)

2.1、JDBC事务管理器

  1. 这个配置直接使用了JDBC的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

2.2、MANAGED事务管理器

  1. 不做事情,让容器做事情。
  2. 从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期

2.2.1、注意

默认情况下它会关闭连接,通过下面配置来阻止关闭.

<transactionManager type="MANAGED">
	<property name="closeConnection" value="false"/>
</transactionManager>

2.3、注意

  1. 使用Spring+MyBatis,则没有必要配置事务管理器,因为Spring模块会使用自带的管理器来覆盖前面的配置。
  2. 这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,你可以用TransactionFactory接口实现类的全限定名或类型别名代替它们。

3、自定义事务管理器

  1. 需要实现下面2个接口
    1. TransactionFactory
    2. Transaction
public interface TransactionFactory {
  default void setProperties(Properties props){ // 从 3.5.2 开始,该方法为默认方法
	// 空实现
  }
  Transaction newTransaction(Connection conn);
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}



public interface Transaction {
  Connection getConnection()throws SQLException;
  void commit()throws SQLException;
  void rollback()throws SQLException;
  void close()throws SQLException;
  Integer getTimeout()throws SQLException;
}

3.1、案例

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


package com.cl.mybatis.learn.day09;

import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.jdbc.JdbcTransaction;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * 定义自己的事务管理器,实现获取连接、提交、回滚、关闭数据库连接等操作
 */
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 {
		System.out.println("获取连接");
		return super.getConnection();
	}

	@Override
	public void commit()throws SQLException {
		System.out.println("提交事务");
		super.commit();
	}

	@Override
	public void rollback()throws SQLException {
		System.out.println("回滚事务");
		super.rollback();
	}

	@Override
	public void close()throws SQLException {
		System.out.println("关闭连接");
		super.close();
	}

	@Override
	public Integer getTimeout()throws SQLException {
		System.out.println("获取超时时间");
		return super.getTimeout();
	}
}

package com.cl.mybatis.learn.day09;

import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

/**
 * 定义自己的事务管理器,实现获取连接、提交、回滚、关闭数据库连接等操作
 */
public class MyTransactionFactory extends JdbcTransactionFactory implements TransactionFactory {
	public MyTransactionFactory(){
		super();
	}

	// set 属性注入
	@Override
	public void setProperties(Properties props){
		System.out.println("获取属性:" + props);
	}

	@Override
	public Transaction newTransaction(Connection conn){
		System.out.println("创建事务1:");
		return super.newTransaction(conn);
	}

	@Override
	public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit){
		System.out.println("创建事务2:");
		return super.newTransaction(ds, level, autoCommit);
	}
}

<transactionManager type="com.cl.mybatis.learn.day09.MyTransactionFactory">
	<property name="t1" value="测试"></property>
</transactionManager>


4、数据源(dataSource)

  1. 使用标准的JDBC数据源接口来配置JDBC连接对象的资源。
  2. 3种内建的数据源类型
    1. type=UNPOOLED
    2. type=POOLED
    3. type=JNDI

4.1、UNPOOLED数据源

  1. 这个数据源的实现会每次请求时打开和关闭连接,如果不使用连接池,可以使用这个数据源。

4.1.1、配置属性

  1. driver:这是JDBC驱动的Java类全限定名
  2. url:JDBC URL地址
  3. username:数据库用户名
  4. password:数据库密码。
  5. defaultTransactionIsolationLevel:默认的连接事务隔离级别
  6. defaultNetworkTimeout:等待数据库操作完成的默认网络超时时间
  7. 可选项
    1. 传递属性给数据库驱动,需在属性名加上driver.前缀即可
      1. 案例:driver.encoding=UTF8

4.2、POOLED数据源(推荐使用)

  1. 利用"池"的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间.

4.2.1、配置属性

  1. poolMaximumActiveConnections:最大活跃连接数,默认值:10
    1. Maximum:最大限制
  2. poolMaximumIdleConnections:最大空闲连接数
    1. Idle:空闲
  3. poolMaximumCheckoutTime:
    1. 在被强制返回之前,池中连接被检出(checkedout)时间
    2. 默认值:20000毫秒
  4. poolTimeToWait:
    1. 如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志)
    2. 默认值:20000毫秒。
  5. poolMaximumLocalBadConnectionTolerance
    1. 连接容忍度的底层设置,作用于每一个尝试从缓存池获取连接的线程
    2. 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过poolMaximumIdleConnections+poolMaximumLocalBadConnectionTolerance
    3. Tolerance:容忍度
    4. 默认值:3
  6. poolPingQuery
    1. 发送到数据库的侦测查询SQL语句,用来检验连接是否正常工作并准备接受请求
    2. 默认:NOPINGQUERYSET,这会导致多数数据库驱动出错时返回恰当的错误消息
    3. SQL语句:要写成速度非常快
  7. poolPingConnectionsNotUsedFor
    1. 配置poolPingQuery的频率
    2. 可以被设置为和数据库连接超时时间一样,来避免不必要的侦测
    3. 默认值:0(所有连接每一时刻都被侦测)
  8. poolPingEnabled
    1. 是否启用侦测查询,针对6,7
    2. 默认值:false。

4.3、JNDI数据源

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

4.3.1、只需要配置两个属性

  1. initial_context
    1. 这个属性用来在InitialContext中寻找上下文
    2. 可选属性,如果忽略,那么直接从InitialContext中寻找data_source属性。
  2. data_source
    1. 引用数据源实例位置的上下文路径
    2. 提供了initial_context配置时会在其返回的上下文中进行查找,没有提供时则直接在InitialContext中查找。
  3. 可以通过添加前缀"env."直接把属性传递给InitialContext。
    1. env.encoding=UTF8
      1. 在InitialContext实例化时往它的构造方法传递值为UTF8的encoding属性

5、自定义数据源

  1. 实现org.apache.ibatis.datasource.DataSourceFactory 接口

5.1、案例

在这里插入图片描述
在这里插入图片描述

package com.cl.mybatis.learn.day10;

import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

/**
 * 自定义数据源
 *
 * @author zhoufei
 * @class: MyDataSourceFactory
 * @date 2020/10/17 16:41
 * @Verson 1.0 -2020/10/17 16:41
 * @see
 */

public class MyDataSourceFactory extends UnpooledDataSourceFactory implements DataSourceFactory {

	public MyDataSourceFactory(){
		System.out.println("设置数据源");
		this.dataSource = new UnpooledDataSource();
	}
}
<dataSource type="com.cl.mybatis.learn.day10.MyDataSourceFactory">
	<property name="driver" value="com.mysql.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://zhoufei.ali.db.com:3306/test"/>
	<property name="username" value="root"/>
	<property name="password" value="root"/>
</dataSource>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值