MyBatis实战指南(三)MyBatis常用配置详解(XML配置,环境配置,类型别名,属性与映射器)

发布于:2025-05-25 ⋅ 阅读:(31) ⋅ 点赞:(0)


前言

  • 在之前的博客中,我们已介绍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 日志实现(如 LOG4JSTDOUT_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>:事务管理器(一般用 JDBCMANAGED)。
    • <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 configuration
        PUBLIC "-//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:连公司测试服务器的数据库(如 jdbc:mysql://test-server:3306/test_db);
    • 账号密码:用专门的测试账号(权限更低,避免误操作删库);
    • 连接池:可能配置中等连接数,模拟部分生产压力。

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/)。
  • 优点:一行代码搞定所有映射文件,无需逐个配置,适合中大型项目。

方式三:绑定接口(强烈推荐)

  • 怎么用?
    直接告诉 MyBatis:「根据这个接口,找到对应的映射文件」

    <mappers>
      <!-- class:指定 Mapper 接口的全路径,映射文件名需与接口名一致且在同路径 -->
      <mapper class="com.niit.mapper.EmpMapper" />
    </mappers>
    

    在这里插入图片描述

  • 前提条件

    • 映射文件名必须和接口名 完全一致,且放在 同一路径下
      • 例如:
        • 接口 EmprMapper.javacom.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

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到