# 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
注解的catalog
和schema
属性。
- JPA 新增支持
- 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));
}
}