# 2024年5月20日 - 2.2.2 发布

官方文档 https://mapper.mybatis.io/ 新增加了 2.x 版本的新文档,快速上手、接口介绍、注解配置更新了大量最新内容,欢迎查阅。

# 功能增强

  • Provider 升级: 将 provider 升级至 2.2.4 版本。
  • 项目结构调整: Fn, Reflections 和测试 FnTest 移动到了 mybatis-provider 项目,包名保持不变。
  • 注解增强:
    • JPA 新增支持 @Entity 注解,配置该注解相当于开启默认注解中的 autoResultMap=true,配合 @Convert 注解使用时可以对查询结果进行转换。
    • JPA 新增支持 @Convert 注解,用于类型转换,可以将查询结果转换为指定类型,需要指定 MyBatis TypeHandler 子类。默认可以用于参数中,想让查询结果列生效时需要配合 @Entity 注解开启 autoResultMap=true
    • JPA 支持: 支持 JPA @Table 注解的 catalogschema 属性。
  • SQL 生成: 通过 LogicalMapper 生成的 SQL 现在包含 schema 信息。
  • JPA 注解兼容性: jakarta-jpa 复制了 jpa 的改动,功能相同,但注解包名不同。

# 性能优化

  • 内存管理: 解决了 Fn 缓存内存溢出的问题,修复了 issue #108。
  • 依赖管理: 移除了无用的 javax.persistence-api 依赖。

# 兼容性改进

# 测试与质量保证

  • 测试用例修复: 修复了测试用例 testExampleUseCondition
  • 测试代码完善: 增加了 createCriteriaSelective 方式创建 Criteria,GeneratedCriteria 类增加了 useCondition 方法。

# 贡献者

  • liuzh
  • aunix*
  • 曹赛军

# Example 新增变化介绍

所有方法增加了一个带 boolean useCondition 参数的方法,示例如下:

@Test
public void testExampleUseCondition() {
  try (SqlSession sqlSession = getSqlSession()) {
    ExampleMapper<User, Example<User>> exampleMapper = sqlSession.getMapper(UserMapper.class);
    Example<User> example = new Example<>();

    User user = new User();
    user.setUserName("殷%");

    example.createCriteria()
        .andNotEqualTo(Objects.nonNull(user.getId()), User::getId, user.getId())
        .andLike(Utils.isNotBlank(user.getUserName()), User::getUserName, user.getUserName())
        .andEqualTo(Utils.isNotBlank(user.getSex()), User::getSex, user.getSex());
    Assert.assertEquals(5, exampleMapper.countByExample(example));
  }
}

还有一个 createCriteriaSelective 方法,默认会校验值是否为空,如果空就不使用条件:

@Test
public void testExampleUseSelective() {
  try (SqlSession sqlSession = getSqlSession()) {
    ExampleMapper<User, Example<User>> exampleMapper = sqlSession.getMapper(UserMapper.class);
    Example<User> example = new Example<>();

    User user = new User();
    user.setUserName("殷%");
    user.setSex("女");

    example.createCriteriaSelective()
        .andLike(User::getUserName, user.getUserName())
        .andEqualTo(User::getId, user.getId())
        .andNotEqualTo(User::getSex, user.getSex());

    Assert.assertEquals(3, exampleMapper.countByExample(example));
  }
}