news 2026/4/18 1:26:31

MyBatis 使用步骤、实现原理与 MyBatis-Plus 扩展功能详解》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis 使用步骤、实现原理与 MyBatis-Plus 扩展功能详解》

一、MyBatis 框架使用步骤(标准流程)

MyBatis 是一款优秀的半自动 ORM 框架,用于简化 JDBC 开发、实现数据库操作。

1. 引入依赖

在 Maven/Gradle 中引入 MyBatis 核心依赖 + 数据库驱动:

xml

<!-- MyBatis 核心 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>最新版本</version> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency>

2. 编写 MyBatis 核心配置文件

创建mybatis-config.xml,配置环境、数据源、别名、映射器

xml

<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/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 注册 Mapper --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>

3. 创建实体类(POJO)

对应数据库表结构:

java

运行

public class User { private Long id; private String name; private Integer age; // getter/setter/toString }

4. 编写 Mapper 接口

定义数据库操作方法:

java

运行

public interface UserMapper { User selectById(Long id); }

5. 编写 SQL 映射文件(Mapper.xml)

绑定接口,编写 SQL:

xml

<mapper namespace="com.mapper.UserMapper"> <select id="selectById" resultType="com.entity.User"> select * from user where id = #{id} </select> </mapper>

6. 加载配置、获取 SqlSession、执行操作

java

运行

// 1. 加载配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); // 2. 创建 SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // 3. 获取 SqlSession SqlSession session = factory.openSession(); // 4. 获取 Mapper 代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); // 5. 执行方法 User user = userMapper.selectById(1L); // 6. 关闭资源 session.close();

二、MyBatis 实现机制(底层原理)

MyBatis 本质是对 JDBC 的封装 + 动态代理 + SQL 解析执行

1. 核心流程

  1. 加载配置读取mybatis-config.xmlMapper.xml,封装成Configuration对象。

  2. 解析 Mapper解析 SQL、参数类型、返回值类型,生成MappedStatement对象。

  3. 创建 SqlSessionFactory工厂模式,用于生产SqlSession

  4. 获取 SqlSession代表一次数据库连接,提供执行 SQL、获取 Mapper、事务控制等能力。

  5. 动态代理生成 Mapper 实现类调用session.getMapper(UserMapper.class)时:

    • MyBatis 使用JDK 动态代理创建接口的代理对象
    • 代理对象拦截方法调用,根据方法名 + 命名空间找到对应的 SQL
  6. 执行 SQL

    • 通过Executor执行器调度
    • 使用StatementHandler处理 SQL
    • 通过ParameterHandler设置参数
    • 通过ResultSetHandler封装结果集

2. 一句话总结原理

MyBatis 通过动态代理为 Mapper 接口生成代理对象,代理对象根据方法名找到对应的 SQL,最终通过 JDBC 执行并封装结果返回。


三、MyBatis-Plus(MP)扩展了哪些功能?

MyBatis-Plus 是 MyBatis 的增强工具只增强不修改,简化单表 CRUD,提高开发效率。

1. 内置通用 CRUD 方法(无需写 SQL)

Mapper 继承BaseMapper即可直接使用:

  • selectById()
  • selectList()
  • insert()
  • updateById()
  • delete()

无需编写 XML、无需定义方法。

2. 条件构造器(Wrapper)

支持链式、动态拼接 SQL 条件,无需手写复杂 SQL:

java

运行

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", 20).like("name", "张"); List<User> list = userMapper.selectList(wrapper);

3. Lambda 条件构造器

防字段名写错,更安全:

java

运行

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getAge, 20).like(User::getName, "张");

4. 分页插件

只需配置插件,即可自动实现物理分页:

java

运行

Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, wrapper);

5. AR 模式(ActiveRecord)

实体类继承Model即可直接调用 CRUD:

java

运行

User user = new User(); user.setName("张三"); user.insert();

6. 主键自动生成策略

支持:

  • AUTO 自增
  • ID_WORKER 雪花算法(默认)
  • UUID
  • NONE

7. 逻辑删除

配置后,delete变为update,数据不会真正删除:

  • deleted=0未删除
  • deleted=1已删除

8. 自动填充

创建时间、更新时间自动赋值:

  • @TableField(fill = FieldFill.INSERT)
  • @TableField(fill = FieldFill.INSERT_UPDATE)

9. 乐观锁插件

通过版本号实现并发控制:

  • @Version

10. 代码生成器(经典 / 新版)

一键生成:

  • Controller
  • Service
  • ServiceImpl
  • Mapper
  • Mapper.xml
  • Entity

真正的零配置、高效率开发神器。

11. 其他高级特性

  • 多租户
  • 动态表名
  • SQL 性能分析插件
  • 防全表更新 / 删除插件
  • 枚举类型处理器
  • 自定义类型处理器

四、总结(博客收尾)

  1. MyBatis 使用步骤:引包 → 配置 → 实体 → Mapper 接口 → XML → 测试
  2. MyBatis 实现机制:配置解析 + 动态代理 + JDBC 封装
  3. MyBatis-Plus:在 MyBatis 基础上提供通用 CRUD、条件构造器、分页、逻辑删除、自动填充、代码生成
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:24:14

【JVM深度解析】第31篇:JVM未来趋势与开发者应对策略

摘要 Java 和 JVM 的未来正在快速演进&#xff1a;Project Loom 的虚拟线程将改变并发编程范式、Project Valhalla 的值类型将消除对象开销、Project Amber 的模式匹配让代码更简洁、Predictable Cap 表示 Java 将进入硬实时领域。本文梳理 JVM 即将到来的重要特性&#xff0c…

作者头像 李华
网站建设 2026/4/18 1:23:16

高效脚本编写:用Codex告别重复造轮子

技术文章大纲&#xff1a;告别重复造轮子——Codex写脚本的高效实践引言&#xff1a;自动化脚本的意义与Codex的潜力重复性工作的痛点与脚本的价值OpenAI Codex在代码生成领域的突破性能力本文目标&#xff1a;如何利用Codex快速生成实用脚本Codex基础&#xff1a;理解其工作原…

作者头像 李华
网站建设 2026/4/18 1:23:15

负采样:从Softmax瓶颈到高效词嵌入的工程实践

1. 负采样技术的前世今生 我第一次接触负采样是在2016年构建电商搜索系统时。当时我们的商品标题词表规模达到百万级&#xff0c;传统的Softmax计算让GPU显存直接爆满&#xff0c;训练一个epoch需要整整三天。直到团队里的算法专家扔给我那篇著名的Mikolov论文&#xff0c;问题…

作者头像 李华
网站建设 2026/4/18 1:19:38

大模型面试真题深度解析:从SFT到RLHF,手把手带你攻克算法岗难题!

最近金三银四&#xff0c;后台不少读者留言让我聊聊大模型方向的面试经验。恰好上个月我完整经历了某猪场的大模型用算法岗面试&#xff0c;一路从一面到Offer&#xff0c;被问到头皮发麻。 但不得不说&#xff0c;这场面试让我对自己过去两年的技术积累有了全新的梳理。今天我…

作者头像 李华
网站建设 2026/4/18 1:16:13

AI 设计工具:不是让 Figma 更好,是重新定义“设计“这件事

Anthropic CPO 离开 Figma 董事会。不是普通的人事变动&#xff0c;是 AI 实验室向传统 SaaS 宣战的信号。 理解这件事需要一点商业史视角。 2010 年代&#xff0c;移动优先——Instagram 在手机上做到了 PC 端从未做到的事情&#xff0c;颠覆了 Flickr。 2020 年代&#xff0c…

作者头像 李华
网站建设 2026/4/18 1:12:44

暗黑破坏神2存档编辑器:打造个性化游戏体验的完整指南

暗黑破坏神2存档编辑器&#xff1a;打造个性化游戏体验的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2存档编辑器是一款功能强大的开源工具&#xff0c;让你能够自由编辑游戏存档文件&#xff0c;无论是原…

作者头像 李华