7篇文章学会MyBatis——第一篇:部署及基本概念

在Java后端开发中,数据库交互是核心必备能力,而MyBatis是目前企业使用最广泛、性价比最高的半自动ORM持久层框架。

它完美弥补了原生JDBC和全自动框架Hibernate的短板,三者核心对比:

  • 原生JDBC:代码极度繁琐、SQL硬编码、手动处理结果集与事务、冗余代码多

  • Hibernate(全自动ORM):无需手写SQL,但SQL不可控、复杂查询性能差、灵活性极低

  • MyBatis(半自动ORM)SQL可控、代码与SQL解耦、轻量高效、适配所有业务场景

一、适配环境版本

  • JDK:1.8

  • MySQL:5.7 / 8.0

  • Maven:3.6+

  • MyBatis:3.5.16

  • 数据库驱动:mysql-connector-java 8.0.33

二、MyBatis核心底层原理

3.1 原生JDBC开发痛点(为什么要用MyBatis?)面试题

原生JDBC是最基础的数据库交互方式,但存在大量致命问题,完全不适合企业开发:

  1. 资源严重浪费:每次数据库操作都需要手动创建、关闭连接,频繁IO交互,性能损耗极大。

  2. 代码高度耦合:SQL语句直接硬编码在Java代码中,修改SQL必须改动Java代码,维护成本极高。

  3. 冗余代码过多:需要手动处理参数赋值、结果集封装、资源释放,重复代码量大。

  4. 事务操作繁琐:事务提交、回滚、异常捕获全部需要手动编码,极易出错。

3.2 MyBatis核心解决方案

MyBatis针对性解决了JDBC的所有痛点,核心优势如下:

  1. 内置连接池管理:自动复用数据库连接,避免频繁创建销毁,大幅提升性能。

  2. SQL与代码完全解耦:SQL统一编写在XML/注解中,修改SQL无需改动Java业务代码。

  3. 自动结果集映射:无需手动封装ResultSet,自动将数据库数据映射为Java实体对象。

  4. 简化事务管理:封装事务提交、回滚逻辑,支持自动/手动事务,降低开发难度。

  5. 半自动ORM特性:实体与数据表手动映射,开发者完全掌控SQL,适配复杂业务查询。

3.3 MyBatis完整执行流程(面试必考)

MyBatis 核心执行流程

复制代码
SqlSessionFactoryBuilder 解析配置

加载 mybatis-config.xml 全局配置文件
解析 XML 构建 Configuration 配置对象
创建全局唯一的 SqlSessionFactory 实例
SqlSessionFactory 生产会话

通过 openSession() 方法创建 SqlSession
支持事务隔离级别、执行器类型等参数配置
每个 SqlSession 对应一次数据库会话
SqlSession 操作执行

方式一:getMapper() 获取接口代理对象
方式二:直接调用 select/insert/update 方法
底层通过 Executor 执行器处理 SQL
JDBC 交互层

通过 StatementHandler 创建 PreparedStatement
自动处理参数绑定(ParameterHandler)
结果集转换(ResultSetHandler)
资源释放阶段

自动/手动调用 close() 释放连接
将连接归还连接池
清理一级缓存作用域

关键对象职责说明

关键对象职责说明表格

对象名称 职责描述
Configuration 存储所有映射器、类型处理器等配置,作为 MyBatis 运行时的核心配置容器
Executor 执行 SQL 的核心接口,包含 Base/Reuse/Batch 三种实现,管理一级缓存和事务
MapperProxy 动态代理生成的接口实现类,将方法调用转为 SqlSession 操作,方法签名与映射文件严格匹配

四、Maven依赖配置

在项目 pom.xml 文件中导入全套依赖,包含MyBatis核心、数据库驱动、日志框架、单元测试,每个依赖均标注核心作用,适配上述环境版本。

以下是转换后的代码格式(Markdown代码块形式):

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mybatis</groupId>
    <artifactId>mybatis-study</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <dependencies>
        <!-- MyBatis核心依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.16</version>
        </dependency>

        <!-- MySQL8.0数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
            <scope>runtime</scope>
        </dependency>

        <!-- 日志核心依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
        </dependency>

        <!-- JUnit5单元测试 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

关键组件说明

  • MyBatis核心:3.5.16版本提供ORM框架功能
  • MySQL驱动:8.0.33版本支持JDBC连接
  • 日志系统:SLF4J接口+Simple实现组合
  • 测试框架:JUnit5用于单元测试

依赖细节详解

  • mybatis:框架核心依赖,提供配置解析、SQL执行、结果映射、事务管理所有核心能力。

  • mysql-connector-javaruntime作用域,仅项目运行时生效,编译阶段无需加载,优化项目编译效率。

  • slf4j:日志框架,MyBatis无自带日志组件,必须导入,否则无法查看执行的SQL语句,难以调试排错。

  • junit:单元测试框架,快速验证MyBatis数据库操作是否正常执行。

三、企业标准项目结构

遵循企业开发规范搭建目录结构,结构清晰、职责分明,所有MyBatis项目均可通用:

mybatis-study

└── src

├── main

│ ├── java

│ │ └── com

│ │  └── mybatis

│ │   ├── pojo

│ │   │ └── User.java

│ │   ├── mapper

│ │   ├── util

│ │   │ └── MyBatisUtil.java

│ │   └── test

│ └── resources

│  ├── mybatis-config.xml

│  ├── UserMapper.xml

│  └── logback.xml

└── test

功能说明

以下是整理后的POJO与数据库映射开发规范表格,按模块分类说明核心文件作用及关联关系:

模块类型 文件示例 核心职责 关联文件
POJO实体类 User.java 定义与数据库表字段对应的属性(如id、username),需包含Getter/Setter方法 UserMapper.xml / UserMapper.java
Mapper接口 UserMapper.java 声明数据库操作方法(如insertUser),通过@Select等注解或XML实现SQL绑定 UserMapper.xml
工具类 MyBatisUtil.java 封装SqlSessionFactory创建逻辑,提供线程安全的SqlSession获取与关闭方法 mybatis-config.xml
MyBatis配置 mybatis-config.xml 配置数据源(DataSource)、事务管理器(TransactionManager)、别名扫描路径等全局参数
SQL映射文件 UserMapper.xml 编写动态SQL(如<select id="selectUser">),通过namespace绑定Mapper接口 UserMapper.java
日志配置 logback.xml 设置MyBatis日志级别(如DEBUG显示SQL语句),输出到控制台或文件
单元测试 UserMapperTest.java 使用JUnit测试Mapper方法,验证SQL执行结果是否符合预期 UserMapper.java

关键映射关系说明

  • POJO与表字段 :User.java的private String username对应数据库表的username字段,需确保命名一致(或通过@Column注解显式映射)。
  • Mapper与XML :UserMapper.java的List<User> selectAll()方法,需在UserMapper.xml中定义对应的<select id="selectAll">SQL语句。
  • 工具类调用链:测试类通过MyBatisUtil获取SqlSession → 调用Mapper接口方法 → 执行XML中SQL → 返回POJO实体对象。

四、数据库初始化(测试数据准备)

提前创建数据库、数据表并插入测试数据,为后续CRUD实操提供数据支撑,直接复制SQL执行即可。

4.1 创建数据库

复制代码
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; USE mybatis_test;

4.2 创建用户表 + 初始化测试数据

SQL 表创建与数据插入示例:以下是一个 MySQL 表的创建语句和对应的数据插入操作。

表结构定义

sql 复制代码
CREATE TABLE t_user(
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',
    username VARCHAR(20) NOT NULL COMMENT '用户名',
    password VARCHAR(20) NOT NULL COMMENT '密码',
    age INT COMMENT '年龄',
    email VARCHAR(50) COMMENT '邮箱'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据插入操作

sql 复制代码
INSERT INTO t_user(username,password,age,email) 
VALUES 
    ('张三','123456',20,'zs@163.com'),
    ('李四','654321',22,'ls@qq.com');

小技巧:实体类属性名尽量与数据库字段名保持一致,可省略手动映射配置。

五、MyBatis全局核心配置文件

mybatis-config.xml 是MyBatis项目的总配置入口 ,负责数据库连接、多环境配置、日志开启、映射文件注册等全局核心功能,必须放置在 resources 根目录。

⚠️ 重磅注意 :配置文件标签有固定顺序,顺序错乱会直接启动报错!优先级:properties → settings → typeAliases → environments → mappers

5.1 完整可运行配置代码

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>
  <settings>
    <setting name="logImpl" value="SLF4J"/>
  </settings>
  
  <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/mybatis_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="你的数据库密码"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

5.2 细节解析

  1. DTD约束:固定模板,用于校验XML语法合法性,禁止修改、删除。

  2. settings全局配置:MyBatis全局功能开关,可开启日志、驼峰命名、二级缓存等核心功能。

  3. environments多环境:可配置多套数据库环境,通过default属性一键切换,适配开发、测试、生产场景。

  4. transactionManager事务管理器

    1. JDBC:使用原生JDBC事务,手动控制提交、回滚(独立MyBatis项目使用)

    2. MANAGED:交由Spring容器管理事务(框架整合场景使用)

  5. dataSource数据源类型

    1. POOLED:内置数据库连接池,复用连接、性能高,开发首选

    2. UNPOOLED:无连接池,每次操作新建连接,仅用于简单测试

    3. JNDI:服务器容器连接池,用于企业生产环境

  6. URL关键参数

    1. serverTimezone=Asia/Shanghai:解决MySQL8.0时区异常报错

    2. &:XML文件中&符号必须转义,否则语法报错

  7. mappers映射注册:告知MyBatisSQL映射文件的位置,必须注册否则无法执行SQL。

六、MyBatis四大核心对象 & 生命周期

四大核心对象是MyBatis底层运行的核心支撑,生命周期是高频面试题,必须精准记忆:

6.1 SqlSessionFactoryBuilder(配置构建器)

  • 核心作用:读取全局配置文件、解析配置信息,构建SqlSessionFactory工厂对象。

  • 生命周期方法级,仅创建工厂时使用,用完即销毁,无需全局保存。

6.2 SqlSessionFactory(会话工厂)

  • 核心作用:生产数据库会话SqlSession对象,是全局核心工厂。

  • 生命周期应用级(全局单例),项目启动创建、项目关闭销毁。

  • 核心特点:线程安全,全局仅需一个实例,重复创建会造成资源浪费。

6.3 SqlSession(数据库会话)

  • 核心作用 :执行SQL语句、管理事务、获取Mapper代理对象、完成数据库交互。

  • 生命周期请求/方法级,单次数据库操作有效,用完必须关闭释放资源。

  • 核心特点线程不安全,多线程环境下禁止共享,否则会出现数据错乱。

  • 两种创建方式

    • openSession():默认关闭自动提交,增删改操作需手动commit

    • openSession(true):开启自动提交,无需手动处理事务

8.4 Mapper(映射器代理对象)

  • 核心作用 :绑定XML中自定义SQL语句,通过接口方法调用即可执行数据库操作。

  • 生命周期:与SqlSession绑定,会话销毁,代理对象随之失效。

七、本课核心知识点总结

  1. MyBatis定位:轻量级半自动ORM持久层框架,SQL可控、代码解耦、性能优异。

  2. 核心执行流程:配置文件解析 → 构建会话工厂 → 创建数据库会话 → 执行SQL → 结果映射 → 释放资源。

  3. 生命周期优先级:SqlSessionFactory(应用级) > SqlSession(请求级) > 构建器(方法级)。

  4. 核心配置要点:标签顺序固定、URL需适配MySQL8.0、开发首选POOLED连接池。

  5. 事务区别:自动提交适合查询,手动提交适合增删改,保障数据一致性。

相关推荐
Simon5231412 小时前
mybatis执行流程、关联映射、注解开发
java·开发语言·mybatis
happymaker062615 小时前
SpringBoot学习日记——DAY05(SpringBoot整合MyBatis-plus实现增删改查)
spring boot·学习·mybatis
北风toto1 天前
通过Entity 创建数据库中的表,目前只支持mysql,A.CTable使用mybatis/mybatis-plus自动创建表
数据库·mysql·mybatis
No8g攻城狮2 天前
【异常解决】SpringBoot3 + 人大金仓 V8+MyBatis-Plus 获取新增自增 ID
数据库·mybatis·人大金仓·国产信创
ElevenS_it1882 天前
Redis监控实战:内存使用+命中率+连接数三类核心指标接入Zabbix+分级告警完整配置方案
运维·网络·redis·mybatis·zabbix
JAVA社区2 天前
Java进阶全套教程(三)—— Spring框架核心精讲
java·开发语言·spring·面试·职场和发展·mybatis
谷哥的小弟3 天前
图文详解Spring Boot整合MyBatis(附源码)
spring boot·mysql数据库·mybatis·java框架
斯特凡今天也很帅3 天前
Spring Boot+mybatis项目切换sql为传参成无参
spring boot·sql·mybatis
JAVA社区3 天前
Java进阶全套教程(一)—— 数据框架Mybatis详解
java·开发语言·面试·职场和发展·mybatis