Mybatis 通用 Mapper 4.0.0 发布

Liuzh_533
 Liuzh_533
发布于 2018年03月19日
收藏 30

通用 Mapper4 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example相关的单表操作。通用 Mapper 是为了解决 MyBatis 使用中 90% 的基本操作,使用它可以很方便的进行开发,可以节省开发人员大量的时间。

4.0 更新日志

此次更新最大的变化是项目结构调整了,将原来的 mapper 拆分成了 core, base, extra, generator, spring 五个子模块,将独立的 mapper-weekend 和 spring-boot-starter 项目添加到 mapper 中作为两个子项目,拆分后的整个项目如下:

  • all - 为了方便开发人员使用,屏蔽模块细节,提供的整合,下面两个子模块是具体实现,具体包含了 core, base, extra, generator, spring, weekend 六个项目。

    • dependencies - 以依赖方式整合,包含 tk.mybatis:mapper 的完整功能。

    • mapper - 通过 maven-shade-plugin 打包整合,和原来的 tk.mybatis:mapper 完全一样,并且 Maven 坐标就是 tk.mybatis:mapper。

  • base - 所有 Mapper<T> 等接口的实现,独立出来后方便整体替换这部分实现。

  • core - 通用 Mapper 的核心,依赖 core 可以实现自己的通用方法,base 就是以此为依赖的一种实现。

  • extra - base 方法扩展,提供有局限性的通用接口。

  • generator - 代码生成器,包含了通用 Mapper 代码生成器和一个通用的全功能代码生成器插件。

  • spring - 通用 Mapper 和 Spring 集成需要的关键类,重写了 MyBatis 几个实现类。

  • spring-boot-starter - 通用 Mapper 和 Spring Boot 集成。

  • weekend - 基于 Java8 方法引用的 Example 替代对象 Weekend,可以避免字符串形式的字段名。

    除了上面的模块外,mapper 下面还有一个 wiki 目录,该目录是对 wiki 仓库的引用,wiki 的两个仓库分别如下:

  此外,项目中各个模块的父依赖为 mapper-parent 项目:

全新文档

Wiki 地址

Wiki 目录

  1. 集成通用 Mapper

  2. 对象关系映射

  3. 配置介绍

  4.             代码生成器

  5. 扩展通用接口

  6. Example 用法

  7. 其他配置和用法

  8. 常见问题

  9. 更新日志

    新增功能和参数

  1. 增加 @RegisterMapper 自动注册 Mapper 接口标记

                通用 Mapper 所有已有方法都增加了该注解,MapperHelper 中实现对该注解的检测和自动配置。

                实现自己的基类接口时也可以自己添加,例如:

    @RegisterMapper public interface MyMapper<T> extends Mapper<T> {  }

    增加该注解后会自动注册该接口到通用 Mapper(不需要配置 mappers 参数指定该接口了)。

    即使不增加该接口,如果只用到了通用 Mapper 提供的方法,也可以自动注册,通用 Mapper 会自动向上查找带有该注解的父接口。

    如果是自己开发的通用方法,建议加上该注解,否则还需要自己配置 mappers 参数。

  2. 增加 @KeySql 注解,用于配置主键策略,替换 JPA 中的复杂用法,可以查看 2.3 主键策略 了解详细用法。

  3. 增加 resolveClass 参数,可以配置 EntityResolve 接口的实现类,可以替换默认转换 entity 到 table 的过程,替换后原来支持的一些配置会失效。

  4. 当特殊类型的字段标记 @Column 或 @ColumnType 注解时,可以作为表字段进行使用(例如枚举,复杂类型,需要配合 TypeHandler)。

  5.  EntityColumn 增加 blob 属性,给 WithBLOBs 系列方法做准备。

  6. 增加参数 usePrimitiveType,配置为 true 后,简单类型会包含 8 种基本类型。

  7. 引入 MyBatis 中的 Log 接口,方便记录更多的操作信息。

  8. 增加 safeDelete 参数,配置为 true 后,delete 和 deleteByExample 都必须设置查询条件才能删除,否则会抛出异常(org.apache.ibatis.exceptions.PersistenceException)。

  9. 增加 safeUpdate 参数,配置为 true 后,updateByExample 和 updateByExampleSelective 都必须设置查询条件才能更新,否则会抛出异常(org.apache.ibatis.exceptions.PersistenceException)。常用的两个 updateByPrimaryKey和 updateByPrimaryKeySelective 由于要求必须使用主键,不存在这个问题。

  10. 增加 useJavaType 参数,设置 true 时如{id, javaType=java.lang.Long},对于使用 User extends Pk<Long> 形式时,需要设置,否则 mybatis 低版本(<3.4.0) 无法识别类型。

新增的参数可以参考 配置介绍

完善和修复问题

  • 解决使用 Config 对象配置通用 Mapper 时,部分参数不起作用的问题

  • 添加完善 @ColumnType 注解的测试用例

  • 添加完善 Id,Table,Column 三个注解的测试

  • 增加全面的 TypeHandler 测试。

  • update 上面的 @Options 注解在 3.2.x 版本时会影响清空二级缓存,已经去掉该注解。

  • 兼容 Spring Boot 2.0.0-RELEASE 版本。

移除的功能或参数

  • 移除 UUID 参数,不再支持 OGNL 方式对主键设置 UUID,如果有需要请通过 SQL 方式。

  • 移除对 @SequenceGenerator 注解的支持,IDENTITY 参数去掉了该注解提供的序列名,现在支持3个参数,顺序为列名({0})、属性名({1})、表名({2})。

项目升级

    只需要升级版本号,例如通用 Mapper:

<dependency>
	<groupId>tk.mybatis</groupId>
	<artifactId>mapper</artifactId>
	<version>4.0.0</version>
</dependency>

    使用 Spring Boot 时:

<dependency>
	<groupId>tk.mybatis</groupId>
	<artifactId>mapper-spring-boot-starter</artifactId>
	<version>2.0.0</version>
</dependency>

    虽然项目拆分了,但是在项目打包发布上屏蔽了这些细节。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Mybatis 通用 Mapper 4.0.0 发布
加载中

最新评论(24

Liuzh_533
Liuzh_533

引用来自“husonglin0”的评论

发现一个问题,映射的实体类如果修改了某个属性的get方法的返回类型,那么数据库字段值就无法映射到该实体的属性中,这个一个严重的问题,望采纳
来gitee或者github提个issue,最好能有简单的示例代码。
husonglin0
husonglin0
发现一个问题,映射的实体类如果修改了某个属性的get方法的返回类型,那么数据库字段值就无法映射到该实体的属性中,这个一个严重的问题,望采纳
Liuzh_533
Liuzh_533

引用来自“楓城”的评论

PostgreSql的主键生成策略应该如何配置?
和 sqlserver 类似,从反馈来看,自增主键名字需要是 id。。配置可以参考这儿:https://github.com/guozilanTK/base/blob/master/base-id/base-id-sqlserver/src/main/java/tk/guozilan/base/model/BaseId.java
楓城
PostgreSql的主键生成策略应该如何配置?
Liuzh_533
Liuzh_533

引用来自“高端大气上档次_”的评论

见上一楼 我想生成xml包含sql语句 为何里面没有呢? 只有一个resultMap
如果用了Mapper插件就没有,想完全用MBG生成就别配置Mapper插件。
高端大气上档次_
高端大气上档次_
见上一楼 我想生成xml包含sql语句 为何里面没有呢? 只有一个resultMap
高端大气上档次_
高端大气上档次_
<table tableName="tbl_user" domainObjectName="User" enableInsert="true" enableCountByExample="true"
enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true"
selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
高端大气上档次_
高端大气上档次_

引用来自“hakil”的评论

用了很久了,最大的痛点是缓存问题,二级缓存不可靠,但代码中自己实现缓存依然很麻烦。生产环境通过plugin拦截解析SQL方式将缓存存入Reids之中,暂时能解决部分问题。但缓存更新痛点依旧存在,目前根据Table表名清除所有该Table下所有缓存,精准更新或删除过于烦琐依旧没好的方案。建议作者下一版能考虑缓存问题。
你好 请问下二级缓存具体哪点不可靠呢 我也学习下 我感觉用的一切都挺ok的
Liuzh_533
Liuzh_533

引用来自“asknico”的评论

多数据源配置通用Mapper时,Invalid bound statement (not found) 咋解决呢?好像是 @autoconfigureafter 不起作用。求解答
回复@asknico : 用的不是动态数据源?
asknico
asknico
多数据源配置通用Mapper时,Invalid bound statement (not found) 咋解决呢?好像是 @autoconfigureafter 不起作用。求解答
返回顶部
顶部