【MyBatis学习02】全局配置文件

本文博客地址:http://blog.csdn.net/soonfly/article/details/63352180 (转载请注明出处)

在入门实例中,最先接触的是Mybatis全局配置文件。该配置文件的顶级标签是:configuration。在它之下,有以下子标签:
这里写图片描述
普通开发过程中(如入门实例)我们用四个标签就能完成配置工作。它们分别是:
properties、 typeAliases、environments、mappers
接下来按照使用度来分别介绍这些标签,重点是这四个标签。

一、 properties标签

resource属性可以指定加载.properties的路径。
在properties标签下配置property的name和value,则可以替换.properties文件中相应属性值

<!-- 引入外部db连接配置文件 -->
<properties resource="db.properties"></properties>

也可以在标签内部设置属性

<!-- 也可以用property设置替换属性 -->
    <properties>
        <property name="url" value="jdbc:mysql://localhost:3306/tangwenmingdb"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    </properties>

二、typeAliases设置类型的别名

typeAliases起到简写类型名称的作用。通常有两种配置方式。
方式1:针对单个别名的定义。type:类型的路径; alias:别名

<typeAliases>
    <typeAlias type="twm.mybatisdemo.pojo.User" alias="User"/>
</typeAliases>

这样书写程序时,只要写User,而不需要写冗长的一串带包路径的twm.mybatisdemo.pojo.User
如在mapper配置文件中,用到<update id="update" parameterType="twm.mybatisdemo.pojo.User">就可以简写为<update id="update" parameterType="User">

方式2:自动扫描指定包。并将JAVA类的类名作为类的类别名

<typeAliases>
    <package name="twm.mybatisdemo.pojo" />
</typeAliases>

这样在twm.mybatisdemo.pojo下的所有类,均可以直接使用类名,而不需要写全命名空间。建议用这种方式,可以不用一个一个去指定类及别名的对应关系,那样太麻烦了。

mybatis有默认支持的内置类型别名。并且是大小写不敏感的
如在mapper配置xml文件中,用到javaType="java.lang.String" 就可以简写为javaType="string"

所有别名简写如下表:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashmap
listList
arraylistArraylist
collectionCollection
iteratorIterator

三、environments环境配置

Mybatis可以配置多种环境,如:开发、测试和生产环境需要不同的配置,或者生产环境上不同的库。
虽然可配置多个环境,但每个 SqlSessionFactory 实例只能指定一种环境。
如上篇《【MyBatis学习01】一个简单入门实例》SqlSessionAssist工具类的factory创建中,可指定加载环境,如果不指定,就采用默认default设置

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);  
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);

配置环境:

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
            </transactionManager>

            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}" />
                <property name="url" value="${url}" />
                <property name="username" value="${user}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
        <environment id="product">
            <transactionManager type="JDBC">
                ......
            </transactionManager>
            <dataSource type="POOLED">
                ......
            </dataSource>
        </environment>
    </environments>

可以有多个environment。
每个 environment 元素有几部分组成:
1、transactionManager 事务管理器的配置(比如:type=”JDBC”)
2、dataSource 数据源的配置(比如:type=”POOLED”)。

1、事务管理器(transactionManager)
mybatis提供了两种事务管理器,分别是:JDBC , MANAGED
JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
MANAGED :这个配置从来都不提交和回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务的上下文)。默认情况下他会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。

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

如果采用Spring + MyBatis,可以不用配置事务管理器,因为spring有自己的管理器,并且会覆盖这里的设置。

2、数据源(dataSource)
dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源。
mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI

POOLED:表示支持JDBC数据源连接池。这样可避免每次请求都要创建新的连接。
可以设置的属性除了UNPOOLED的那5个,另外还有以下属性:
poolMaximumActiveConnections:任意时间的最大活动(正在使用)连接数量,默认值:10
poolMaximumIdleConnections :任意时间的最大空闲(没有使用)连接数。
poolMaximumCheckoutTime:再被强制返回之前,池中连接被checkout时间,默认值2W毫秒 即20s
poolTimeToWait:获取连接超时时间。默认值:2W毫秒即 20 s。如果超时,它会给连接池打印状态日志并重新尝试获取

UNPOOLED:表示不支持数据源连接池。这样每次请求都会进行打开和关闭数据库连接操作,性能上会有些损耗。但对一些没有性能要求的程序来说使用起来较方便,配置少。
UNPOOLED 类型的数据源仅仅用来配置以下 5 种属性:
driver – 这是 JDBC 驱动的 Java 类的完全限定名(如果你的驱动包含,它也不是 数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

JNDI:表示支持外部数据源连接池。如mybatis与tomcat整合配置jndi
initial_context – 这 个 属 性 用 来 从 初 始 上 下 文 中 寻 找 环 境 ( 也 就 是 initialContext.lookup(initial——context) 。这是个可选属性,如果被忽略,那么 data_source 属性将会直接以 initialContext 为背景再次寻找。 data_source – 这是引用数据源实例位置的上下文的路径。它会以由 initial_context 查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始 上下文为环境来查找


四、mappers映射配置

这里主要是告诉MyBatis 去哪里寻找mapper映射器配置文件(UserMapper.xml)和mapper映射器接口(UserMapper.java)
如:

<!-- 第一种方式: 一个个指定接口文件及配置文件位置-->
<mappers>
    <mapper resource="twm/mybatisdemo/mapper/User.xml" />
    <mapper class="twm.mybatisdemo.mapper.UserMapper"/>
    <mapper url="file:///E:/twm/mybatisdemo/User.xml"/> 
</mappers>

如果XML和接口文件很多的话,这样去指定就太麻烦。好在还有第二种方式,指定目录加载:

<!-- 第二种方式: 指定包加载。可指定多个包 -->
 <mappers>
    <package name="twm/mybatisdemo/mapper" />
</mappers> 

五、settings设置

设置MyBatis运行过程中的全局参数

<settings>
        <!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true -->
        <setting name="cacheEnabled" value="true" />
        <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 是否允许单一语句返回多结果集(需要兼容驱动)。 默认值true -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 
            Derby)。 默认值false -->
        <setting name="useGeneratedKeys" value="false" />
        <!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 
            FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 -->
        <!-- 默认值PARTIAL -->
        <setting name="autoMappingBehavior" value="PARTIAL" />

        <setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
        <!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 
            执行器将重用语句并执行批量更新。默认SIMPLE -->
        <setting name="defaultExecutorType" value="SIMPLE" />
        <!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 -->
        <setting name="defaultStatementTimeout" value="25" />

        <setting name="defaultFetchSize" value="100" />
        <!-- 允许在嵌套语句中使用分页(RowBounds)默认值False -->
        <setting name="safeRowBoundsEnabled" value="false" />
        <!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 
            的类似映射。 默认false -->
        <setting name="mapUnderscoreToCamelCase" value="false" />
        <!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 
            默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 
            的不同调用将不会共享数据。 -->
        <setting name="localCacheScope" value="SESSION" />
        <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 
            NULL、VARCHAR 或 OTHER。 -->
        <setting name="jdbcTypeForNull" value="OTHER" />
        <!-- 指定哪个对象的方法触发一次延迟加载。 -->
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>

六、typeHandlers

MyBatis从结果集中取出一个值时,会用类型处理器将获取的值(jdbcType)以合适的方式转换成 Java 类型(javaType)。
Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
也可以通过实现TypeHandler 接口,自定义类型转换器。

详细使用参见《【MyBatis学习16】自定义类型处理器typeHandlers介绍

七、配置ObjectFactory对象工厂

MyBatis从结果集中取回数据后,确定要转换的 javaType后,会用到ObjectFactory创建该对象的实例。
默认的ObjectFactory 与使用目标类的构造函数创建一个实例是一样的。
在有些情况下,需要我们通过继承org.apache.ibatis.reflection.factory.DefaultObjectFactory创建自己的工厂类。
稍后开篇详说

八、plugins插件

MyBatis支持对Executor、StatementHandler、PameterHandler和ResultSetHandler进行拦截,也就是说会对这4种对象进行代理
MyBatis通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的)
稍后开篇详说

本文博客地址:http://blog.csdn.net/soonfly/article/details/63352180 (转载请注明出处)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值