# 💾 MyBatis 学习

半自动 ORM 框架 - SQL 与 Java 对象的映射

### 📊 MyBatis vs JPA 对比

#### MyBatis

优点：

- ✅ SQL 灵活可控
- ✅ 性能优化方便
- ✅ 复杂查询友好
- ✅ 易于 DBA 协作

缺点：

- ❌ SQL 与代码耦合
- ❌ 数据库迁移成本高
- ❌ 需要手写 SQL

适用：复杂查询、性能要求高

#### JPA/Hibernate

优点：

- ✅ 面向对象
- ✅ 数据库无关
- ✅ 开发效率高
- ✅ 自动维护

缺点：

- ❌ 复杂查询困难
- ❌ 性能调优复杂
- ❌ 学习曲线陡

适用：标准 CRUD、快速开发

### 🚀 快速体验

### 💡 缓存机制

#### 一级缓存 (SqlSession 级别)

默认开启，同一 SqlSession 内相同查询只执行一次 SQL

// 第一次查询 - 执行 SQL
User u1 = mapper.findById(1L);
// 第二次查询 - 命中缓存，不执行 SQL
User u2 = mapper.findById(1L);

#### 二级缓存 (Mapper 级别)

需配置 @CacheNamespace，多个 SqlSession 共享

@Mapper
@CacheNamespace
public interface UserMapper { ... }

💡 验证方式：查看控制台 SQL 日志，缓存命中时不打印 SQL

### 📝 常用注解

注解 | 用途
--- | ---
@Mapper | 标记为 MyBatis Mapper 接口
@Select | 查询 SQL
@Insert | 插入 SQL
@Update | 更新 SQL
@Delete | 删除 SQL
@Param | 参数命名
@Options | 额外选项（如返回自增ID）
@CacheNamespace | 启用二级缓存

### 🔧 动态 SQL 示例

<select id="findUsers">
SELECT * FROM users
<where>
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>