• MyBatis:核心配置文件


    MyBatis核心配置文件



    一、配置文件概述

    Mybatis 配置文件两大类:1.Mybatis 主配置文件;2.Mybatis 的 mapper 文件

    • Mybatis 主配置文件: 提供 Mybatis 全局设置的。包含的内容、日志、数据源、mapper 文件位置等信息。
    • Mybatis 的 mapper 文件: 写 sql 语句的。一个表/Mapper接口一个 mapper 文件。

    二、核心配置文件

    核心配置文件 mybatis-config.xml,配置文件会影响 mybatis 的行为设置和属性信息

    MyBatis 配置文档的顶层结构如下:

    1. configuration(配置)
    2. properties(属性)
    3. property(属性信息)
    4. settings(设置)
    5. typeAliases(类型别名)
    6. typeHandlers(类型处理器)
    7. objectFactory(对象工厂)
    8. plugins(插件)
    9. environments(环境配置)
    10. environment(环境变量)
    11. transactionManager(事务管理器)
    12. ​dataSource(数据源)
    13. property(属性信息)
    14. databaseIdProvider(数据库厂商标识)
    15. mappers(映射器)

    在配置文件里面添加这些配置,要按顺序来添加,不然会报错

    1. properties(属性)

    properties(属性)是用来加载配置文件或声明属性信息的,比如:

        <properties resource="db.properties">
            <property name="username" value="dev_user"/>-->
            <property name="password" value="F2Fa3!33TYyg"/>-->
        </properties>
    
    • 1
    • 2
    • 3
    • 4

    2. settings(设置)

    在 MyBatis 中 settings 是最复杂的配置,它能深刻影响 MyBatis 底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可,比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器(Executor)类型等

    配置项作用配置选项默认值
    cacheEnabled该配置影响所有映射器中配置缓存的全局开关true|falsetrue
    lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态true|falsefalse
    aggressiveLazyLoading当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 true|false版本3.4.1 (不包含) 之前 true,之后 false
    multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动) true|falsetrue
    useColumnLabel使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果true|falsetrue
    useGeneratedKeys允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) true|falsefalse
    autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)NONE
    PARTIAL
    FULL
    PARTIAL
    autoMappingUnkno
    wnColumnBehavior
    指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常NONE
    WARNING
    FAILING
    NONE
    defaultExecutorType配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新SIMPLE
    REUSE
    BATCH
    SIMPLE
    defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数 任何正整数Not Set (null)
    defaultFetchSize 设置数据库驱动程序默认返回的条数限制,此参数可以重新设置 任何正整数Not Set (null)
    safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 falsetrue|falsefalse
    safeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置falsetrue|falsetrue
    mapUnderscoreToCamelCase是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射true|falsefalse
    localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据SESSION|STATEMENTSESSION
    jdbcTypeForNull当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHERNULL
    VARCHAR
    OTHER
    OTHER
    lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载equals
    clone
    hashCode
    toString
    defaultScriptingLanguage指定动态 SQL 生成的默认语言 org.apache.ibatis.script.ing.xmltags.XMLDynamicLanguageDriver
    callSettersOnNulls指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 nulltrue|falsefalse
    logPrefix指定 MyBatis 增加到日志名称的前缀任何字符串Not set
    loglmpl指定 MyBatis 所用日志的具体实现,未指定时将自动査找 SLF4J
    LOG4J
    LOG4J2
    JDK_LOGGING
    COMMONS_LOGGING
    STDOUT_LOGGING
    NO_LOGGING
    Not set
    proxyFactory指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具 CGLIB|JAVASSISTJAVASSIST (MyBatis 版本为 3.3 及以上的)
    vfsImpl指定 VFS 的实现类 提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔Not set
    useActualParamName允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用)true|falsetrue

    3. typeAliases(类型别名)

    类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

    在Mybatis核心配置文件中配置(将Java类的全路径替换成一个别名,在xml使用):

        <typeAliases>
            <typeAlias alias="User" type="com.xxx.domain.User"/>
        typeAliases>
    
    • 1
    • 2
    • 3

    也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,使用 Bean 的首字母小写的非限定类名来作为它的别名:

        <typeAliases>
            <package name="com.xxx.domain"/>
        typeAliases>
    
    • 1
    • 2
    • 3

    使用注解的形式起别名:

    @Alias("theUser")
    public class User {}
    
    • 1
    • 2
        <select id="selectUserList" resultType="theUser">
            select * from user
        </select>
    
    • 1
    • 2
    • 3

    其中,mybatis 核心配置文件中配置优先级最高,开启包扫描后,如果还有另外配置注解,则以注解为准。

    Java类型的别名,如果在前面加下划线_,映射的是基本类型,如果没有加下划线,映射的是包装类型。

    4. typeHandlers(类型处理器)

    由于Java 类型和数据库的 JDBC 类型不是一一对应的(比如 String 与 varchar), 所以我们把 Java 对象转换为数据库的值,和把数据库的值转换成 Java 对象,需要经过 一定的转换,这两个方向的转换就要用到 TypeHandler。我们平时没有做任何关于 TypeHandler 的配置,为什么实体类对象里面的 String 属性,可以保存成数据库里面的 varchar 字段或者保存成 char 字段呢,这是因为 MyBatis 中已经内置了很多 TypeHandler。

    typeHandlers(类型处理器)标签是用来重写或者自定义类型处理器的。

    5. objectFactory(对象工厂)

    当我们把数据库返回的结果集转换为实体类的时候,需要创建对象的实例,由于我 们不知道需要处理的类型是什么,有哪些属性,所以不能用 new 的方式去创建。在 MyBatis 里面,它提供了一个工厂类的接口,叫做 ObjectFactory,专门用来创建对象的实例。

    typeHandlers(类型处理器)标签是用来重写或者自定义类型对象工厂的。

    6. plugins(插件)

    MyBatis 可以使用第三方的插件来对功能进行扩展,比如分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。

    <!--配置分页助手插件-->
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageHelper">
                <property name="dialect" value="mysql"></property>
            </plugin>
        </plugins>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7. environments(环境配置)

    mybatis 可以配置多套环境使用,将 SQL 映射到不同的数据库中。比如开发、测试和生产环境的数据库不同,需要不同的配置。但是,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。有多少个环境,就需要多少个 SqlSessionFactory 实例。

    		<!--    default为默认使用的环境    -->
        <environments default="development">
    				<!--   id为development的环境    -->
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="org.postgresql.Driver"/>
                    <property name="url" value="jdbc:postgresql://127.0.0.1:5432/postgres?useSSL=false"/>
                    <property name="username" value="postgres"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
    				<!--    id为test的环境    -->
            <environment id="test">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED"></dataSource>
                ...
            </environment>
        </environments>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    事务管理器(transactionManager)有两种配置: type=“[JDBC|MANAGED]”

    • JDBC:使用了 JDBC 的提交和回滚设施。
    • MANAGED : 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。

    数据源(dataSource) 有三种类型:type=“[UNPOOLED|POOLED|JNDI]”

    • UNPOOLED – 这个数据源的实现会每次请求时打开和关闭连接。
    • POOLED – 这种数据源的实现利用“池”的概念将 JDBC连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。默认的是这个。
    • JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用。

    8. databaseIdProvider(数据库厂商标识)

    MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。

    MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

    <databaseIdProvider type="DB_VENDOR" />
    
    • 1

    这里的 DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下:

    <databaseIdProvider type="DB_VENDOR">
      <property name="SQL Server" value="sqlserver"/>
      <property name="DB2" value="db2"/>        
      <property name="Oracle" value="oracle" />
    databaseIdProvider>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    9. mappers(映射器)

    映射器就是告诉 MyBatis 到哪里去找到这些语句。

    方式一:

    
    <mappers>
      <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
      <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    mappers>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方式二:

    
    <mappers>
      <mapper url="file:///var/mappers/AuthorMapper.xml"/>
      <mapper url="file:///var/mappers/BlogMapper.xml"/>
    mappers>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方式三:

    <mappers>
      <mapper class="org.mybatis.builder.AuthorMapper"/>
      <mapper class="org.mybatis.builder.BlogMapper"/>
    mappers>
    
    • 1
    • 2
    • 3
    • 4

    注意:

    1. 接口和mapper文件必须同名
    2. 接口和mapper文件在同一个包下

    方式四:

    
    <mappers>
      <package name="org.mybatis.builder"/>
    mappers>
    
    • 1
    • 2
    • 3
    • 4

  • 相关阅读:
    HarmonyOS—编译构建概述
    rabbitmq知识梳理
    Error:$ is not defined ,vue 项目中引入 jquery 报错及解决方法
    备战金九银十,为Java岗准备全套架构视频 +大厂面经+面试专题
    什么是JUC_java培训
    PAT甲级刷题记录-(AcWing)-Day09数学(8题)
    K8s ingress-controller中nginx文件上传大小的限制
    17. 线性代数 - 矩阵的逆
    vue中数据代理和事件处理
    【JUC】ThreadPoolExecutor构造函数及拒绝策略
  • 原文地址:https://blog.csdn.net/weixin_47410172/article/details/127867220