MyBatis-SQLSessionFactory 配置文件解析

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 属于高级设置.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,488评论 0 4
  • MyBatis 理论篇 [TOC] 什么是MyBatis  MyBatis是支持普通SQL查询,存储过程和高级映射...
    有_味阅读 2,892评论 0 26
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti...
    淡然_匆匆阅读 639评论 0 1
  • 参考w3c 教程 1.概述 MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBat...
    王侦阅读 417评论 0 0
  • MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(propertie...
    WesleyLien阅读 572评论 0 0