MyBatis 全局配置文件详解(七)
MyBatis 配置文件作用
MyBatis配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息。它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信息和设置功能。其实,几乎每个框架都有一个配置文件,好比几乎每部手机也都有一个设置图标。
作为 MyBatis 框架使用者,很有必要熟悉和掌握 MyBatis 配置文件的常见功能设置和属性信息,这会帮助我们更好的使用 MyBatis 框架。
MyBatis 配置文件类型
MyBatis配置文件有两种类型,如下:
- 全局配置文件(如 mybatis-config.xml)
- Mapper XML映射文件(如 UserMapper.xml)
全局配置文件详解
properties 设置
properties 配置的属性可在外部 Java 属性文件中动态替换,也可通过 properties 元素的子元素来替换。
方式一:在外部 Java 配置文件中配置属性
首先,在 Java 工程的 src 下创建名为 config.properties 的 Java 属性文件,内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
username=root
password=
接着,在 mybatis-config.xml 全局配置文件的 configuration 元素下添加 properties 属性,内容如下:
<!-- resource表示Java属性文件名 -->
<properties resource="config.properties">
</properties>
最后,使用 config.properties 文件中的配置项替换需要动态配置的属性值
<!--设置数据库驱动 -->
<property name="driver" value="${driver}"/>
<!--设置数据库url地址-->
<property name="url" value="${url}"/>
方式二:通过 properties 元素的子元素配置属性
<properties resource="config.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</properties>
使用子元素配置项替换需要动态配置的属性值
<!--设置数据库驱动 -->
<property name="driver" value="${driver}"/>
<!--设置数据库url地址-->
<property name="url" value="${url}"/>
<!--设置数据库用户名-->
<property name="username" value="${username}"/>
<!--设置数据库密码-->
<property name="password" value="${password}"/>
在实际项目开发中,采用最多的是方式一,即利用 properties 属性读取 Java 属性文件的方式替换 mybatis-config.xml 全局配置文件中需要动态修改的配置属性值,比如数据库的用户名、密码。好处就是以后数据库变了,就不用去修改 MyBatis 全局配置文件,只需要修改 config.properties 的属性值即可,这样便于项目维护。
settings 设置
settings 用于设置 MyBatis 框架的功能开关,一共可以设置四个功能开关,如下:
<configuration>
<settings>
<!-- 缓存开关(默认值true)-->
<setting name="cacheEnable" value="true"/>
<!-- 延时加载开关(默认值false)-->
<setting name="lazyLoadingEnable" value="false"/>
<!-- 配合延时加载开关使用(默认值false)-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 自动驼峰命名规则映射开关(默认值false)-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
</settings>
...
</configuration>
缓存开关的背后涉及 MyBatis 的缓存机制,这个后面会专门讲解缓存机制的原理。
延时加载开关的背后涉及 MyBatis 的延时加载机制,这个后面也会专门讲解延时加载机制的原理。
前两个都是硬骨头不好啃,我们这里先挑软柿子捏,最后一个设置比较容易理解,就是自动驼峰命名规则映射开关。这个开关有什么作用呀,它默认是关闭的,什么时候需要打开它呢?
首先我们需要知道两个知识点:经典数据库命名规则和 Java 驼峰命名规则
经典数据库命名规则:如果数据库字段由多个单词组成,则通过下划线连接多个单词,如 goods_name
Java 驼峰命名规则:如果 Java 的类名、方法名或属性名由多个单词组成,则第二个单词首字母大写,如goodsName
当 MyBatis 进行 ORM 映射时,如果数据库的字段采用的是经典数据库命名规则,而 Java 的属性或成员变量采用的是驼峰命名规则,那么将导致映射时数据库字段和 Java 的属性或成员变量之间无法正确匹配。通过开启自动驼峰命名规则映射开关后,MyBatis 就会自动去掉数据库字段的下划线,让其变得和 Java 能够匹配。
下面举个例子:
数据库字段:user_name
Java属性:userName
查询接口方法的映射语句如下:
<!--select查询语句 id表示接口方法名 resultType表示将数据库结果集自动映射为UserEntity-->
<select id="selectUserByAge" resultType="entity.UserEntity">
select * from tb_user where age > #{age}
</select>
如果你观察仔细,可能会发现之前我们使用的 resultMap 进行结果集映射,但是为何这里变成了 resultType;那么resultMap 与 resultType 这两个元素有何区别呀?resultMap 是 MyBatis 映射文件中非常重要的元素,下面我会专门讲解。这里的 resultType 的意思就是将查询的结果集自动映射为 UserEntity 实例,要求数据库字段名要和 Java 属性名相同才能自动映射哈。
执行查询操作如下:
[entity.UserEntity{id=1, userName='null', password='123456', name='张三三', age=22, sex=1, birthday=Sun Sep 02 00:00:00 IRKST 1990, created='2020-06-17 09:30:58.0', updated='2020-06-17 09:30:58.0'}]
大家看到了吗?UserEntity实例中其他属性都有值,但 userName 的属性值为 null。原因就是查询的结果集映射到UserEntity 时,user_name 和 userName 不匹配导致的。
那怎么办呢?首先想到的可以修改数据库字段名,改为 userName,这样不就和 Java 属性名匹配了;或者反过来,修改 Java 的属性名,改为 user_name,不过所有使用 userName 属性的地方都需要改哦。
假设数据库字段和 Java 属性名都不允许修改,那怎么办呢?
可以在 mybatis-config.xml 中添加 settings 设置,如下:
<configuration>
<settings>
<!-- 开启自动驼峰命名规则映射开关 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
...
</configuration>
再执行查询操作:
[entity.UserEntity{id=1, userName='zs', password='123456', name='张三三', age=22, sex=1, birthday=Sun Sep 02 00:00:00 IRKST 1990, created='2020-06-17 09:30:58.0', updated='2020-06-17 09:30:58.0'}]
看到了吧,userName 属性有值了,开启自动驼峰命名规则映射开关后, user_name 和 userName 不匹配问题得到完美解决了。
现在总算明白了开启自动驼峰命名规则映射开关的作用了吧。
typeAliases 设置
typeAliases 类型别名,就是为 Java 类全路径名(即包名+类名)取一个别名。它只和 XML 配置有关,存在的意义仅在于用来减少类全路径名的冗余。啥意思呀,看例子就明白了。
<!--结果集映射(ORM)-->
<resultMap id="userResultMap" type="entity.UserEntity">
...
</resultMap>
以上是 Mapper 接口映射 XML 文件中,使用 resultMap 元素将数据库结果集映射为实体类,其中 type 属性值是实体类的类全路径名。想一想,如果实体类的包名很长,是不是引用起来很麻烦,这时候 typeAliases 设置就可以解决这个麻烦。
typeAliases 设置如下
<configuration>
<typeAliases>
<!--type:实体类的全路径名。alias:别名,通常首字母大写-->
<typeAlias type="entity.UserEntity" alias="UserEntity"/>
</typeAliases>
...
</configuration>
这样就给 UserEntity 类的类全路径名取了一个别名 UserEntity,现在重新修改 Mapper 接口映射 XML 文件,如下:
<!--结果集映射(ORM)-->
<resultMap id="userResultMap" type="UserEntity">
...
</resultMap>
type 属性就可以直接使用别名 UserEntity,MyBatis 框架会自动通过别名 UserEntity 找到实体类的全路径名。
爱动脑经的你,可能会提出一个问题,那就是如果很多实体类都要取别名,那就意味着每个实体类都要去配置。这玩意儿似乎比原先的方式更麻烦,简直是个鸡肋嘛。
别着急,你说的没错,这点 MyBatis 框架开发者也早想到了,并提供了解决方案,如下:
<configuration>
<typeAliases>
<!--name:实体类所在包名-->
<package name="entity" />
</typeAliases>
...
</configuration>
以上配置的意思就是只配置实体类的包路径,然后扫描指定包路径下的所有类,扫描之后的别名就是类名(不区分大小写),建议使用的时候和类名一致。现在只需要把所有的实体类放到同一个包路径下,就可以配置一次,所有实体类自动取别名,一劳永逸。
environments 设置
MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置。尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
<configuration>
<!-- 数据库配置 -->
<environments default="development"><!--default表示选择默认的环境-->
<environment id="development"> <!--开发环境-->
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<!--设置数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--设置数据库url地址-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<!--设置数据库用户名-->
<property name="username" value="root"/>
<!--设置数据库密码-->
<property name="password" value=""/>
</dataSource>
</environment>
<environment id="test"> <!--测试环境-->
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<!--设置数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--设置数据库url地址-->
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"/>
<!--设置数据库用户名-->
<property name="username" value="root"/>
<!--设置数据库密码-->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
以上配置中我配了两个环境:一个开发环境和一个测试环境,而当前默认使用是开发环境。如果我想切换为测试环境,只需要设置 default=“test” 即可。
虽然,以上方式可以做到很方便的分离多个环境,但是实际项目开发中,我们更多的是选择使用 Spring 框架来管理数据源,来做到分离多个各种环境。
这样跟你说吧,实际项目开发中 MyBatis 框架一般很少单打独斗,更多的是和大名鼎鼎的 Spring 框架集成起来使用。那 MyBatis 框架如何与 Spring 框架集成,这个首先你得掌握 Spring 框架再说。目前 MyBatis 框架和 Spring 框架都是 JavaEE(Java企业级开发) 的主流框架,是 Java 程序员居家旅游必备技能哈。
mappers 设置
mappers 设置的作用是告诉 MyBatis 到哪里去找 Mapper 接口映射文件,它有 3 种设置方式:
- 使用相对于类路径的资源引用(映射文件方式使用)
- 使用映射器 Mapper 接口实现类的完全限定类名(注解方式使用)
- 使用映射器 Mapper 接口包路径(注解方式使用)
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers> <!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="mapper.UserMapper"/>
</mappers> <!-- 使用映射器 Mapper 接口包路径 -->
<mappers>
<package name="mapper" />
</mappers>
我们之前的 mappers 设置用的是第一种方式,这种方式需要创建 Mapper 映射文件,而且每增加一个 Mapper 映射文件就需要使用 mapper 元素配置相应的资源引用。
总结
- properties 设置:通过外部 Java 属性文件动态替换全局配置文件属性值
- settings 设置:设置 MyBatis 功能开关
- typeAliases 设置:为类路径取别名简化配置
- environments 设置:可以配置多个环境,同时满足开发、测试和运维不同环境需要
- mappers 设置:配置 Mapper 映射文件路径
MyBatis 全局配置文件详解(七)的更多相关文章
- Mybatis全局配置文件详解(三)
每个基于Mybatis应用都是以一个SqlSessionFactory实例为中心.SqlSessionFactory实例可以由SqlSessionFactoryBuild获得,而SqlSessionF ...
- MyBatis核心配置文件详解
------------------------siwuxie095 MyBatis 核心配置文件详解 1.核心 ...
- mybatis代码生成器配置文件详解
mybatis代码生成器配置文件详解 更多详见 http://generator.sturgeon.mopaas.com/index.html http://generator.sturgeon.mo ...
- Mybatis学习(二)————— 全局配置文件详解
一.全部配置内容 SqlMapConfig.xml的配置内容和顺序如下,顺序不能乱.现在来对这些属性的意思一一进行讲解. 二.properties 作用:引用java属性文件中的配置信息,比如,加载连 ...
- Mybatis(二) 全局配置文件详解
这节来说说全局配置文件的东西,非常简单.看一遍就懂了. --WH 一.全部配置内容 SqlMapConfig.xml的配置内容和顺序如下,顺序不能乱.现在来对这些属性的意思一一进行讲解. 二.prop ...
- mybatis主配置文件详解
mybatis主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configur ...
- Mybatis连接配置文件详解
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC &q ...
- mybatis的配置文件详解(二)
一.properties 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递.例如 1) <?xml versio ...
- mybatis Generator配置文件详解
这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照. 1. 配置文件头 <?xml version="1.0" encoding="UTF-8&quo ...
随机推荐
- 翻译:《实用的Python编程》09_01_Packages
目录| 上一节 (8.3 调试) | 下一节 (9.2 第三方包) 9.1 包 如果编写一个较大的程序,我们并不真的想在顶层将其组织为一个个独立文件的大型集合.本节对包(package)进行介绍. 模 ...
- Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(六):客户端基础库 TS 实战
小程序登录鉴权服务,客户端底层 SDK,登录鉴权.业务请求.鉴权重试模块 Typescript 实战. 系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gatew ...
- Android通过Web与后台数据库交互
2021.1.27 更新 已更新新版本博客,更新内容与原文章相比有点多,因此新开了一篇博客,请戳这里. 1 背景 开发一个App与后台数据库交互,基于MySQL+原生JDBC+Tomcat,没有使用D ...
- User-Agent大全 python
1 # -*-coding:utf-8 -*- 2 3 import random 4 5 # 返回一个随机的请求头 headers 6 def getheaders(): 7 # 各种PC端 8 u ...
- DevOps之Jenkins相关知识
目录 认识Jenkins 持续集成 持续交付 Jenkins简介 为什么需要Jenkins Jenkins的目标 Jenkins安装 初次使用Jenkins 加速插件安装 Jenkins-CI Jen ...
- PowerBI 使用Bookmark
使用PowerBI Desktop中的bookmark(书签),开发人员可以捕获报表中一个页面的当前配置,包括过滤器的设置,Visual的状态等信息,此后,开发人员可以通过激活已保存的bookmark ...
- 持续集成 简介&环境搭建
1. 持续集成简介 2. 持续集成环境搭建(Jenkins) 2.1 Git 安装 2.2 JDK 1.8 安装 2.3 Tomcat 安装 2.4 Maven 简介和安装 2.5 Jenkins 安 ...
- kubectl简介
kubectl简介 kubectl是操作k8s集群的命令行工具,安装在k8s的master节点,kubectl在$HOME/.kube目录中查找一个名为config的文件, 你可以通过设置Kubeco ...
- mongodb数据修复宝典
mongodb数据修复宝典 1. 版本信息 mongodb版本: 3.6.14 2.mongodb日志内容: 2019-10-04T10:41:38.558+0000 E STORAGE [inita ...
- FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb
apiAutoTestWeb使用说明 apiAutoTestWeb是为apiAutoTest的可视化版本,其采用前后端分离(FastAPI + Vue2)方式实现 具体使用: Python3 + Fa ...