Mybatis(二)、mybatis总配置文件

目录

1、properties、priperties(属性)

2、settings、setting(设置)

1)、cacheEnabled(是否开启二级缓存,默认为true)

2)、lazyLoadingEnabled(关联查询的延迟加载,默认为false)

3)、defaultExecutorType(默认Executor类型)

3、typeAliases(类型别名)

4、typeHandlers(类型处理器)

5、objectFactory(Object生成工厂)

6、plugins、plugin(插件)

7、databaseIdProvider(数据库提供商)

8、environments、environment(环境配置)

9、mappers、mapper(数据库表映射)


    Mybatis启动的时候一般都会配置一个以跟标签为<configuration>配置文件,一般命名为mybatis-config.xml(当然不是一定非要这个名字,也可以为null,同样会有大量的默认值会初始化)。其中所有的属性都会加载到Mybatis源码中的org.apache.ibatis.session.Configuration类,在整个项目中贯穿所有的Mybatis的解析和调用环节,相当于Spring中的ApplicationContext(全局上下文)。当前只先看<configuration>配置中的所有可配置参数,后续源码分析时查看是这样进行解析注入到Configuration,并且使用。

    配置文件允许的所有标签大致如下:

<?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>
    <!-- (属性) -->
    <properties resource="org/mybatis/example/config.properties">
        <property name="username" value="dev_user"/>
        <property name="password" value="F2Fa3!33TYyg"/>
    </properties>
    <!-- (设置) -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <typeAliases> <!-- (类型别名) --> </typeAliases>
    <!-- (对象工厂) -->
    <objectFactory type="org.mybatis.example.ExampleObjectFactory">
        <property name="someProperty" value="100"/>
    </objectFactory>
    <!-- (插件) -->
    <plugins>
        <plugin interceptor="org.mybatis.example.ExamplePlugin">
            <property name="someProperty" value="100"/>
        </plugin>
    </plugins>
    <!-- (数据库厂商标识) -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="SQL Server" value="sqlserver"/>
        <property name="DB2" value="db2"/>
        <property name="Oracle" value="oracle" />
    </databaseIdProvider>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/kevin?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers> <!-- (设置) -->
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

1、properties、priperties(属性)

    与常用的properties配置文件一样,key、value键值对。一般很少使用。

2、settings、setting(设置)

    Configuration类中设置了非常多的默认配置项,其中比较重要配置项有:

    1)、cacheEnabled(是否开启二级缓存,默认为true)

    二级缓存,对应Mapper.xml级别的缓存,默认为开启。

    2)、lazyLoadingEnabled(关联查询的延迟加载,默认为false)

    3)、defaultExecutorType(默认Executor类型)

    设置默认的Executor,执行器对于Mybatis来说非常的重要,插件的基于动态代理实现等都与其有关系。默认为SIMPLE类型,可选项有BATCH对应JDBC中的批处理;REUSE对应JDBC的PreparedStratement处理。


3、typeAliases(类型别名)

    设置别名,类似于Spring Bean中的aliase,但是这是全局的别名,设置到TypeAliasRegistry中的Map中,如下:

public class TypeAliasRegistry {
    private final Map<String, Class<?>> typeAliases = new HashMap();
}

主要用于:

1)、Mapper.xml中的namespace需要配置数据库ORM的映射的类全限定名,这个可以使用别名。

<typeAliases>
  <typeAlias alias="Kevin" type="com.kevin.Kevin"/>
</typeAliases>

2)、将包下面的所有类(一般是设置数据库表的对应的类)设置别名

<typeAliases>
  <package name="com.kevin"/>
</typeAliases>

3)、为(下面的)TypeHandler处理时的别名

    如  "_byte" 对应 Byte.TYPE 等,后续在初始化时会大量进行注入。

4、typeHandlers(类型处理器)

    在JDBC处理中的一个诟病就是ResultSet需要根据类型转化为Int、String等类型,Mybatis在去处理的时候,很多情况下我们并没有在该处配置但是却为我们转化为POJO中对应的字段类型。就是因为其设置了大量的默认映射类型,后续源码分析中就可以看到。注册后被存放到TypeHandlerRegistry类中,由于需要存放 Java类型;数据库类型;以及处理的TypeHandler类型,所以使用了Map<Map>的结构,如下:

public final class TypeHandlerRegistry {
    private final Map<JdbcType, TypeHandler<?>> jdbcTypeHandlerMap;
    // 使用Map中存放Map的形式,映射三者的关系
    private final Map<Type, Map<JdbcType, TypeHandler<?>>> typeHandlerMap;
    private final TypeHandler<Object> unknownTypeHandler;
    private final Map<Class<?>, TypeHandler<?>> allTypeHandlersMap;
    private static final Map<JdbcType, TypeHandler<?>> NULL_TYPE_HANDLER_MAP = Collections.emptyMap();
    private Class<? extends TypeHandler> defaultEnumTypeHandler;
}

    我们完全可以写自定义的TypeHandler类型处理特殊的需求,比如时间类型等,只需要继承自BaseTypeHandler,如下:

@MappedJdbcTypes(JdbcType.VARCHAR)
public class TimeTypeHandler extends BaseTypeHandler<String> {
}
<typeHandlers>
  <package name="com.kevin.example"/>
</typeHandlers>

 

5、objectFactory(Object生成工厂)

    之前的时候JDBC处理的数据只能是Map等类型,但是ORM需要将一张表与一个POJO进行映射,创建对象返回给我们。那么肯定是使用反射的方式,根据Class进行创建。一般使用DefaultObjectFactory(默认的对象创建工厂)创建对象即可,提供了无参和有参的构造反射,创建对象工厂。

 

6、plugins、plugin(插件)

    插件是非常重要的扩展,可以在Mybatis的四个重要类(环节)中进行插件扩展

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

   当然就是使用动态代理的方式进行处理,层层进行代理,那么我们执行的时候则是invoke再invoke进行调用,详细原理后续专门分析PageHelper分页插件。

 

7、databaseIdProvider(数据库提供商)

     基本很少使用。

8、environments、environment(环境配置)

    可以允许配置多套环境,其中又可以配置 数据源DataSource、事务管理器。在Spring项目中,一般都交由Spring进行管理,或者说是使用Spring的。具体后续进行分析怎么进行实现的。

9、mappers、mapper(数据库表映射)

 下一篇博客专门分析Mapper.xml,并且在Spring中是怎么实现getMapper(a.class)的。

 

所有<settings>的配置项从官网copy了一份,方便自己查询使用:

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true | falsefalse
aggressiveLazyLoading开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。true | falsefalse (在 3.4.1 及之前的版本中默认为 true)
multipleResultSetsEnabled是否允许单个语句返回多结果集(需要数据库驱动支持)。true | falsetrue
useColumnLabel使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。true | falsetrue
useGeneratedKeys允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或未知属性类型)的行为。
  • NONE: 不做任何反应
  • WARNING: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN)
  • FAILING: 映射失败 (抛出 SqlSessionException)
NONE, WARNING, FAILINGNONE
defaultExecutorType配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定数据库驱动等待数据库响应的秒数。任意正整数未设置 (null)
defaultFetchSize为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。任意正整数未设置 (null)
defaultResultSetType指定语句默认的滚动策略。(新增于 3.5.2)FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未设置)未设置 (null)
safeRowBoundsEnabled是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。true | falseFalse
safeResultHandlerEnabled是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用则设置为 false。true | falseTrue
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。true | falseFalse
localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。SESSION | STATEMENTSESSION
jdbcTypeForNull当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。OTHER
lazyLoadTriggerMethods指定对象的哪些方法触发一次延迟加载。用逗号分隔的方法列表。equals,clone,hashCode,toString
defaultScriptingLanguage指定动态 SQL 生成使用的默认脚本语言。一个类型别名或全限定类名。org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5)一个类型别名或全限定类名。org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。true | falsefalse
returnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2)true | falsefalse
logPrefix指定 MyBatis 增加到日志名称的前缀。任何字符串未设置
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置
proxyFactory指定 Mybatis 创建可延迟加载对象所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 以上)
vfsImpl指定 VFS 的实现自定义 VFS 的实现的类全限定名,以逗号分隔。未设置
useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1)true | falsetrue
configurationFactory指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3)一个类型别名或完全限定类名。未设置
shrinkWhitespacesInSqlRemoves extra whitespace characters from the SQL. Note that this also affects literal strings in SQL. (Since 3.5.5)true | falsefalse

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值