MyBatis 是一个强大的持久层框架,但它的潜力远不止于基础的 CRUD 操作。本文将分享 10 个 MyBatis 的宝藏技巧,帮助你提升开发效率、优化代码质量,并解锁更多高级功能!🚀


目录

  1. 动态 SQL 的灵活运用
  2. 结果映射的高级用法
  3. 批量操作的性能优化
  4. 自定义 TypeHandler
  5. 插件机制(Interceptor)
  6. 多数据源支持
  7. 枚举类型的优雅处理
  8. 延迟加载(Lazy Loading)
  9. 缓存机制深度优化
  10. 注解与 XML 的混合使用

1. 动态 SQL 的灵活运用

介绍

  • MyBatis 的动态 SQL 功能非常强大,可以根据条件动态生成 SQL 语句,避免拼接字符串的繁琐和风险。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="findUsers" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
  • 运行 HTML

使用场景

  • 多条件查询
  • 动态更新字段

2. 结果映射的高级用法

介绍

  • 通过 <resultMap> 可以灵活地映射复杂的查询结果,支持嵌套对象、集合等。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="orderDate" column="order_date"/>
</collection>
</resultMap>

<select id="findUserWithOrders" resultMap="userResultMap">
SELECT u.id AS user_id, u.name AS user_name,
o.id AS order_id, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
  • 运行 HTML

使用场景

  • 一对多、多对多关系映射
  • 复杂查询结果映射

3. 批量操作的性能优化

介绍

  • MyBatis 支持批量操作,可以显著提升插入、更新、删除的性能。

代码示例

1
2
3
4
5
6
7
8
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
UserMapper mapper = session.getMapper(UserMapper.class);
for (int i = 0; i < 1000; i++) {
User user = new User("user" + i, i);
mapper.insertUser(user);
}
session.commit(); // 批量提交
}

使用场景

  • 批量插入数据
  • 批量更新或删除

4. 自定义 TypeHandler

介绍

  • 通过自定义 TypeHandler,可以处理特殊类型的数据(如 JSON、枚举等)。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@MappedTypes(JSONObject.class)
public class JsonTypeHandler extends BaseTypeHandler<JSONObject> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toJSONString());
}

@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JSONObject.parseObject(rs.getString(columnName));
}

// 其他方法省略...
}

使用场景

  • 处理 JSON 数据
  • 自定义数据类型映射

5. 插件机制(Interceptor)

介绍

  • MyBatis 的插件机制可以拦截核心方法(如执行 SQL、处理结果等),实现自定义逻辑。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class UpdateInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("Before update operation");
Object result = invocation.proceed();
System.out.println("After update operation");
return result;
}
}

使用场景

  • SQL 执行日志
  • 分页插件
  • 数据权限控制

6. 多数据源支持

介绍

  • 通过配置多个数据源,可以在一个项目中同时访问多个数据库。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean(name = "secondaryDataSource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}

使用场景

  • 读写分离
  • 多数据库访问

7. 枚举类型的优雅处理

介绍

  • 通过 EnumTypeHandler 或自定义 TypeHandler,可以优雅地处理枚举类型。

代码示例

1
2
3
4
5
6
7
8
public enum UserStatus {
ACTIVE, INACTIVE
}

public class User {
private UserStatus status;
// getters and setters
}

使用场景

  • 状态字段
  • 类型字段

8. 延迟加载(Lazy Loading)

介绍

  • 延迟加载可以在需要时才加载关联对象,减少不必要的查询。

代码示例

1
2
3
<resultMap id="userResultMap" type="User">
<collection property="orders" ofType="Order" select="findOrdersByUserId" column="id" fetchType="lazy"/>
</resultMap>
  • 运行 HTML

使用场景

  • 一对多、多对多关系
  • 大数据量查询

9. 缓存机制深度优化

介绍

  • MyBatis 提供了一级缓存和二级缓存,可以显著提升查询性能。

代码示例

1
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
  • 运行 HTML

使用场景

  • 高频查询
  • 数据变化较少的场景

10. 注解与 XML 的混合使用

介绍

  • MyBatis 支持注解和 XML 配置的混合使用,灵活应对不同场景。

代码示例

1
2
3
4
5
6
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name")
})
User selectUserById(int id);

使用场景

  • 简单查询使用注解
  • 复杂查询使用 XML

总结

通过掌握这 10 个 MyBatis 的宝藏技巧,你可以:

  • 提升开发效率 🚀

  • 优化代码质量 ✨

  • 解锁更多高级功能 🔓

  • 希望本文能帮助你更好地使用 MyBatis,打造高效、优雅的持久层代码!🎉


附注:本文基于 MyBatis 3.x 版本编写,部分功能在 MyBatis 2.x 中可能不支持,请参考官方文档以获取最新信息。