【MyBatis】MyBatis框架知识(全体系总结)

简介: MyBatis 是一款轻量级持久层框架,支持SQL与代码分离、动态SQL、灵活映射及一二级缓存。本文系统讲解其核心组件、配置文件、Mapper映射、CRUD、缓存机制、插件扩展(如PageHelper、MyBatis-Plus)及最佳实践,助你高效掌握ORM开发。

前言

一、MyBatis 概述

1. 定义与定位

MyBatis 是一款优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射。
● 它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索工作。
● 核心思想:将 SQL 语句与 Java 代码分离,通过 XML 或注解进行配置和映射。

2. 核心特点

● SQL 与代码分离:SQL 写在 XML 文件中,便于维护和优化。
● 灵活的参数映射:支持多种参数传递方式(#{}、${})。
● 强大的结果映射:支持自动映射和手动映射(resultMap),可处理复杂的关联关系。
● 动态 SQL:提供动态 SQL 标签,灵活拼接 SQL 语句。
● 缓存机制:内置一级缓存和二级缓存,提升查询性能。

3. 与 JDBC、Hibernate 的对比

对比图

二、MyBatis 核心组件

1. SqlSessionFactoryBuilder

● 作用:负责构建 SqlSessionFactory,通过读取配置文件或代码配置创建。
● 生命周期:方法级,用完即丢弃。

2. SqlSessionFactory

● 作用:创建 SqlSession 的工厂,是 MyBatis 的核心对象。
● 生命周期:应用级,整个应用运行期间只创建一次(单例模式)。

3. SqlSession

● 作用:执行 SQL、管理事务、获取 Mapper 接口的代理对象。
● 生命周期:请求/会话级,每次请求创建,用完关闭。
● 核心方法:selectOne()、selectList()、insert()、update()、delete()、commit()、rollback()。

4. Mapper 接口与 Mapper 代理

● Mapper 接口:定义数据库操作方法,无需实现类。
● Mapper 代理:MyBatis 动态生成 Mapper 接口的代理对象,负责调用 SQL 语句。
● 绑定方式:通过 XML 映射文件或注解绑定 SQL。

三、MyBatis 配置文件(mybatis-config.xml)

1. 顶层结构

<?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>
    <!-- 配置项顺序:properties -> settings -> typeAliases -> typeHandlers -> environments -> mappers -->
</configuration>

2. 核心配置项详解

properties:引入外部属性文件(如 db.properties),用于配置数据库连接信息。


settings:全局配置项,影响 MyBatis 运行行为。
配置项 作用 示例值
cacheEnabled 开启二级缓存 true
lazyLoadingEnabled 开启延迟加载 true
mapUnderscoreToCamelCase 自动下划线转驼峰命名 true
typeAliases:为 Java 类型设置别名,简化映射文件中的类型引用。

<typeAliases>
    <typeAlias type="com.example.User" alias="User"/>
    <package name="com.example"/> <!-- 扫描包,自动设置别名(类名首字母小写) -->
</typeAliases>

environments:配置数据库环境,支持多环境切换。

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/> <!-- 事务管理器 -->
        <dataSource type="POOLED"> <!-- 数据源类型:UNPOOLED、POOLED、JNDI -->
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>

mappers:注册映射文件或 Mapper 接口。

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/> <!-- 资源路径 -->
    <mapper class="com.example.mapper.UserMapper"/> <!-- 接口类路径 -->
    <package name="com.example.mapper"/> <!-- 扫描包 -->
</mappers>

四、MyBatis 映射文件(Mapper.xml)

1. 映射文件结构

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <!-- SQL 语句定义 -->
</mapper>

2. 核心 SQL 元素

select、insert、update、delete:定义 CRUD 操作。

<select id="selectUserById" parameterType="int" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>

参数传递
#{} :预编译参数,防止 SQL 注入,推荐使用。
${}:字符串替换,存在 SQL 注入风险,仅用于动态表名、列名等场景。
结果映射
resultType:自动映射,要求数据库列名与 Java 属性名一致(或开启下划线转驼峰)。
resultMap:手动映射,处理复杂结果集和关联关系。

<resultMap id="UserResultMap" type="User">
    <id property="id" column="user_id"/> <!-- 主键映射 -->
    <result property="name" column="user_name"/> <!-- 普通属性映射 -->
    <!-- 一对一关联 -->
    <association property="dept" javaType="Dept">
        <id property="id" column="dept_id"/>
        <result property="name" column="dept_name"/>
    </association>
    <!-- 一对多关联 -->
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="amount" column="order_amount"/>
    </collection>
</resultMap>

3. 动态 SQL

if:条件判断。

<select id="selectUsers" parameterType="User" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="age != null">AND age = #{age}</if>
    </where>
</select>

choose、when、otherwise:多条件分支(类似 switch-case)。
trim、where、set:辅助拼接 SQL,处理多余的 AND、逗号等。
foreach:遍历集合,用于 IN 查询或批量插入。

<select id="selectUsersByIds" parameterType="list" resultType="User">
    SELECT * FROM user WHERE id IN
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

bind:绑定变量,防止 SQL 注入或简化表达式。

五、MyBatis 核心功能

1. CRUD 操作

● 通过 Mapper 接口调用方法,或直接使用 SqlSession 执行 SQL。

2. 参数处理

单个参数:直接传递,可使用任意名称。
多个参数:使用 @Param 注解命名,或通过索引(arg0、arg1)访问。
User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age);
对象参数:直接传递 Java 对象,属性名对应参数名。
Map 参数:传递 Map 集合,key 对应参数名。

3. 结果映射

自动映射:列名与属性名一致时自动映射。
手动映射:使用 resultMap 处理复杂映射、关联关系。
关联映射
○ 一对一:使用 。
○ 一对多:使用 。

4. 缓存机制

一级缓存(SqlSession 级别)
○ 默认开启,同一 SqlSession 内相同查询直接返回缓存结果。
○ 失效场景:SqlSession 关闭、执行增删改操作、手动清空缓存。
二级缓存(Mapper 级别)
○ 需手动开启,多个 SqlSession 共享同一 Mapper 的缓存。
○ 配置步骤:
ⅰ. 在 mybatis-config.xml 中开启:。
ⅱ. 在 Mapper.xml 中添加:。
○ 注意:实体类需实现 Serializable 接口。

六、MyBatis 高级特性

1. 插件开发

● 原理:通过 Interceptor 拦截 MyBatis 核心方法(Executor、ParameterHandler、ResultSetHandler、StatementHandler)。
● 自定义插件步骤:
a. 实现 Interceptor 接口。
b. 使用 @Intercepts 注解指定拦截方法。
c. 在 mybatis-config.xml 中注册插件。

2. 分页插件(PageHelper)

● 使用步骤:
a. 引入 PageHelper 依赖。
b. 在 mybatis-config.xml 中配置插件。
c. 代码中调用:PageHelper.startPage(pageNum, pageSize);。

3. 逆向工程(MyBatis Generator)

● 作用:根据数据库表自动生成实体类、Mapper 接口、Mapper.xml 文件。
● 配置:编写 generatorConfig.xml,指定数据库连接、表名、生成路径等。

4. 与 Spring/Spring Boot 整合

Spring 整合
○ 配置 SqlSessionFactoryBean、MapperScannerConfigurer。
Spring Boot 整合
○ 引入 mybatis-spring-boot-starter 依赖。
○ 在 application.yml 中配置数据源、MyBatis 配置文件路径等。

七、MyBatis-Plus(扩展)

1. 概述

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 基础上只做增强不做改变,简化开发、提高效率。

2. 核心功能

BaseMapper:内置通用 CRUD 方法,无需编写 XML。
条件构造器(Wrapper):灵活构建查询条件(如 QueryWrapper、UpdateWrapper)。
分页插件:内置分页功能,无需额外配置。
代码生成器:一键生成实体类、Mapper、Service、Controller 代码。

八、最佳实践与常见问题

1. Mapper 接口开发规范

● Mapper 接口名与 Mapper.xml 文件名一致,且在同一包下。
● Mapper 接口方法名与 Mapper.xml 中 SQL 元素的 id 一致。
● 避免在 Mapper 接口中定义重载方法(MyBatis 无法区分)。

2. SQL 优化建议

● 避免使用 SELECT *,只查询需要的列。
● 合理使用索引,避免全表扫描。
● 批量操作使用 foreach 或批量插入 API。
● 避免在 SQL 中进行复杂计算,尽量在 Java 代码中处理。

3. 缓存使用注意事项

● 一级缓存默认开启,但在多 SqlSession 环境下可能导致数据不一致。
● 二级缓存需谨慎使用,避免缓存脏数据,建议在查询多、修改少的场景下使用。

4. 常见问题排查

● SQL 注入:避免使用 ${},尽量使用 #{} 。
● 参数绑定失败:检查参数名与 SQL 中占位符是否一致,或使用 @Param 注解。
● 结果映射失败:检查列名与属性名是否匹配,或使用 resultMap 手动映射。

相关文章
|
22天前
|
JSON Java Maven
【Maven】pom.xml 超全面详解(核心结构+所有常用依赖)
本文详解Maven核心配置文件pom.xml的七大结构(坐标、属性、依赖、构建等),并分类梳理Web、数据库、工具、测试、日志、JSON等场景下最常用依赖的功能与用法,助开发者高效管理项目依赖与构建流程。
|
16天前
|
存储 缓存 安全
【HashMap】HashMap 系统性知识体系全解(附《HashMap 面试八股文精简版》)
本文以JDK8为核心,对比JDK7差异,从基础认知、底层结构(数组+链表+红黑树)、哈希函数、扩容机制、线程安全、最佳实践及面试考点七大维度,系统解析HashMap原理与应用,助你构建完整知识体系。
|
SQL XML Java
一文搞懂Mybatis执行原理
一文搞懂Mybatis执行原理
531 1
|
22天前
|
人工智能 API iOS开发
OpenClaw(Clawdbot)解析:OpenClaw是什么、能做什么?保姆级部署步骤(阿里云+本地)+ 免费多模型API配置+常见问题解答
在AI技术飞速迭代的2026年,“能说会道”的对话式AI已不再新鲜,而能“落地干活”的自动化AI代理成为新的核心需求。OpenClaw(前身为Clawdbot、Moltbot,俗称“龙虾AI”)作为开源本地AI智能体的领军者,凭借“本地优先、强执行能力、多端适配”的核心优势,快速崛起为个人与企业构建专属“数字员工”的首选工具。截至2026年3月,其GitHub星标数已突破24.7万,社区贡献者超300人,技能生态覆盖办公、开发、生活等全场景,真正实现了从“对话建议”到“自动化执行”的跨越,被用户亲切称为“真正干活的AI”,用户群体也自嘲为“养虾人”“甲壳教徒”,项目口号更是直白点出其核心价值—
1614 6
|
16天前
|
SQL Java 数据库
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
本文详解Spring Boot集成MyBatis-Plus全流程:从依赖引入、数据源配置、Mapper扫描到分页/乐观锁/逻辑删除等核心插件配置;涵盖BaseMapper基础CRUD、LambdaQueryWrapper条件查询、Service层封装、自定义XML多表关联及批量优化实践,附完整可运行示例。
|
SQL 缓存 JSON
vue利用级联选择器实现全国省市区乡村五级菜单联动
vue利用级联选择器实现全国省市区乡村五级菜单联动
|
22天前
|
人工智能 安全 开发工具
新手入门AI研发框架:5个实操技巧快速上手
作为一名常年泡在研发一线的开发者,从最初的纯手工敲代码,到后来借助各类AI能力辅助编程,总觉得多数AI应用只解决了“代码补全”的单点问题,团队协作中环境配置、多任务并行、代码审查这些效率卡点依然存在。直到接触到AI驱动的全流程研发框架,才发现它真正跳出了“单一AI应用”的局限,把研发全流程的效率卡点逐一打通。这段时间的实操下来,从单人开发到团队协作,踩过坑也摸透了实用技巧,今天就和大家聊聊这类研发框架的实际使用心得,以及几个落地性极强的实战案例。
|
22天前
|
人工智能 Linux API
喂饭级教程:OpenClaw(大龙虾)云端/本地部署+五大应用场景+配置阿里云百炼Coding Plan及常见问题解答
2026年,开源AI智能体OpenClaw(曾用名ClawdBot、MoltBot,因Logo酷似小龙虾被网友亲切称为“大龙虾”)以“行动式AI”的鲜明定位爆红全网。它打破了传统“对话式AI”仅能答疑的局限,通过极简的Pi引擎架构与丰富的Skills生态,让非技术用户也能轻松拥有7×24小时运行的“个人AI员工”,覆盖个人办公、企业协作、开发运维、生活效率、创新应用五大核心场景。
1117 5
|
22天前
|
存储 IDE Java
【Maven】如何创建/导入Maven项目?手把手教学(包括下载/安装/创建/配置)
Maven是Java项目管理与构建工具,核心功能包括:依赖管理(自动下载jar包、解决版本冲突)、标准化构建(编译、测试、打包、部署)和统一项目结构(跨IDE兼容)。通过pom.xml配置,结合中央仓库与阿里云镜像,大幅提升开发效率。
|
22天前
|
人工智能 Linux API
2026年OpenClaw(阿里云+Windows/Mac/Linux)保姆级部署步骤+ 免费大模型配置指南
2026年,AI领域的核心变革已从“生成内容”转向“落地执行”——OpenClaw(前身为Clawdbot/Moltbot)作为开源AI自动化代理引擎的领军者,凭借“本地优先、强执行能力、多端适配”的核心优势,成为个人与企业构建“自托管式数字员工”的首选工具。截至2026年3月,其GitHub星标已突破28万,社区贡献者超378人,技能生态覆盖办公、开发、生活等全场景,真正实现了从“对话式建议”到“自动化执行”的跨越。
603 6