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

MyBatis:SQL与Java的智能桥梁

MyBatis:SQL 与 Java 的「智能翻译官」

—— 用 极简的方式 连接数据库和 Java 对象,告别 JDBC 的繁琐操作!


核心定位:半自动化 ORM 框架

对比项JDBC 原生操作MyBatis 解决方案
SQL 编写拼字符串(易出错、难维护)XML/注解 清晰隔离 SQL
结果映射手动遍历 ResultSet → 对象自动映射 结果到 Java 对象
连接管理手动开/关 Connection、Statement自动管理资源(防泄漏)
参数传递setString(1, “Alice”) 硬编码动态参数#{} 防 SQL 注入)

📌 ORM (对象关系映射):将数据库表 自动映射为 Java 对象(如 User 类 → user 表)


核心组件图解

调用
执行
映射
操作
返回数据
封装结果
返回对象
Java 代码
SqlSession
Mapper 接口
XML 或 注解 SQL
数据库

核心优势详解

1. SQL 自由掌控

灵活编写复杂 SQL(存储过程、多表 JOIN)
动态 SQL:根据条件智能拼接 SQL 片段

<select id="findUsers">SELECT * FROM users<where><if test="name != null">   <!-- 动态条件 -->AND name = #{name}</if><if test="minAge != null">AND age >= #{minAge}</if></where>
</select>
2. 自动对象映射

数据库字段 → Java 对象属性(支持嵌套对象)

<resultMap id="userMap" type="User"><id property="id" column="user_id"/>       <!-- 主键映射 --><result property="name" column="user_name"/><!-- 字段映射 --><!-- 嵌套对象映射 --><association property="dept" javaType="Department"><result property="deptName" column="dept_name"/></association>
</resultMap>
3. 解耦神器
  • SQL 与 Java 代码分离(XML 管理 SQL)
  • 接口 + 注解 零 SQL 侵入方案(推荐)
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}

核心操作流程(以查询为例)

  1. 定义 Mapper 接口
public interface UserMapper {User getUserById(@Param("id") int id);
}
  1. 编写 SQL 映射(XML 或注解)
<!-- UserMapper.xml -->
<select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>
  1. 调用 MyBatis API
// 1. 加载配置(数据源、Mapper 路径)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取会话
try (SqlSession session = factory.openSession()) {// 3. 获取 Mapper 代理对象UserMapper mapper = session.getMapper(UserMapper.class);// 4. 执行查询 → 自动返回 User 对象User user = mapper.getUserById(1001); 
}

进阶特性

特性用途
一级/二级缓存减少数据库查询(一级缓存默认开启,二级缓存需手动配置)
插件机制拦截 SQL 执行(实现分页、审计等)
类型处理器自定义 Java 类型 ↔ 数据库类型转换(如 List 转 JSON 存储)
动态 SQL 标签<foreach>, <choose>, <bind> 简化复杂查询

适用场景

  • 需精细控制 SQL 的项目(如金融系统、报表查询)
  • 遗留数据库(表设计不符合 ORM 规范)
  • 高性能需求场景(比全自动 ORM 如 Hibernate 更轻量)
  • 简单 CRUD 小项目(可选 Spring Data JPA)

代码对比:JDBC vs MyBatis

// ---------- JDBC 原生查询(20+行)-----------
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
stmt.setInt(1, 1001); 
ResultSet rs = stmt.executeQuery();User user = null;
if (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));// ... 手动赋值所有字段
}
rs.close(); stmt.close(); conn.close(); // 必须手动关闭!// ---------- MyBatis 等效操作(1行)-----------
User user = userMapper.getUserById(1001); // SQL自动执行+结果封装

💡 总结
MyBatis = SQL 掌控力 + 开发高效率
—— 像写原生 SQL 一样灵活,像用 ORM 一样省力!

http://www.dtcms.com/a/274691.html

相关文章:

  • Ant Design ProTable组件深度解析
  • CUDA —— 2.3、cuda静态全局变量__device__使用介绍(附:完整代码)
  • 系统思考:多元胜过能力
  • 计算机网络第三章(5)——数据链路层《广域网》
  • 解锁形状与空间的奥秘:微分几何与流形一瞥-AI云计算拓展核心内容
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • 云蝠智能 VoiceAgent重构企业呼入场景服务范式
  • Ubuntu20.04运行openmvg和openmvs实现三维重建(未成功,仅供参考)
  • PyTorch笔记5----------Autograd、nn库
  • 《棒球规则介绍》领队和主教练谁说了算·棒球1号位
  • sqli-labs靶场通关笔记:第1-4关 联合注入
  • ros topic和service的使用
  • 深入浅出Redis:一文掌握Redis底层数据结构与实现原理
  • Java Stream流介绍及使用指南
  • GIC控制器 (三)
  • 猿人学js逆向比赛第一届第十八题
  • 【一起来学AI大模型】微调技术:LoRA(Low-Rank Adaptation) 的实战应用
  • Linux kernel regcache_cache_only()函数详解
  • pytest中mark的使用
  • SpringCloud之Feign
  • 深入探讨大模型的记忆机制及其前沿技术
  • 数据结构与算法——从递归入手一维动态规划【2】
  • 极端高温下的智慧出行:危险检测与救援
  • AI介入电商内容生产,会颠覆品牌运营吗?
  • 打破内网壁垒,轻松实现安防视频的云端汇聚与P2P超低延迟播放
  • 史上最详细Java并发多线程(面试必备,一篇足矣)
  • 进制转换小题
  • 5 大人工智能知识管理工具
  • 冒泡排序和快速排序
  • 云成本优化完整指南:从理论到实践的全方位解决方案