MyBatis实战指南(三)MyBatis常用配置详解(XML配置,环境配置,类型别名,属性与映射器)
MyBatis实战指南(三)MyBatis常用配置详解(XML配置,环境配置,类型别名,属性与映射器)
- 前言
- 一、XML配置
- 1. XML 配置文件是什么?
- 2. XML 配置文件的核心结构
- 3. properties:外部属性配置
- 4. settings:MyBatis 全局设置(重要)
- 5. environments:数据库环境配置(必须)
- 6. typeAliases:类型别名(简化代码)
- 7. mappers:注册 SQL 映射文件(必须)
- 8. 一个完整的 XML 配置文件示例
- 二、环境配置
- 1、为什么需要环境配置?
- 2. 两个 environment 中 id="development" 与 id="test" 的区别
- 1. 表面区别:id 不同,代表不同场景
- 2. 实际区别:数据库连接参数不同
- 3. 为什么要这样写?
- 3.1 切换方便
- 3.2 隔离数据,避免误操作
- 3.3 优化配置,适配不同性能需求
- 3. 环境配置中其他概念
- 1. transactionManager
- 2. dataSource
- 三、类型别名
- 1. 为什么需要类型别名?
- 2. 类型别名的第一种方法
- 3. 类型别名的第二种方法(推荐,适合大量类)
- 四、映射器
- 1.什么是映射器?
- 2. 映射器的 3 种方式
- 方式一:指定单个文件路径
- 方式二:扫描包路径(推荐)
- 方式三:绑定接口(强烈推荐)
前言
- 在之前的博客中,我们已介绍MyBatis入门基础、基于IDEA从零搭建首个MyBatis系统,以及通过逆向工程生成数据库表映射的操作。
- 本文将深入解析MyBatis核心配置体系,涵盖核心配置文件(XML)结构解析、多环境配置策略、类型别名定义规范、属性注入机制及映射器加载方式等核心配置,助您全面掌握MyBatis的配置精髓与最佳实践。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482
一、XML配置
- MyBatis 的 XML 配置文件 是框架的「核心说明书」,它就像一个指挥中心。
- 告诉 MyBatis 如何连接数据库、如何处理数据映射、如何运行等关键信息。
1. XML 配置文件是什么?
-
本质:一个名为
mybatis-config.xml
的文件(通常放在项目的资源目录下,如src/main/resources
),用 XML 格式编写,定义 MyBatis 的全局规则。
-
作用:
- 配置数据库连接信息(如用户名、密码、驱动)。
- 设置 MyBatis 的运行参数(如日志、驼峰命名映射)。
- 注册 SQL 映射文件(
.xml
文件,存放具体的 SQL 语句)。 - 简化类型引用(给 Java 类起别名,避免写全类名)。
2. XML 配置文件的核心结构
XML 配置文件的根标签是 <configuration>
,里面包含多个子标签,每个子标签负责不同的功能。以下是最常用的 5 大模块
3. properties:外部属性配置
- 作用:读取外部配置文件(如
jdbc.properties
),避免硬编码数据库连接参数。 - 场景:多人协作或不同环境(开发/测试/生产)需要切换数据库时,非常有用。
- 例子:
对应的<properties resource="jdbc.properties" />
jdbc.properties
文件内容:jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/2023se3 jdbc.username=root jdbc.password=123456
4. settings:MyBatis 全局设置(重要)
- 作用:调整 MyBatis 的运行行为,比如开启日志、自动映射驼峰命名等。
- 常用配置:
设置项 说明 logImpl
日志实现(如 LOG4J
、STDOUT_LOGGING
控制台输出日志)mapUnderscoreToCamelCase
开启驼峰命名映射(数据库字段 user_name
自动映射到 Java 属性userName
) - 例子:
<settings><setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 控制台打印日志 --><setting name="mapUnderscoreToCamelCase" value="true" /> <!-- 开启驼峰映射 --> </settings>
5. environments:数据库环境配置(必须)
- 作用:配置数据库连接信息,可定义多个环境(如开发环境用 MySQL,生产环境用 Oracle)。
- 核心子标签:
<environment>
:定义一个具体环境,需指定id
(如development
)。<transactionManager>
:事务管理器(一般用JDBC
或MANAGED
)。<dataSource>
:数据源(连接池配置,常用POOLED
连接池)。
- 例子:配置一个 MySQL 开发环境:
<!-- 数据库环境配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/2023se3"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>
6. typeAliases:类型别名(简化代码)
- 作用:给 Java 类起一个简短的别名,避免写全类名(如
com.example.User
别名user
)。 - 两种方式:
- 单个别名:
<typeAlias type="com.example.User" alias="user" />
- 批量扫描包(推荐):自动为包下所有类生成小写首字母的别名(如
User
别名user
)。<package name="com.example.entity" /> <!-- 扫描实体类包 -->
- 单个别名:
7. mappers:注册 SQL 映射文件(必须)
- 作用:告诉 MyBatis 去哪里找写好的 SQL 语句(通常放在
.xml
文件中)。 - 三种注册方式:
- 指定单个文件路径:
<mapper resource="mappers/UserMapper.xml" /> <!-- resource 指向类路径下的文件 -->
- 扫描包路径(推荐):自动注册包下所有
.xml
文件。<package name="com.example.mapper" /> <!-- 假设映射文件和接口在同包下 -->
- 绑定接口(需映射文件名与接口名一致且在同路径):
<mapper class="com.example.mapper.UserMapper" />
- 指定单个文件路径:
8. 一个完整的 XML 配置文件示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 数据库环境配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/2023se3"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 注册Mapper映射文件 --><mappers><mapper resource="mapper/EmpMapper.xml"/><mapper resource="mapper/TeacherMapper.xml"/></mappers></configuration>
二、环境配置
1、为什么需要环境配置?
MyBatis 的 环境配置 就像给数据库准备了多个「场景」:
- 开发环境(development):连接本地测试数据库,配置简单、方便调试;
- 测试环境(test):连接专门的测试数据库,数据隔离、不影响真实数据;
- 生产环境(production):连接线上数据库,配置更严格(如加密密码、连接池优化)。
核心目的:一套代码适配不同场景,通过配置切换环境,避免硬编码改代码
2. 两个 environment 中 id=“development” 与 id=“test” 的区别
- 首先我们看一个例子
<environments default="development"><!-- 环境 1:开发环境 --><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="驱动"/><property name="url" value="开发库地址"/><property name="username" value="开发账号"/><property name="password" value="开发密码"/></dataSource></environment><!-- 环境 2:测试环境 --><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="驱动"/><property name="url" value="测试库地址"/> <!-- 重点区别! --><property name="username" value="测试账号"/> <!-- 可能不同 --><property name="password" value="测试密码"/> <!-- 可能不同 --></dataSource></environment>
</environments>
1. 表面区别:id 不同,代表不同场景
id="development"
:开发环境,给程序员本地调试用;id="test"
:测试环境,给测试人员做功能测试用。
2. 实际区别:数据库连接参数不同
id="development" 与 id="test"
虽然例子里的参数看起来一样,但 真实场景中两者会有差异:
-
开发环境:
- URL:连本地数据库(如
jdbc:mysql://localhost:3306/dev_db
); - 账号密码:用简单的(如
root/123456
),方便本地快速连接; - 连接池(POOLED):可能配置较小的连接数,避免本地资源占用。
- URL:连本地数据库(如
-
测试环境:
- URL:连公司测试服务器的数据库(如
jdbc:mysql://test-server:3306/test_db
); - 账号密码:用专门的测试账号(权限更低,避免误操作删库);
- 连接池:可能配置中等连接数,模拟部分生产压力。
- URL:连公司测试服务器的数据库(如
3. 为什么要这样写?
3.1 切换方便
通过 <environments default="development">
指定默认环境:
- 开发时用
development
,测试时只需改一行代码:
无需修改具体的数据库参数,更安全!<environments default="test"> <!-- 改成 test -->
3.2 隔离数据,避免误操作
- 开发环境:可以随意增删改测试数据,甚至「清空表」debug;
- 测试环境:用独立的数据库,数据和生产隔离,避免影响用户真实数据
3.3 优化配置,适配不同性能需求
- 开发环境:不需要太高效,方便调试最重要;
- 生产环境:可能用
UNPOOLED
(非连接池,简单直接)或JNDI
(企业级配置),根据服务器性能优化参数。
3. 环境配置中其他概念
1. transactionManager
<transactionManager>
:事务管理方式type="JDBC"
:用 JDBC 原生的事务(commit()
/rollback()
),由 MyBatis 控制;- 另一种常见值:
type="MANAGED"
,适用于容器管理事务(如 Tomcat),MyBatis 不主动提交,由容器决定。
2. dataSource
<dataSource>
:数据库连接池type="POOLED"
:使用 MyBatis 自带的连接池(推荐):- 提前创建一定数量的数据库连接,放在「池」里重复使用,避免频繁创建连接的开销;
- 就像餐厅提前准备好餐具,顾客来了直接用,不用现洗。
- 其他值:
UNPOOLED
:不使用连接池,每次都新建连接(适合简单场景);JNDI
:从服务器(如 Spring)获取连接池配置(企业级用法)。
三、类型别名
1. 为什么需要类型别名?
假设你有个 Java 类叫 com.niit.pojo.Emp
(员工类),全类名很长。在 MyBatis 的 SQL 映射文件中,每次写 resultType
都要写完整路径:
<select id="selectAllEmps" resultType="com.niit.pojo.Emp">select * from emp;
</select>
问题:全类名又长又容易写错,太麻烦!
类型别名的作用:给类起一个简短的「外号」,比如把 com.niit.pojo.Emp
别名成 Emp
,这样写代码时只用写 Emp
,这样就不容易出错了
2. 类型别名的第一种方法
1. 怎么写?
- 在名为
mybatis-config.xml
的文件里面添加以下代码 - 必须写在
<configuration>
的下面一行,不然会报错
<typeAliases><!-- type:原类的全路径,alias:自定义别名 --><typeAlias type="com.niit.pojo.Emp" alias="Emp" /><typeAlias type="com.niit.pojo.Dept" alias="Dept" />
</typeAliases>
实际效果
配置后,SQL 映射文件中可以直接用别名:
<select id="selectAllEmps" resultType="Emp"> <!-- 这里只用写别名 -->select * from emp;
</select>
3. 类型别名的第二种方法(推荐,适合大量类)
怎么写?
<typeAliases><!-- 扫描包路径,自动为包下所有类生成别名 --><package name="com.niit.pojo" />
</typeAliases>
自动生成规则是什么?
- 默认规则:类名首字母小写作为别名。
- 例如:
- 类
Emp
→ 别名emp
; - 类
Department
→ 别名department
。
- 类
- 例如:
- 注意:如果类名是驼峰命名(如
UserInfo
),别名还是首字母小写(userInfo
)。
实际效果
假设 com.niit.pojo
包下有 Emp
类,扫描后无需手动配置,直接用别名 emp
:
<select id="selectAllEmps" resultType="emp"> <!-- 自动生成的别名是 emp -->select * from emp;
</select>
四、映射器
1.什么是映射器?
假设你写了一堆 SQL 语句,放在一个个 .xml
文件里(比如 UserMapper.xml
)
核心问题:MyBatis 不知道这些SQL语句放在哪里,需要你告诉它位置
映射器配置(<mappers>
):就是告诉 MyBatis 「SQL 语句的 XML 文件放在哪」的过程。
2. 映射器的 3 种方式
方式一:指定单个文件路径
-
怎么用?
直接告诉 MyBatis 某个具体文件的路径
<mappers><mapper resource="mapper/EmpMapper.xml"/><mapper resource="mapper/TeacherMapper.xml"/></mappers>
-
适合场景:项目刚开始,只有少量 SQL 映射文件时使用。
方式二:扫描包路径(推荐)
-
怎么用?
告诉 MyBatis:「去扫描这个包下的所有.xml
文件」
<mappers><!-- 扫描包路径,自动注册该包下所有 .xml 文件 --><package name="com.niit.mapper" /> </mappers>
-
前提条件:
- 你的 SQL 映射文件必须和对应的 Mapper 接口放在 同一个包下,且 文件名相同。
- 例如:
- 接口
EmpMapper.java
放在com.niit.mapper
包下; - 映射文件
EmpMapper.xml
也放在com.niit.mapper
包下(或类路径下的同包路径,如resources/mappers/
)。
- 接口
- 例如:
- 你的 SQL 映射文件必须和对应的 Mapper 接口放在 同一个包下,且 文件名相同。
-
优点:一行代码搞定所有映射文件,无需逐个配置,适合中大型项目。
方式三:绑定接口(强烈推荐)
-
怎么用?
直接告诉 MyBatis:「根据这个接口,找到对应的映射文件」<mappers><!-- class:指定 Mapper 接口的全路径,映射文件名需与接口名一致且在同路径 --><mapper class="com.niit.mapper.EmpMapper" /> </mappers>
-
前提条件:
- 映射文件名必须和接口名 完全一致,且放在 同一路径下。
- 例如:
- 接口
EmprMapper.java
在com.niit.mapper
包下; - 映射文件
EmpMapper.xml
必须也在com.niit.mapper
包下(或类路径对应的包,如resources/com/niit/mapper/
)。
- 接口
- 例如:
- 映射文件名必须和接口名 完全一致,且放在 同一路径下。
-
优点:最简洁的方式,尤其适合使用 IDE 开发时,自动生成文件路径,减少手动输入错误。
以上就是这篇博客的全部内容,下一篇我们将继续探索MyBatis的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |