欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis-SQLSessionFactory 配置文件解析

程序员文章站 2022-07-15 11:00:17
...

SQLSessionFactory 配置文件解析

在入门文章里,配置了两个 xml 文件,本文来解析 SQLSessionFactory 的环境配置文件。在前文中命名未 conf.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http:// mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"/>
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <mapper resource="userMapper.xml" />
    </mappers>
</configuration>

下面来解析一下 <configuration></configuration> 里面的一些内容。

environments

MyBatis可以配置多种环境,这会帮助你将 SQL 映射应用于多种数据库之中。例如测试和生产环境。或者你可能有多重生产级数据库却共享相同的模式,所以你会想到对不同数据库使用相同的SQL映射。

但是配置多种环境,只能为每个SqlSessionFactory实例选择一个

我们之前在文中加载环境配置文件的方法是:

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

其实该 build 有其他的重载方法。其中有配置环境参数的方法

public SqlSessionFactory build(InputStream inputStream, String environment) {
        return this.build((InputStream)inputStream, environment, (Properties)null);
    }

即传入 environment ,指定的 environment 被绑定到 SqlSessionFactory ;如果不传入 environment ,default 指定的 environment 被绑定到 SqlSessionFactory。

1 transactionManager

在MyBatis中有两种事物管理器类型,一种是JDBC,一种是MANAGED。

  • JDBC—-这个配置直接简单使用了JDBC的提交和回滚设置,它依赖于数据源得到的连接来管理事物范围
  • MANAGED—-这个配置几乎不做什么。它从来不提交或回滚一个连接,而它会让容器来管理事物的整个生命周期(比如Spring或J2EE应用服务器的上下文),默认情况下它会关闭连接,然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false.
<transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
</transactionManager><transactionManager type="MANAGED">

2 dataSource

dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。许多MyBatis的应用程序将会按照上面的示例来配置数据源,然而它并不是必须的,要知道为了方便使用延迟加载,数据源才是必须的。有三种内建的数据源类型(也就是type=”XXX”):

2.1 UNPOOLED

这个数据源的实现是每次被请求时打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接,不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的。UNPOOLED 类型的数据源仅仅用来配置以下六种属性:

  • driver—-这是JDBC驱动的Java类的完全限定名
  • url—-这是数据库的JDBC URL地址
  • username—-登陆数据库的用户名
  • password—-登录数据库的密码
  • defaultTransactionIsolationLevel—-默认的连接事物隔离级别
  • driver.encoding—-传递数据库驱动的属性,前缀以”driver.”开头即可,”driver.encoding”表示的就是传递 encoding 属性
2.2 POOLED

这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求的很流行的方法。除了上述(UNPOOLED)的属性之外,还有些别的属性可以用来配置 POOLED 数据源:

  • poolMaximumActiveConnections—-在任意时间存在的活动(也就是正在使用)连接的数量,默认值为10
  • poolMaximumIdleConnections—-任意时间存在的空闲连接数
  • poolMaximumCheckoutTime—-在被强制返回之前,池中连接被检查的时间,默认值为2000毫秒也就是20秒
  • poolTimeToWait、poolPingQuery、poolPingEnabled、poolPingConnectionsNotUsedFor—-这些都是一些侦测数据库连接的属性
2.3 JNDI

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

  • initial_context—-从初始上下文寻找环境,这个是可选属性,如果被忽略,那么 data_source 属性将会直接以 initialContext 为背景再次寻找
  • data_source—-这是引用数据源实例位置的上下文路径,它会以由 initial_context 查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始上下文为环境来查找

和其它数据源配置相似,它也可以通过名为”env.”的前缀直接向初始上下文发送属性。

3 mappers

MyBatis 的行为已经由上述元素配置好,下面是告诉 MyBatis 到哪里找到 SQL 的映射文件。可以通过使用相对路径的资源引用,或者字符表示,或者url引用的完全限定名。

// 使用相对于类路径的资源
<mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// 使用完全限定路径
<mappers>
    <mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
    <mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
    <mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>

4 settings

下面多讲一个属性,这个属性可以不在config.xml中出现,但是比较重要

settings,是非常重要的参数,它们会改变MyBatis在运行时的行为方式。这面这个表格描述了设置信息,它们的含义和默认值:

参数设置 描述 有效值 默认值
cachedEnabled 用于配置使全局的映射器启用或禁止缓存 true false true
lazyLoadingEnabled 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 true false true
aggressiveLazyLoading 当启用时,有延迟加载属性的对象在被调用时将会完全加载任任意属性,否则每种属性将会按需要加载 true false true
multipleResultSetsEnabled 允许或不允许多种结果集从一个单独的语句中返回(需要合适的驱动) true false true
useColumnLabel 使用列标签代替列名。不同的驱动在这方面表现不同,参考驱动文档或充分测试两种方法来决定所使用的驱动 true false true
useGeneratedKeys 允许JDBC支持生成的键,需要合适的驱动。如果设置为true则这个驱动强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效。 true false true
autoMappingBehavior 指定MyBatis如何自动映射列到字段/属性PARTIAL只会自动映射简单、没有嵌套的结果。FULL会自动映射任意复杂的结果。 NONE PARTIAL FULL PARTIAL
defaultExecutorType 配置默认的执行器。SIMPLE执行器没有什么特别之处,REUSE执行器重用预处理语句,BATCH执行器重用语句和批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 设置超时时间,它决定驱动等待一个数据库响应的时间。 任何正整数 Not Set(null)

完整的设置信息元素的示例配置如下:

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="enhancementEnabled" value="false"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25000"/>
</settings>

主要的配置信息就是上面这些,前三个比较重要,settings 属于高级设置.

转载于:https://www.jianshu.com/p/2a2986f0b60c