MyBatis简明教程

news2025/2/26 7:10:06

MyBatis 是一个用于简化数据库操作的持久层框架,它的核心思想是 将 SQL 与 Java 代码解耦,让开发者专注于 SQL 的编写,同时自动处理重复的数据库操作步骤。


一、核心思想:SQL 与 Java 解耦

传统 JDBC 需要开发者手动管理数据库连接、拼接 SQL 参数、处理查询结果集,代码重复且容易出错。MyBatis 通过以下方式简化:

  1. 用 XML 或注解定义 SQL:将 SQL 语句写在配置文件中,与 Java 代码分离。
  2. 自动映射结果集:将数据库查询结果自动转为 Java 对象,无需手动解析。

二、核心组件与流程

1. 配置文件
  • 全局配置文件(如 mybatis-config.xml):配置数据库连接、事务管理、映射文件路径等。
  • 映射文件(如 UserMapper.xml):定义 SQL 语句(如 <select>, <insert>)和结果映射规则。
2. 接口与映射绑定
  • 定义一个 Java 接口(如 UserMapper),接口方法与映射文件中的 SQL 一一绑定。
  • 动态代理机制:MyBatis 自动为接口生成代理对象,调用接口方法时,实际执行对应的 SQL。
3. 执行流程

假设调用 userMapper.getUserById(1)

  1. 解析 SQL:找到 UserMapper.xml 中对应的 SQL,如 <select id="getUserById" ...>
  2. 处理参数:将参数 1 自动设置到 SQL 中(如替换 #{id})。
  3. 执行 SQL:通过 SqlSession(类似数据库连接)发送 SQL 到数据库。
  4. 结果映射:将查询结果自动转为 User 对象(根据字段名与属性名的匹配,或自定义规则)。

三、关键机制

1. 动态 SQL
  • 使用 <if>, <foreach> 等标签,根据条件动态拼接 SQL。
  • 示例:根据不同条件生成不同的查询语句。
2. 缓存机制
  • 一级缓存:默认开启,同一个 SqlSession 内的查询结果会被缓存,提高性能。
  • 二级缓存:跨 SqlSession 的缓存(需手动开启),减少数据库访问。
3. 执行器(Executor)
  • 负责执行 SQL,并封装结果。MyBatis 提供了简单执行器、重用执行器、批量执行器等,适应不同场景。

四、对比 JDBC 的优势

  • 代码简洁:无需手动管理连接、参数、结果集。
  • 灵活性高:直接编写 SQL,适合复杂查询。
  • 维护方便:SQL 集中管理,修改时无需改动 Java 代码。

五、通俗比喻

把 MyBatis 想象成一个 “智能翻译官”

  1. 你告诉它:“我要查询 id=1 的用户”(调用 getUserById(1))。
  2. 它查字典(映射文件)找到对应的 SQL。
  3. 把参数 1 翻译成数据库能理解的语言,执行查询。
  4. 最后将数据库返回的“外语结果”翻译成 Java 对象,交还给你。

六、入门案例

1. 环境搭建

首先,你需要在项目中引入 MyBatis 相关依赖。如果使用 Maven 构建项目,在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

确保你的项目已经配置好数据库驱动依赖。

2. 配置文件

创建 MyBatis 的配置文件 mybatis-config.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="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3. 创建实体类

创建与数据库表对应的 Java 实体类,例如 User 类:

public class User {
    private Integer id;
    private String name;

    // Getters and Setters
}

4. Mapper 接口和 XML 映射文件

定义一个接口,比如 UserMapper,并为其创建相应的 XML 映射文件。

UserMapper.java

public interface UserMapper {
    User selectUser(int id);
}

UserMapper.xml

<?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">
    <select id="selectUser" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

5. 使用 SqlSessionFactory

在代码中初始化 SqlSessionFactory 并获取 SqlSession 来执行操作。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(1);
    System.out.println(user.getName());
}

以上是 MyBatis 入门的一个基本流程,包括环境搭建、配置文件编写、实体类创建、Mapper 接口及映射文件的定义以及如何通过 SqlSession 执行数据库操作。

七、Mapper 接口及其对应的 XML 映射文件之间的映射

在 MyBatis 中,Mapper 接口及其对应的 XML 映射文件之间的映射是一个非常核心的概念,它允许开发者以面向接口的方式进行数据库操作。下面是关于 Mapper 接口和 XML 映射文件如何关联及映射的详细介绍:

  1. 命名空间(Namespace):XML 映射文件中的 namespace 属性必须与 Mapper 接口的全限定名完全一致。这是 MyBatis 用来将接口方法与 XML 文件中的 SQL 语句相匹配的关键。

  2. SQL 语句 ID:在 Mapper 接口中定义的方法名应该与 XML 映射文件中 <select>, <insert>, <update>, <delete> 标签的 id 属性值相同。这样 MyBatis 就能知道哪个接口方法对应于哪条 SQL 语句。

映射过程

当你调用 Mapper 接口中的一个方法时,MyBatis 执行以下步骤来找到并执行相应的 SQL 语句:

  • 解析 Mapper 接口:根据 Mapper 接口的全限定名找到对应的 XML 映射文件。
  • 查找 SQL 语句:在找到的 XML 映射文件中,通过接口方法名作为 id 查找对应的 SQL 语句。
  • 参数映射:如果接口方法有参数,则 MyBatis 会根据参数类型自动将 Java 对象转换为 JDBC 类型,并将其设置到 PreparedStatement 的参数中。
  • 执行 SQL 语句:使用由 SqlSession 创建的 PreparedStatement 来执行查询或更新操作。
  • 结果映射:从数据库获取的结果集将按照 XML 中指定的 resultTyperesultMap 转换回 Java 对象,并返回给调用者。

示例

假设有一个名为 UserMapper 的接口和一个对应的 XML 映射文件 UserMapper.xml

UserMapper.java

public interface UserMapper {
    User selectUser(int id);
}

UserMapper.xml

<?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">
    <select id="selectUser" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

在这个例子中,UserMapper 接口的全限定名是 com.example.mapper.UserMapper,这需要与 UserMapper.xml 文件中的 namespace 属性保持一致。同时,接口中的 selectUser 方法与 XML 文件中的 <select> 标签的 id 属性值相同,这意味着当调用 selectUser 方法时,MyBatis 会执行该 <select> 标签内的 SQL 语句。

这种机制使得 MyBatis 不仅易于使用,而且具有很强的灵活性和扩展性,非常适合用于构建数据驱动的应用程序。

八、各组件之间逻辑关系

在这里插入图片描述

1. 基本架构

MyBatis 主要由以下几个组件构成:

  • SqlSessionFactory:这是 MyBatis 的入口点。通过 SqlSessionFactoryBuilder 根据配置文件或配置类创建 SqlSessionFactory 实例。
  • SqlSession:代表一个与数据库执行 SQL 操作的会话。可以通过 SqlSessionFactory 获取 SqlSession 对象。
  • Mapper 接口和 XML 映射文件:Mapper 接口定义了对数据库操作的方法签名,而 XML 映射文件则提供了具体的 SQL 语句以及结果映射规则。

2. 工作流程

配置阶段
  • 读取配置:MyBatis 从 mybatis-config.xml 文件(或其他形式的配置)中读取全局配置信息,包括数据源、事务管理器等。
  • 加载映射文件:同时也会加载 Mapper 接口及其对应的 XML 映射文件,解析其中的 SQL 语句、参数映射、结果映射等内容。
运行阶段
  • 创建 SqlSessionFactory:基于配置信息,通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 实例。
  • 获取 SqlSession:通过 SqlSessionFactory 开启 SqlSession,它是 MyBatis 与数据库交互的核心对象。
  • 执行 SQL 语句:通过 SqlSession 获得 Mapper 接口的代理对象,调用其方法执行相应的 SQL 语句。
  • 处理结果集:SQL 执行后,MyBatis 会根据映射文件中的配置将结果集自动映射到 Java 对象中,并返回给调用者。
  • 提交或回滚事务:根据业务逻辑决定是否提交或回滚当前事务。
  • 关闭 SqlSession:在操作完成后,必须关闭 SqlSession 以释放资源。

3. 核心机制

  • 动态 SQL:MyBatis 支持动态生成 SQL 语句,可以根据不同的条件组合 SQL 片段,提高代码的灵活性和复用性。
  • 缓存机制:为了提高性能,MyBatis 提供了一级缓存(SqlSession 级别)和二级缓存(跨 SqlSession 共享),减少数据库访问次数。
  • 插件机制:MyBatis 允许通过插件扩展功能,比如分页、日志记录等。插件可以拦截四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的行为。

通过上述过程,MyBatis 将复杂的 JDBC 操作封装起来,提供更加简洁易用的 API 给开发者,同时也保留了足够的灵活性和控制力,使得开发者可以根据需要定制化 SQL 和结果映射逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有什么区别?Elastic 和 Splunk 数据层

作者&#xff1a;来自 Elastic Ugo Sangiorgi, Matt Wehle 了解 Elastic 和 Splunk 数据管理方法之间的主要区别&#xff0c;以便做出明智的决策&#xff0c;实现高效的数据处理 在数据管理领域&#xff0c;在讨论如何根据不同的性能要求提供和/或保留数据时&#xff0c;经常会…

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…

【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源

【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源 文章目录 [TOC](文章目录) 前言一、MCU芯片手册二、实验三、实验结论四、参考资料总结 前言 使用工具&#xff1a; 1.KEIL5编译器 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、MCU芯片…

python实战项目58:采集蜻蜓FM热门音频top排行榜

python实战项目58:采集蜻蜓FM热门音频top排行榜 一、采集流程介绍二、数据接口采集三、使用xpath提取页面数据1、抓包,找到数据接口2、发送请求,获取数据3、提取数据4、保存数据一、采集流程介绍 蜻蜓FM热门音频top排行榜的链接为: https://m.qingting.fm/rank/,首页如下图…

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是&#xff0c;小小计算电脑&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;里面包含了CPU&#xff0c;ROM&#xff0c;RAM&#xff0c;各种外设。 CPU地位最高&#xff0c;可以访问ROM和RAM&#xff0c;Flash&#xff0c;GPIO等外设&…

基于django图书信息管理系统的搭建(增删改查)

✍django项目搭建教程 ☞ ----------------- 教程 本文主要讲解django如何连接数据库MySQL并且可视化展示&#xff0c;实现增删改查功能 目录 一. 创建django应用 二. 数据库配置 三. 查看数据库 四. 编写代码 4.1视图函数 4.2 配置URL 4.3创建模板文件 4.…

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化 Kotlin 语言的许多特性&#xff0c;包括变量不可变&#xff0c;变量不可为空&#xff0c;等等。这些特性 都是为了尽可能地保证程序安全而设计的&#xff0c;但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如&#xff0c;如果你的类中存在很多…

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…

Directx上传堆和默认堆注意事项

前景 之前我用directx写上传堆上传给默认堆Index&#xff0c;但是我发现数据无法被GPU读取 void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer) {ThrowIfFiled(m_Device->CreateCommitte…

Java封装弱密码校验工具类

弱密码校验工具类 通过检查密码是否符合某些安全策略来判断其强度 ● 密码长度 ● 字符类型 ● 常见密码组合 import java.util.Arrays; import java.util.HashSet; import java.util.Set;public class WeakPasswordCheckUtil {// 常见弱密码列表&#xff08;可根据需求扩展&…

Figure自研模型Helix发布,人形机器人迈向新纪元?

Figure 公司自 2022 年成立以来&#xff0c;便在人形机器人领域崭露头角&#xff0c;成为行业内备受瞩目的新星。公司由连续创业者 Brett Adcock 创立&#xff0c;总部位于美国加利福尼亚州桑尼维尔&#xff0c;汇聚了来自波士顿动力公司、特斯拉、谷歌 DeepMind 等知名企业的顶…

vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf

实现思路 1.将Word文档转换为HTML&#xff1a;mammoth.js&#xff0c;它可以将.docx文件转换为HTML 2.将HTML转换为PDF&#xff1a;使用html2pdf.js将HTML转换为PDF 如果想要相同的效果&#xff0c;也可以把前端页面直接导出转换为pdf: 运用的插件&#xff1a;html2pdf.js 后端…

(Arrow)试时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

锂电池使用和存储电压

表格补充说明&#xff1a; 每列数据中&#xff0c;2S和3S电池的数值都是单电芯数值的2倍和3倍&#xff1b;对于其他电压的电池&#xff0c;将单电芯数值乘以相应S数即可&#xff1b;理论上单个电芯过放电压为3.0V&#xff0c;实际中为了保险&#xff0c;电压降到3.6V即需充电。…

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …

20250221 NLP

1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量&#xff0c;提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗&#xff1f; 是的&#xff0c;文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…

https:原理

目录 1.数据的加密 1.1对称加密 1.2非对称加密 2.数据指纹 2.1数据指纹实际的应用 3.数据加密的方式 3.1只使用对称加密 3.2只使用非对称加密 3.3双方都使用对称加密 3.4非对称加密和对称加密一起使用 4.中间人攻击 5.CA证书 5.1什么是CA证书 CA证书的验证 6.https的原理 1.数据…

数据驱动未来!天合光能与永洪科技携手开启数字化新篇章

在信息化时代的今天&#xff0c;企业间的竞争早就超越了传统产品与服务的范畴&#xff0c;新的核心竞争力即——数据处理能力和信息技术的应用。作为数据技术领域的领军者&#xff0c;永洪科技凭借其深厚的技术积累和丰富的行业经验&#xff0c;成功助力天合光能实现数字化升级…