mybatis–基础–2.7–xml配置–环境配置(environments)
代码地址
https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/mybatis-learn-master
1、环境配置(environments)
- 可以配置成适应多种环境,有助于将SQL映射应用于多种数据库之中。
- 每个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
- 默认使用的环境ID,这里默认的环境id是development1
1.2.2、environment-id
- 环境id,这里是development1
1.2.3、transactionManager-type
- 事务管理器的类型
1.2.4、dataSource-type
- 配置数据源类型
1.2.5、dataSource中的property元素
数据库相关的信息
1.2.6、注意
environment可以配置多个,如果环境id都相同,那么后面的会覆盖前面的。
2、事务管理器(transactionManager)
2.1、JDBC事务管理器
- 这个配置直接使用了JDBC的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
2.2、MANAGED事务管理器
- 不做事情,让容器做事情。
- 从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
2.2.1、注意
默认情况下它会关闭连接,通过下面配置来阻止关闭.
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
2.3、注意
- 使用Spring+MyBatis,则没有必要配置事务管理器,因为Spring模块会使用自带的管理器来覆盖前面的配置。
- 这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,你可以用TransactionFactory接口实现类的全限定名或类型别名代替它们。
3、自定义事务管理器
- 需要实现下面2个接口
- TransactionFactory
- 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)
- 使用标准的JDBC数据源接口来配置JDBC连接对象的资源。
- 3种内建的数据源类型
- type=UNPOOLED
- type=POOLED
- type=JNDI
4.1、UNPOOLED数据源
- 这个数据源的实现会每次请求时打开和关闭连接,如果不使用连接池,可以使用这个数据源。
4.1.1、配置属性
- driver:这是JDBC驱动的Java类全限定名
- url:JDBC URL地址
- username:数据库用户名
- password:数据库密码。
- defaultTransactionIsolationLevel:默认的连接事务隔离级别
- defaultNetworkTimeout:等待数据库操作完成的默认网络超时时间
- 可选项
- 传递属性给数据库驱动,需在属性名加上driver.前缀即可
- 案例:driver.encoding=UTF8
- 传递属性给数据库驱动,需在属性名加上driver.前缀即可
4.2、POOLED数据源(推荐使用)
- 利用"池"的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间.
4.2.1、配置属性
- poolMaximumActiveConnections:最大活跃连接数,默认值:10
- Maximum:最大限制
- poolMaximumIdleConnections:最大空闲连接数
- Idle:空闲
- poolMaximumCheckoutTime:
- 在被强制返回之前,池中连接被检出(checkedout)时间
- 默认值:20000毫秒
- poolTimeToWait:
- 如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志)
- 默认值:20000毫秒。
- poolMaximumLocalBadConnectionTolerance
- 连接容忍度的底层设置,作用于每一个尝试从缓存池获取连接的线程
- 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过poolMaximumIdleConnections+poolMaximumLocalBadConnectionTolerance
- Tolerance:容忍度
- 默认值:3
- poolPingQuery
- 发送到数据库的侦测查询SQL语句,用来检验连接是否正常工作并准备接受请求
- 默认:NOPINGQUERYSET,这会导致多数数据库驱动出错时返回恰当的错误消息
- SQL语句:要写成速度非常快
- poolPingConnectionsNotUsedFor
- 配置poolPingQuery的频率
- 可以被设置为和数据库连接超时时间一样,来避免不必要的侦测
- 默认值:0(所有连接每一时刻都被侦测)
- poolPingEnabled
- 是否启用侦测查询,针对6,7
- 默认值:false。
4.3、JNDI数据源
- 该数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的数据源引用。
4.3.1、只需要配置两个属性
- initial_context
- 这个属性用来在InitialContext中寻找上下文
- 可选属性,如果忽略,那么直接从InitialContext中寻找data_source属性。
- data_source
- 引用数据源实例位置的上下文路径
- 提供了initial_context配置时会在其返回的上下文中进行查找,没有提供时则直接在InitialContext中查找。
- 可以通过添加前缀"env."直接把属性传递给InitialContext。
- env.encoding=UTF8
- 在InitialContext实例化时往它的构造方法传递值为UTF8的encoding属性
- env.encoding=UTF8
5、自定义数据源
- 实现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>