李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.MyBatis核心配置文件详解
Leefs
2022-12-04 PM
1536℃
0条
[TOC] ### 前言 **Mybatis配置文件两大类**: + **Mybatis 主配置文件**: 提供 Mybatis 全局设置的。包含的内容、日志、数据源、mapper 文件位置等信息。 + **Mybatis 的 mapper 文件**: 用来写SQL语句。一个表/Mapper接口一个 mapper 文件。 ### 一、概述 MyBatis的核心配置文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性。 这些信息通常在一个项目中只会在一个配置文件中编写,并且编写后也不会轻易更改。虽然在实际项目中需要开发人员编写或者修改的配置文件不多,但是熟悉配置文件中各个元素的功能还是十分重要的。 ### 二、核心配置文件 核心配置文件 `mybatis-config.xml`,配置文件会影响 mybatis 的行为设置和属性信息 ![01.MyBatis核心配置文件详解01.jpg](https://lilinchao.com/usr/uploads/2022/12/2950420429.jpg) **层级说明** + configguration 配置 + properties 属性 + settings 设置 + typeAliases 类型别名 + typeHandlers 类型处理器 + objectFactory 对象工厂 + plugins 插件 + environments 环境 + environment 环境变量 + transactionManager 事务管理器 + dataSource 数据源 + mappers 映射器 *注意:在配置文件里面添加这些配置,要按顺序来添加,不然会报错* ### 三、配置信息详解 #### 3.1 configuration(配置) **作用** > configuration元素是整个XML配置文件的根节点,相当于MyBatis的总管MyBatis所有的配置信息都会存放在这里面。 > > Mybatis提供了设置这些配置信息的方法。 > > configuration可从配置文件里获取属性值,也可以通过程序直接设置。 ```xml
``` #### 3.2 properties(属性) ##### 作用 > 将数据连接单独配置在db.properties中,只需要在`mybatis-config.xml`中加载db.properties的属性值,在`mybatis-config.xml`中就不需要对数据库连接参数进行硬编码。 > > 数据库连接参数只配置在db.properties中,方便对参数进行统一管理,其它xml可以引用该db.properties。 ##### 数据源连接信息配置方式 ##### 方式一 > 可通过外部指定的方式,即配置在典型的Java属性配置文件中 **(1)在项目src目录下,添加一个全名为db.properties地配置文件** ```properties jdbc.driver=com.mysql.jbdc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=root ``` **(2)在MyBatis配置文件`mybatis-config.xml`中配置`
`元素** ```xml
``` **(3)修改配置文件中数据库连接地信息** ```xml
``` ##### 方式二 > 直接配置为xml,并使用这些属性对配置项实现动态配置 ```xml
``` 在上述代码中,driver、url、username、password将会由properties元素中设置的值来替换 **优先级** 子节点设置的值会先被读取,resource中的同名属性将会覆盖property子节点的值。所以resource属性值的优先级高于property子节点配置的值。 ##### 方式三 > 直接暴力进行暴力配置,不需要properties属性 ```xml
``` 直接写入配置内容但缺少了动态调整的功能 #### 3.3 settings(设置) ##### 作用 > setting是指定MyBatis的一些全局配置属性,这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为,例如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器(Executor)类型等 ##### 配置示例 ```xml
``` ##### mybatis-settings的配置属性以及描述 | 配置项 | 作用 | 配置选项 | 默认值 | | -------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | cacheEnabled | 该配置影响所有映射器中配置缓存的全局开关 | `true/false` | true | | lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 | `true/false` | false | | aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 | `true/felse` | 版本3.4.1 (不包含) 之前 true,之后 false | | multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动) | `true/false` | true | | useColumnLabel | 使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | `true/false` | true | | useGeneratedKeys | 允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) | `true/false` | false | | autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套) | NONE、PARTIAL、FULL | PARTIAL | | autoMappingUnknownColumnBehavior | 指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 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)。如果允许,设置 false | `true/false` | false | | safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置false | `true/false` | true | | mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 | `true/false` | false | | localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据 | `SESSION/STATEMENT` | SESSION | | jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER | NULL、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 等)不能设置成 null | `true/false` | false | | logPrefix | 指定 MyBatis 增加到日志名称的前缀 | 任何字符串 | Not set | | loglmpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动査找 | `SLF4J / LOG4J / LOG4J2 / JDK_LOGGING / COMMONS_LOGGING / STDOUT_LOGGING / NO_LOGGING` | Not set | | proxyFactory | 指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具 | `CGLIB/JAVASSIST` | JAVASSIST (MyBatis 版本为 3.3 及以上的) | | vfsImpl | 指定 VFS 的实现类 | 提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔 | Not set | | useActualParamName | 允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用) | `true/false` | true | #### 3.4 typeAliases(类型别名) ##### 作用 > 配置类型别名,通过与mybatis的sql映射文件相关联,减少输入多余的完整类名,以简化操作 ##### 方式一 ```xml
``` **属性说明** + **type**:用于指定需要被定义别名的类的全限定名; + **alias**:属性的属性值user就是自定义的别名,它可以代替`com.lilinchao.pojo.User`使用在MyBatis文件的任何位置。 > 如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名。 ```xml
``` 这种写法的弊端在于,如果一个项目中有多个pojo,需要一一进行配置。 ##### 方式二 > 通过package的name属性直接指定包名,mybatis会自动扫描指定包下的javabean,并设置一个别名,默认名称为javabean的非限定类名。 ```xml
``` **mapper写法** ```xml
select * from user
``` package的name属性用于指定要被定义别名的包,MyBatis会将所有`com.lilinchao.pojo`包中的POJO类以首字母小写的非限定类名来作为它的别名,比如`com.lilinchao.pojo.User`的user,`com.lilinchao.pojo.Provider`的别名为provider等。 ##### 方式三 > 上述方法二的别名只适用于没有注解的情况,如果在程序中使用了注解则别名为其注解的值 ```java @Alias(value="user") public class User{ //User的属性和方法 ... } ``` ##### mybatis提供默认类型别名 > mybatis已经为许多常见的java基础数据类型内建了相应的类型别名,一般都与其映射类型一致,并且都是大小写不敏感的 | 别名 | 映射的类型 | | ---------- | ---------- | | _byte | byte | | _long | long | | _short | short | | _int | int | | _integer | int | | _double | double | | _float | float | | _boolean | boolean | | string | String | | byte | Byte | | long | Long | | short | Short | | int | Integer | | integer | Integer | | double | Double | | float | Float | | boolean | Boolean | | data | Data | | decimal | BigDecimal | | bigdecimal | BigDecimal | | object | Object | | map | Map | | hashmap | HashMap | | list | List | | arraylist | ArrayList | | collection | Collection | | iterator | Iterator | #### 3.5 typeHandlers(类型处理器) ##### 作用 > + 由于Java 类型和数据库的 JDBC 类型不是一一对应的(比如 String 与 varchar), 所以我们把 Java 对象转换为数据库的值,和把数据库的值转换成 Java 对象,需要经过一定的转换,这两个方向的转换就要用到 TypeHandler。 > + 我们平时没有做任何关于 TypeHandler 的配置,为什么实体类对象里面的 String 属性,可以保存成数据库里面的 varchar 字段或者保存成 char 字段呢,这是因为 MyBatis 中已经内置了很多 TypeHandler。 > + typeHandlers(类型处理器)标签是用来重写或者自定义类型处理器的。 ##### 默认类型处理器 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。 **下表描述了一些默认的类型处理器**: | 类型处理器 | Java 类型 | JDBC 类型 | | ----------------------- | -------------------------- | ------------------------------------------------------------ | | BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN | | ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE | | ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER | | IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER | | LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER | | FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT | | DoubleTypeHandler | java.lang.Double, double | 数据库兼容的 NUMERIC 或 DOUBLE | | BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL | | StringTypeHandler | java.lang.String | CHAR, VARCHAR | | ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR | | NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR | | NClobTypeHandler | java.lang.String | NCLOB | | ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 | | BlobTypeHandler | byte[] | BLOB, LONGVARBINARY | | DateTypeHandler | java.util.Date | TIMESTAMP | | DateOnlyTypeHandler | java.util.Date | DATE | | TimeOnlyTypeHandler | java.util.Date | TIME | | SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP | | SqlDateTypeHandler | java.sql.Date | DATE | | SqlTimeTypeHandler | java.sql.Time | TIME | | ObjectTypeHandler | Any | OTHER 或未指定类型 | | EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) | | EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 | 可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。 **具体的做法为**: 1. 实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler 2. 然后可以选择性地将它映射到一个JDBC类型。 #### 3.6 objectFactory(对象工厂) ##### 作用 > + 当我们把数据库返回的结果集转换为实体类的时候,需要创建对象的实例,由于我们不知道需要处理的类型是什么,有哪些属性,所以不能用 new 的方式去创建。 > > + 在 MyBatis 里面,它提供了一个工厂类的接口,叫做 ObjectFactory,专门用来创建对象的实例。 > + typeHandlers(类型处理器)标签是用来重写或者自定义类型对象工厂的。 #### 3.7 plugins(插件) ##### 作用 > + MyBatis 可以使用第三方的插件来对功能进行扩展。 ##### 示例 比如分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。 ```xml
``` #### 3.8 environments(环境配置) ##### 作用 > + mybatis 可以配置多套环境使用,将 SQL 映射到不同的数据库中。 > + 比如开发、测试和生产环境的数据库不同,需要不同的配置。 > + 但是,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。 > + 有多少个环境,就需要多少个 SqlSessionFactory 实例。 ##### 示例 ![01.MyBatis核心配置文件详解02.jpg](https://lilinchao.com/usr/uploads/2022/12/3578720203.jpg) **事务管理器(transactionManager)类型有两种** | 类型 | 说明 | | ------- | ------------------------------------------------------------ | | JDBC | 直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。 | | MANAGED | 它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置 为 false 来阻止它默认的关闭行为。 | **数据源(dataSource)类型有三种** | 类型 | 说明 | | -------- | ------------------------------------------------------------ | | UNPOOLED | 这个数据源的实现只是每次被请求时打开和关闭连接。 | | POOLED | 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。 | | JNDI | 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置 一个 JNDI 上下文的引用 | #### 3.9 databaseIdProvider(数据库厂商标识) ##### 作用 > MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 ##### 使用 > + MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 > + 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 `mybatis-config.xml` 文件中加入 `databaseIdProvider` 即可: ```java
``` 这里的 `DB_VENDOR` 会通过 `DatabaseMetaData#getDatabaseProductName()` 返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下: ```xml
``` #### 3.10 mappers(映射器) ##### 作用 > 映射器就是告诉 MyBatis 到哪里去找到这些语句。 **方式一** ```xml
``` **方式二** ```xml
``` **方式三** ```xml
``` 注意: 1. 接口和mapper文件必须同名; 2. 接口和mapper文件在同一个包下。 **方式四** ```xml
``` *附参考文章链接* *https://blog.csdn.net/weixin_45187434/article/details/127522674* *https://blog.csdn.net/qq_52360069/article/details/124257553*
标签:
MyBatis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2664.html
上一篇
58.CyclicBarrier介绍
下一篇
02.MyBatis获取参数值的两种方式
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Quartz
Elasticsearch
持有对象
Spark Core
Kibana
Tomcat
Jquery
Filter
Elastisearch
数据结构和算法
MySQL
数据结构
递归
Hbase
Http
Golang
微服务
Livy
HDFS
Yarn
Java
Golang基础
MyBatis
哈希表
栈
BurpSuite
工具
线程池
CentOS
Eclipse
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭