详解mybatis配置文件


       在前面两篇文章中,大致与大家分享了基于Java的ORM框架,Mybatis基本架构和Mybatis实现CRUD的基本原理与流程,在本篇文章中,继续与大家分享Mybatis配置文件。

通过研究Mybatis官网配置文件,不难得出如下两个结论:

       结论一:Mybatis配置文件结构是固定的

       结论二:Mybatis配置文件有九大类全局配置节点,且它们之间存在先后顺序关系

     本篇文章重点,也是为了解决如上两个结论问题。

一  Mybatis九大类全局配置节点


 (一)properties

 properties为属性配置文件,它为上下文提供相关的资源,properties有三种配置资源的方式:

方式一:通过properties子元素配置

通过properties子元素property配置username和password变量,然后在properties下文environment节点中引用这些变量

<properties>
   <property name="username" value="root"/>
   <property name="password" value="root"/>
properties>

 在environments节点中引用username和password变量

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            dataSource>
        environment>
    environments>

方式二:通过properise的属性配置

<properties resource="demo/mybatis/resources/jdbc.properties"/>

方式三:通过属性参数传递配置

 即把属性传递到SqlSessionFactoryBuilder.build()中

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);

// ... or ...

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);

Tip:当在mybatis配置文件中同时存在三种方式时,优先级顺序如下:

(1)首先读取properties子元素属性

(2)其次读取properties元素的属性(resource和url)

(3)最后读取作为方法参数传递的属性,并覆盖以读取的同名属性

三种方式,存在优先级,且排在后面的配置覆盖排在前面同名属性的配置,鉴于此,建议在配置时,不要使用混合方式。

(二)settings

settings决定mybatis运行时行为,均有很多可配置的行为,如下为一个较完整的settings配置

<settings>
        
        <setting name="cacheEnabled" value="true"/>
        
        <setting name="lazyLoadingEnabled" value="false"/>
        
        <setting name="aggressiveLazyLoading" value="false"/>
        
        <setting name="multipleResultSetsEnabled" value="true"/>
        
        <setting name="useColumnLabel" value="true"/>
        
        <setting name="useGeneratedKeys" value="false"/>
        
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        
        <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
        
        <setting name="defaultExecutorType" value="SIMPLE"/>
        
        <setting name="defaultStatementTimeout" value="25"/>
        
        <setting name="defaultFetchSize" value="100"/>
        
        <setting name="safeRowBoundsEnabled" value="false"/>
        
        <setting name="safeResultHandlerEnabled" value="true"/>
        
        <setting name="mapUnderscoreToCamelCase" value="false"/>
        
        <setting name="localCacheScope" value="SESSION"/>
        
        <setting name="jdbcTypeForNull" value="OTHER"/>
        
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
        
        <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
        
        <setting name="callSettersOnNulls" value="false"/>
        
        <setting name="returnInstanceForEmptyRow" value="false"/>
        
        <setting name="logPrefix" value="log"/>
        
        <setting name="logImpl" value="LOG4J"/>
        
        <setting name="proxyFactory" value="JAVASSIST"/>
        
        <setting name="vfsImpl" value="vfs"/>
        
        <setting name="useActualParamName" value="true"/>
        
        <setting name="configurationFactory" value="configClass"/>
    settings>

(三)typeAliases

类型别名为Java类型设置一个简短名字,它只与xml有关,用来减少类完全限定名的冗余

<typeAliases>
   <typeAlias type="demo.mybatis.entity.UserInfo" alias="UserInfo"/>
typeAliases>

这样配置后,任何使用demo.mybatis.entity.UserInfo的地方,都可用UserInfo来代替

除此之外,还可以指定一个包名,mybatis会在包名下搜索需要的Java Bean,比如:

<typeAliases>
     <package name="demo.mybatis.entity"/>
typeAliases>

在没注解的情况下,每个在demo.mybatis.entity中的Java Bean,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如demo.mybatis.entity.UserInfo的别名为userInfo.

若存在注解,则别名为注解名。

POJO设置别名

@Alias("Users")
public class User{

}

Mapper.xml

<select id="getUserInfoById" resultType="Users">
   SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}
select>

(四)typeHandlers

typeHandlers主要将获取的值合理地转化为java类型,可以转换预处理阶段(PreparedStatement)的参数和结果集中的值。mybatis提供了标准的类型处理,

详细请参照官网:http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers

同时,mybatis也支持之定义处理类型,在自定义处理类型时,只需实现org.apache.ibatis.type.TypeHandler接口,或继承org.apache.ibatis.type.BaseTypeHandler

(五)obejctFactory

 后续文章讲解...

(六)plugins

  后续文章讲解...

(七)environments

environments环境配置,mybatis支持多种配置,从而有助于适应多种数据库。但需要注意的是,尽管可以配置多个环境,但每个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);

如下为一个环境配置示例

<environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
           dataSource>
      environment>
environments>

注释:

  • 默认的环境 ID(比如:default="development")。
  • 每个 environment 元素定义的环境 ID(比如:id="development")。
  • 事务管理器的配置(比如:type="JDBC")。
  • 数据源的配置(比如:type="POOLED")。

   默认的环境和环境 ID 是自解释的,因此一目了然。你可以对环境随意命名,但一定要保证默认的环境 ID 要匹配其中一个环境 ID。

事务管理器:

Mybatis支持两种类型的事务管理器:

jdbc:依赖于从数据源得到的连接来管理事务作用域

managed:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。

默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:

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

dataSource:

dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源,有三种内建的数据源类型:

UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接

POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式

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

(八)databaseIdProvider

databaseIdProvider主要功能是支持多厂商数据库,它的实现原理是基于映射语句中的databaseId属性。MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库

 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml

文件中加入 databaseIdProvider

<databaseIdProvider type="DB_VENDOR" />

(九)mappers

mappers关联映射配置文件,即告诉mybatis到哪里去找映射配置文件。有四种基本方式可以关联映射配置文件:

方式一:使用相对于类路径的资源引用


<mapper resource="demo/mybatis/resources/userInfo-config.xml"/>

表示的程序目录结构如下:

方式二:使用完全限定资源定位符URL

假设映射文件路径为:E:\userInfo-config.xml 

则采用url方式如下:(格式为file:///url)

<mapper url="file:///E:/userInfo-config.xml"/>

方式三:使用映射器接口实现类的完全限定名

定义映射接口:

package demo.mybatis.service;

import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.annotations.Select;

public interface UserInfoAnnotation {
    @Select("SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}")
    public UserInfo getUserInfoById(int user_id);
}

配置映射

class="demo.mybatis.service.UserInfoAnnotation"/>

方式四:将包内的映射器接口实现全部注册为映射器

<package name="demo.mybatis.service"/>

 二  Mybatis九大类全局配置节点顺序


     Mybatis九大类全局配置节点按照如下顺序排序,位置不能颠倒。

     properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>plugins=>environment=>databaseIdProvider=>mappers

三   Mybatis系列文章


     浅谈JavaWeb架构演变

     浅谈mybatis如何半自动化解耦

四  参考文献


   【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#

五 版权区


  •    转载博客,必须注明博客出处
  •    博主网址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,欢迎提出,邮箱:2098469527@qq.com