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

MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术

🔍 MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术

文章目录

  • 🔍 MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术
  • 🧩 一、为什么需要 ORM 框架?
    • 💡 JDBC 的痛点:原始时代的"手工劳作"
  • 🚀 二、ORM 框架演进史
    • 💡 ORM 发展三阶段
    • 🔍 各阶段特点对比
  • ⚖️ 三、MyBatis vs Hibernate/JPA 终极对决
    • 💡 框架选型矩阵
    • 🔍 详细对比表
  • ⚙️ 四、MyBatis 核心原理揭秘
    • 💡 架构总览:SQL 的"中央调度中心"
    • 🔥 四大核心组件解析
    • ✨ 执行流程详解
  • 🏭 五、企业级实战场景解析
    • 💡 典型场景 1:复杂查询优化
    • 🔥 典型场景 2:批量操作
    • ⚡ 企业级配置建议
  • 🔮 六、进阶学习路线
    • 💡 MyBatis 技能树
    • 📚 学习资料推荐

🧩 一、为什么需要 ORM 框架?

💡 JDBC 的痛点:原始时代的"手工劳作"

想象你是一位厨师(Java 开发者),每次做菜(操作数据库)都要:

  1. 亲自买菜(建立连接)
  2. 切菜洗菜(拼装 SQL)
  3. 控制火候(管理事务)
  4. 洗碗刷锅(释放资源)

​​代码噩梦​​:

// 传统JDBC查询示例
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {conn = DriverManager.getConnection(url, user, password);ps = conn.prepareStatement("SELECT * FROM users WHERE id=?");ps.setInt(1, 1001);rs = ps.executeQuery();while (rs.next()) {// 手动映射字段到对象 → 重复劳动!User user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));}
} finally {// 繁琐的资源关闭 → 容易遗漏!if (rs != null) rs.close();if (ps != null) ps.close();if (conn != null) conn.close();
}

​​JDBC 的四大痛点​​:

JDBC痛点
样板代码多
资源管理复杂
SQL与代码耦合
手动对象映射

🚀 二、ORM 框架演进史

💡 ORM 发展三阶段

200220032004200520062007200820092010JDBC时代 Hibernate崛起 MyBatis诞生 ORM发展ORM框架进化史

🔍 各阶段特点对比

框架类型代表工作模式类比
全自动ORMHibernate对象↔表全自动映射自动驾驶汽车
半自动ORMMyBatisSQL自由控制+自动映射手动挡跑车
纯JDBC全手动操作自行车

⚖️ 三、MyBatis vs Hibernate/JPA 终极对决

💡 框架选型矩阵

需求
需要SQL控制权
MyBatis
需要快速开发
Hibernate
JPA规范

🔍 详细对比表

维度MyBatisHibernate/JPA胜出方
SQL控制完全掌控自动生成(可覆盖)MyBatis
学习曲线平缓(1周)陡峭(1月+)MyBatis
复杂查询原生SQL灵活优化HQL需转换MyBatis
性能调优直接优化SQL需理解Session缓存MyBatis
开发速度需写SQL注解配置快速开发Hibernate
移植性SQL依赖数据库HQL跨数据库Hibernate

企业真实选择​​:

  • 金融/电商系统:MyBatis(性能优先)
  • 后台管理系统:Hibernate(开发效率优先)

⚙️ 四、MyBatis 核心原理揭秘

💡 架构总览:SQL 的"中央调度中心"

Mapper接口
动态代理
SqlSession
Executor
StatementHandler
SQL解析
数据库驱动
XML/注解

🔥 四大核心组件解析

1.​​SqlSessionFactory​​(数据库连接工厂)

// 全局唯一(重量级)
String config = "mybatis-config.xml";
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(config));

2.​​SqlSession​​(数据库会话)

try (SqlSession session = factory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1001); // 触发SQL执行
} // 自动关闭会话 → 安全!

3.​​Mapper 接口​​(SQL 映射契约)

public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUser(int id); // 方法即SQL!
}

4.​​Executor​​(SQL 执行引擎)

Executor
SimpleExecutor
ReuseExecutor
BatchExecutor

✨ 执行流程详解

ClientMapper接口动态代理SqlSessionExecutorDatabase调用mapper.selectUser(1001)代理拦截方法调用获取SqlSession创建Executor解析SQL(XML/注解)执行SELECT * FROM users...返回ResultSet映射为User对象返回结果返回User实例ClientMapper接口动态代理SqlSessionExecutorDatabase

🏭 五、企业级实战场景解析

💡 典型场景 1:复杂查询优化

​​需求​​:多表关联查询 + 动态条件过滤

​​Hibernate 难点​​:

// HQL复杂查询示例(可读性差)
String hql = "select u.name, o.total from User u join u.orders o " +"where u.age > :age and o.status = :status";

​​MyBatis 解决方案​​:

<!-- 动态SQL拼接 -->
<select id="findUserOrders" resultType="map">SELECT u.name, o.total FROM users uJOIN orders o ON u.id = o.user_id<where><if test="age != null">u.age > #{age}</if><if test="status != null">AND o.status = #{status}</if></where>
</select>

🔥 典型场景 2:批量操作

​​需求​​:导入 10 万条数据

​​JDBC 痛点​​:逐条插入效率低

​​MyBatis 方案​​:

try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = session.getMapper(UserMapper.class);for (User user : userList) {mapper.insertUser(user); // 批量缓存}session.commit(); // 一次性提交 → 性能提升10倍+
}

⚡ 企业级配置建议

<!-- mybatis-config.xml 核心配置 -->
<configuration><settings><!-- 开启二级缓存 --><setting name="cacheEnabled" value="true"/><!-- 下划线转驼峰 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 插件扩展 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 分页插件 --></plugin></plugins>
</configuration>

🔮 六、进阶学习路线

💡 MyBatis 技能树

MyBatis
核心原理
高级特性
生态整合
缓存机制
插件开发
动态SQL
类型处理器
SpringBoot整合
MyBatis-Plus

📚 学习资料推荐

  1. ​​官方文档​​:mybatis.org(必读!)
  2. ​​源码精讲​​:SqlSessionExecutor执行流程
  3. 实战书籍​​:《MyBatis 技术内幕》
  4. ​​扩展工具​​:MyBatis-Plus(增强工具包)
http://www.xdnf.cn/news/18744.html

相关文章:

  • 移动应用渗透测试:API 接口漏洞的识别与利用技巧
  • 五自由度磁悬浮轴承同频振动抑制:从机理拆解到传递函数验证的核心方案
  • ICBC_TDR_UShield2_Install.exe [ICBC UKEY]
  • CSDN博客:中文技术社区的知识生产与生态演进
  • 项目设计文档——爬虫项目(爬取天气预报)
  • linux、window java程序导出pdf\word、excel文字字体显示异常、字体样式不一样
  • SOME/IP服务发现PRS_SOMEIPSD_00277的解析
  • 【贪心算法】day3
  • 高教杯数学建模2021-C 生产企业原材料的订购与运输
  • 5G 三卡图传终端:应急救援管理的 “可视化指挥核心”
  • 【无标题】计数组合学7.21(有界部分大小的平面分拆)
  • 支持向量机(SVM)
  • Linux 内核 Workqueue 原理与实现及其在 KFD SVM功能的应用
  • Linux--seLinux的概述
  • 数据结构07(Java)-- (堆,大根堆,堆排序)
  • 常见的设计模式
  • 博士招生 | 南洋理工大学 PINE Lab 招收全奖博士
  • [新启航]新启航激光频率梳 “光量子透视”:2μm 精度破除遮挡,完成 130mm 深孔 3D 建模
  • 【国密证书】CentOS 7 安装 GmSSL 并生成国密证书
  • Docker移动安装目录的两种实现方案
  • 微硕WINSOK高性能MOS管WSF90N10,助力洗衣机能效与可靠性升级
  • Java:IO流——基础篇
  • Redis高级篇:在Nginx、Redis、Tomcat(JVM)各环节添加缓存以实现多级缓存
  • 一文丝滑使用Markdown:从写作、绘图到转换为Word与PPT
  • MongoDB /redis/mysql 界面化的数据查看页面App
  • M3-Agent:让AI拥有长期记忆的新尝试
  • UML 时序图中交互片段操作符的详细解析与 C/C++ 实现示例
  • React 高阶组件
  • 服务器初始化
  • APM 系列(一):Skywalking 与 Easyearch 集成