MyBatis:SQL 与 Java 的「智能翻译官」
—— 用 极简的方式 连接数据库和 Java 对象,告别 JDBC 的繁琐操作!
核心定位:半自动化 ORM 框架
对比项 | JDBC 原生操作 | MyBatis 解决方案 |
---|---|---|
SQL 编写 | 拼字符串(易出错、难维护) | XML/注解 清晰隔离 SQL |
结果映射 | 手动遍历 ResultSet → 对象 | 自动映射 结果到 Java 对象 |
连接管理 | 手动开/关 Connection、Statement | 自动管理资源(防泄漏) |
参数传递 | setString(1, “Alice”) 硬编码 | 动态参数(#{} 防 SQL 注入) |
📌 ORM (对象关系映射):将数据库表 自动映射为 Java 对象(如
User
类 →user
表)
核心组件图解
核心优势详解
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);
}
核心操作流程(以查询为例)
- 定义 Mapper 接口
public interface UserMapper {User getUserById(@Param("id") int id);
}
- 编写 SQL 映射(XML 或注解)
<!-- UserMapper.xml -->
<select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>
- 调用 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 一样省力!