当前位置: 首页 > news >正文

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、条件构造器、分页、逻辑删除、自动填充、代码生成
http://www.jsqmd.com/news/658286/

相关文章:

  • RabbitMQ实战:消息批量消费完全解析——原理+配置+SpringBoot代码+避坑指南
  • 从ET规则集看Suricata规则实战筛选与部署策略
  • 暗黑破坏神2存档编辑器:打造个性化游戏体验的完整指南
  • 洛洛王国-超时
  • 高效脚本编写:用Codex告别重复造轮子
  • 为什么先安慰,比先讲道理更有效(为什么这里会有这么一篇博客)
  • 算法训练营第四天|203. 移除链表元素
  • MATLAB量化工具箱实战:从quantizer配置到quantize应用
  • Linux搭建校园网络项目
  • 负采样:从Softmax瓶颈到高效词嵌入的工程实践
  • AUTOSAR MCAL实战:Dio_ChannelGroup配置详解与S32K144端口操作技巧
  • 以为生活缺的是标准答案,其实是丧失了“拆解”的能力
  • 如何用10个Illustrator脚本实现设计自动化:从手动操作到智能工作流的终极指南
  • golang如何实现图片水印批量添加_golang图片水印批量添加实现策略
  • Zotero Reference终极指南:如何3分钟内自动提取PDF文献参考文献
  • 快速上手Qwen2.5-7B微调:单卡10分钟体验AI训练
  • RDPWrap完整指南:免费解锁Windows远程桌面多用户并发连接
  • 别再只把JWT当令牌了:一个CTF实战案例,手把手教你用Burp Suite和jwt.io破解伪造
  • 从零构建垃圾分类识别系统:基于8万张图片与TensorFlow的实战指南
  • 揭秘Ribbon负载均衡:轻松实现请求分摊
  • iOS捷径(快捷指令)注入JavaScript:在移动端实现网页元素动态调试与修改
  • 监督学习、无监督学习、强化学习基础对比
  • 【机器学习实战指南】Python驱动随机森林回归:从数据清洗到销量预测全流程解析
  • 五大PMP培训机构全方位拆解:腾科、威班、项目管理联盟、华夏智诚、环球网校,谁才是你的最优解?
  • 打卡5:链表元素移除算法详解
  • SpringCloud Feign 声明式服务调用
  • 易语言YOLO全版本模块包重磅升级:支持YOLOv10,一键部署免配置
  • C语言随机数生成技巧
  • **脑机接口编程新范式:用Python与OpenBCI构建实时神经信号处理系统**在人工智能与人
  • 好用的东莞高新技术企业认定哪个公司好