Skip to content

Releases: mybatis-mapper/mapper

2.2.5

04 Nov 12:01
Compare
Choose a tag to compare

What's Changed

  • feat: BaseService新增wrapper方法; close #111 by @L1yp in #112
  • feat: 解决typeHandler实例化参数无实际类型的问题 close #113 by @L1yp in #114
  • feat: 解决typeHandler实例化参数无实际类型的问题 close #113 by @L1yp in #115
  • feat: 支持更新指定字段 by @Aunixtoyou in #118
  • Fix ClassNotFoundException for jakarta.persistence.Table by @abel533 in #110

New Contributors

  • @L1yp made their first contribution in #112

Full Changelog: 2.2.4...2.2.5

2.2.4

04 Nov 11:59
Compare
Choose a tag to compare
  • 由于typeHandlers全局配置导致没有测试出Wrapper的问题,修复Wrapper中TypeHandler的支持

Full Changelog: 2.2.3...2.2.4

2.2.3

26 May 07:26
Compare
Choose a tag to compare

What's Changed

  • insertupdate泛型增加<S extends T>
  • Example支持TypeHandler配置

insertupdate泛型增加<S extends T>

  /**
   * 保存实体
   *
   * @param entity 实体类
   * @return 1成功,0失败
   */
  @Lang(Caching.class)
  @InsertProvider(type = EntityProvider.class, method = "insert")
  <S extends T> int insert(S entity);

insert和update时可以使用实体类的子类进行操作。

Example支持TypeHandler配置

原来在实体类配置的 TypeHandlerExample操作无效,这次更新后可以自动生效。

单元测试方法如下:

 @Test
  public void testUpdateByExampleSetValues() {
    SqlSession sqlSession = getSqlSession();
    try {
      ExampleMapper<UserAuto, Example<UserAuto>> exampleMapper = sqlSession.getMapper(UserAutoBaseMapper.class);
      Example<UserAuto> example = new Example();
      example.createCriteria().andEqualTo(UserAuto::getId, 1L);
      example.set(UserAuto::getAddress, new UserAuto.Address("河北省", "秦皇岛市"));

      Assert.assertEquals(1, exampleMapper.updateByExampleSetValues(example));
      sqlSession.rollback();
    } finally {
      //不要忘记关闭sqlSession
      sqlSession.close();
    }
  }

这里的 UserAuto.Address 是一个对象,需要类型处理为单个字段。

这个改动后,Example 中的 andLike(Fn<T, Object> fn, String value) 改为了 andLike(Fn<T, Object> fn, Object value),因为字段是对象的情况下可以通过类型处理为 String,这里只接收 String 就无法支持 UserAuto.Address 模糊查询。该字段的模糊查询也发生了变化,这会导致相关代码的不兼容:

Example<UserAuto> example = userAutoMapper.example();
example.createCriteria().andLike(UserAuto::getAddress, "河北省%");

改为:

Example<UserAuto> example = userAutoMapper.example();
example.createCriteria().andLike(UserAuto::getAddress, new UserAuto.Address("河北省", "%"));

Full Changelog: 2.2.2...2.2.3

2.2.2

19 May 08:04
Compare
Choose a tag to compare

官方文档 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));
  }
}

Full Changelog: 2.1.1...2.2.2

2.2.1 - 2023-12-16

16 Dec 01:02
Compare
Choose a tag to compare
  • 复杂example查询示例
  • 测试批量插入ID
  • 完善测试代码
  • JPA不加注解时排除接口、数组、枚举、基本类型、注解类型,fixed #93
  • 依赖的 mybatis-provider 升级为 2.2.3

Example 示例

Example<User> example = new Example<>();
example.createCriteria().andEqualTo(User::getSex, "男").andOr(
    example.orPart().andLike(User::getUserName, "杨%"),
    example.orPart().le(User::getId, 10));
List<User> users1 = mapper.selectByExample(example);

//wrapper写法,结果一样
List<User> list = mapper.wrapper().eq(User::getSex, "男")
    .or(
        c -> c.startsWith(User::getUserName, "杨"),
        c -> c.le(User::getId, 10)).list();

生成的 SQL:

SELECT id,name AS userName,sex,status FROM user WHERE ( sex = ? AND ( ( name LIKE ? ) OR ( id <= ? ) ) )

简化括号后:

SELECT id,name AS userName,sex,status FROM user WHERE sex = ? AND ( name LIKE ?  OR id <= ? ) 

2.2.0 - 2023-12-05

06 Dec 01:08
Compare
Choose a tag to compare
  • 升级mybatis-provider2.2.2版本,添加insert测试jpa,closed #92
  • 增加mybatis-jakarta-jpa支持jakarta.persistence-api by 曹赛军
  • jakarta需要jdk11,修改运行环境依赖的jdk版本,其他模块仍然以jdk8编译

2.1.1 - 2023-6-4

23 Aug 12:12
Compare
Choose a tag to compare
  1. 解决接口方法冲突
  2. 优化Fn中的字段处理
  3. LogicalMapper实现

2.1.0 - 2022-12-26

23 Aug 12:10
Compare
Choose a tag to compare
  1. Fn支持直接输入字段名或列名,支持使用字符串形式的参数。
  2. Fn增加方法,当通过基类或基类泛型的字段引用时,可以指定所属的实体类 fixed#50
  3. 兼容 spring boot 3.0
  4. 增加h2驱动和相关测试,去掉mysql依赖,完善批量查询功能,支持复合主键的批量更新。
  5. 批量更新支持联合主键
  6. 新增批量更新 updateList、updateListSelective
  7. Example 增加 excludeColumns 排除查询列的方法,ExampleWrapper 增加 exclude 排除查询列的方法。由于重用了之前的 selectColumns 方法,这会导致之前可以多次调用 selectColumns追加查询列变成了每次调用都会覆盖查询列,不想指定时,可以 selectColumns() 空参数设置为空。fixed #63
  8. ExampleWrapper 增加 clear 方法,方便重用 wrapper, fixed #70
  9. 解决 mapper-bom 依赖 mapper-parent 导致的依赖管理冲突问题, fixed #67
  10. 修改字段批量操作方法为 Collection 类型后,这是一个不兼容的测试接口方法
  11. 通过 .editorconfig 统一代码样式,格式化代码

2.0.0 发布 - 2022-07-31

31 Jul 02:49
Compare
Choose a tag to compare
  • mybatis-provider 升级为 2.1.1,同时引入了 mybatis-config 依赖,增加 mybatis-mapper.proerteis 用户自定义配置
  • ExampleWrapper condition 系列方法新增 Supplier 重载 #47 by darren
  • 更新代码生成器,解决NAME=>nAME错误,现在可以转换为 name
  • example / wrapper 新增字符串形式的排序方法重载 #34 by darren
  • 修复 jpa 模块 获取 Entity 类型错误的问题(排除了基本类型) #41 by darren
  • 完善和Spring的集成,完善Bean的初始化和加载,fixed #51
  • 针对 mybatis-provider 中 @Entity.Prop 注解的兼容性改动
  • 添加 bom 子模块,管理 mybatis-mapper 中所有子模块的依赖 #45(** by zhousiwei**),可以使用下面的方式管理依赖:
    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>io.mybatis</groupId>
               <artifactId>mapper-bom</artifactId>
               <version>2.0.0</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>

mybatis-provider 升级到 2.1.1 版本

mapper 依赖 provider,provider 2.1.1 版本有大量改动对 mapper 也有影响,具体改动参考对应的版本日志:

mybatis-mapper.proerteis 用户自定义配置

关于配置的详细设计和实现,参考: https://blog.csdn.net/isea533/category_11904924.html

目前可配置的参数如下:

  • mybatis.provider.style,默认值为 lower_underscore,可选值如下:
    • normal 不做转换
    • lower_underscore 驼峰转下划线
    • upper_underscore 驼峰转大写下划线
    • lower 转小写
    • upper 转大写
      支持扩展,详情看 mybatis-provider 项目

支持下面 3 个参数:

@Entity.Table(value = "user",
    props = {
        @Entity.Prop(name = "deleteByExample.allowEmpty", value = "false"),
        @Entity.Prop(name = "updateByExample.allowEmpty", value = "false"),
        @Entity.Prop(name = "updateByExampleSelective.allowEmpty", value = "false")
    }
)

上面代码可以针对单个实体进行配置,也可以在配置文件中配置全局的默认配置。

除了直接在用户自定义配置文件中配置外,也支持系统变量和环境变量,使用 Spring Boot 时,也支持 Spring Boot 的所有外部化配置方式,支持在 application.[yaml|properties] 中配置,例如 yaml 方式:

mybatis:
  provider:
    style: lower_underscore
deleteByExample:
  allowEmpty: false
updateByExample:
  allowEmpty: false
updateByExampleSelective:
  allowEmpty: false
# 还可以使用 spring boot 推荐的形式
update-by-example-selective:
  allow-empty: false

1.2.2 发布

17 Apr 15:02
Compare
Choose a tag to compare

2022年4月17日 - 1.2.2 发布

mybatis-mapper 项目升级到 1.2.2

针对 issues#29 修复的问题,mybatis-mapper 项目升级到 1.2.2。

当通过方法引用获取列信息时,使用的 Java Bean 规范,如果存在列 a_tag 对应如 aTag 这样的 Java 字段,生成的 getATag 会认为字段为 ATag,和 aTag 匹配不上导致出错。

修改后,在匹配字段时会先区分大小写进行匹配,匹配不到时会再进行不区分大小写的匹配,仍然无效时会抛出异常。