您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

超越 Mybatis-Plus?超强 ORM 框架横空出世

时间:2023-07-27 20:49:02  来源:今日头条  作者:老诚不bug

最近逛开源社区的时候,偶尔发现了一个 MyBatis 增强框架-MyBatis-Flex ,感觉挺不错的,集合了 MyBatis-Plus、Fluent-MyBatis 的优点。

 

MyBatis-Flex 的作者是一位技术大佬,还开源了知名 CMS 系统 JPress 以及微服务框架 JFinal。

个人认为这个框架还是挺有潜力的,准备后面在个人项目中试试。同时,也希望这个项目能够持续维护下去,不断完善。

MyBatis-Flex 介绍

根据官网介绍,MyBatis-Flex 是一个优雅的 MyBatis 增强框架,具备下面这些特点:

  • 轻量:除了 MyBatis 本身,再无任何第三方依赖。
  • 灵活且强大:提供了非常灵活的 QueryWrApper,支持关联查询、多表查询、多主键、逻辑删除、乐观锁更新、数据填充、数据脱敏、等等....。
  • 性能高:性能比传统的 MyBatis 增强框架比如 MyBatis-Plus 要更优秀。

MyBatis-Flex 几乎支持所有主流的数据库,例如,MySQL、MariaDB、DB2、PostgreSQL、SQLite、达梦、人大金仓等等。并且,还可以通过自定义方言的方式,持续添加更多的数据库支持。

多提一点:QueryWrapper 是 MyBatis-Flex 的核心类,增删改、查询和分页都是借助 QueryWrapper 实现的。并且,QueryWrapper 可以被序列化通过 RPC 进行传输,因此,在微服务项目中,我们可以在客户端(网关、Controller 层等)构造出 QueryWrapper,传给 Provider 层进行查询返回数据。

MyBatis-Flex vs MyBatis-Plus

MyBatis-Flex 直接对标老牌 MyBatis 增强框架 MyBatis-Plus,根据官方文档显示,其在功能性和性能上都要更优秀一些。

MyBatis-Flex 和 MyBatis-Plus 的功能对比如下(数据来源于 MyBatis-Flex 官方文档):

 

从上图可以看到,像数据填充、数据脱敏、字段权限等 MyBatis-Plus 收费才能使用的功能,MyBatis-Flex 直接可以免费使用。

MyBatis-Flex 和 MybAIts-Plus 的性能对比,大家可以直接看官方文档提供的数据即可(地址:https://mybatis-flex.com/zh/intro/benchmark.html)。根据官方提供的案例的测试结果显示,MyBatis-Flex 的综合性能表现大概是 MyBatis-Plus 的 5~10 倍左右。

  • MyBatis-Flex 的查询单条数据的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
  • MyBatis-Flex 的查询 10 条数据的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
  • Mybatis-Flex 的分页查询速度,大概是 Mybatis-Plus 的 5~10 倍左右。
  • Mybatis-Flex 的数据更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。

测试源码在这里:https://gitee.com/mybatis-flex/mybatis-benchmark ,如果对数据存疑的话,可以自行本地测试一下。

下面再来简单对比一下 MyBatis-Flex 和 Mybaits-Plus 在写法上的区别。

1、基础查询

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create()
        .where(EMPLOYEE.LAST_NAME.like(searchword)) //条件为null时自动忽略
        .and(EMPLOYEE.GENDER.eq(1))
        .and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query()
        .like(searchWord != null, "last_name", searchWord)
        .eq("gender", 1)
        .gt("age", 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

或者 MyBatis-Plus 的 lambda 写法:

LambdaQueryWrapper<Employee> queryWrapper = Wrappers.<Employee>lambdaQuery()
        .like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B")
        .eq(Employee::getGender, 1)
        .gt(Employee::getAge, 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

2、多表查询

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create()
    .select().from(ACCOUNT)
    .leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))
    .where(ACCOUNT.AGE.ge(10));

List<Account> accounts = mapper.selectListByQuery(query);

MyBatis-Plus:

// 不支持~~~~

3、部分字段更新

MyBatis-Flex :

Account account = UpdateEntity.of(Account.class);
account.setId(100); //设置主键
account.setUserName("michael");
account.setAge(18);
account.setBirthday(null);

accountMapper.update(account);

MyBatis-Plus:

UpdateWrapper<Account> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 100);
updateWrapper.set("user_name", "michael");
updateWrapper.set("age", 18);
updateWrapper.set("birthday", null);

accountMapper.update(null, updateWrapper);

MyBatis-Flex 的核心功能

MyBatis-Flex 的核心功能非常多,这里挑选个别比较有意思的进行简单介绍,官方文档已经介绍的非常详细了。

 

数据脱敏

数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。

MyBatis-Flex 提供了 @ColumnMask() 注解,以及内置的 9 种脱敏规则,开箱即用:

  • 用户名脱敏
  • 手机号脱敏
  • 固定电话脱敏
  • 身份证号脱敏
  • 车牌号脱敏
  • 地址脱敏
  • 邮件脱敏
  • 密码脱敏
  • 银行卡号脱敏
/**
 * 内置的数据脱敏方式
 */
public class Masks {
    /**
     * 手机号脱敏
     */
    public static final String MOBILE = "mobile";
    /**
     * 固定电话脱敏
     */
    public static final String FIXED_PHONE = "fixed_phone";
    /**
     * 身份证号脱敏
     */
    public static final String ID_CARD_NUMBER = "id_card_number";
    /**
     * 中文名脱敏
     */
    public static final String CHINESE_NAME = "chinese_name";
    /**
     * 地址脱敏
     */
    public static final String ADDRESS = "address";
    /**
     * 邮件脱敏
     */
    public static final String EMAIL = "email";
    /**
     * 密码脱敏
     */
    public static final String PASSWORD = "password";
    /**
     * 车牌号脱敏
     */
    public static final String CAR_LICENSE = "car_license";
    /**
     * 银行卡号脱敏
     */
    public static final String BANK_CARD_NUMBER = "bank_card_number";
    //...
}

使用示例:

@Table("tb_account")
public class Account {

    @Id(keyType = KeyType.Auto)
    private Long id;

    @ColumnMask(Masks.CHINESE_NAME)
    private String userName;

    @ColumnMask(Masks.EMAIL)
    private String email;

}

如果这些内置的脱敏规则不满足你的要求的话,你还可以自定义脱敏规则。

多数据源

MyBaits-Flex 内置了功能完善的多数据源支持,无需借助其他第三方插件或者依赖,支持包括 druid、hikaricp、dbcp2、beecp 在内的任何数据源。

Spring 框架下的配置如下(无 Spring 框架的场景下,同样也可以编码的形式使用):

mybatis-flex:
  datasource:
    ds1:
      type: druid
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
      asyncInit: true
    ds2:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

默认使用第一个配置的数据源,可以通过编码的方式其他的数据源。

List<Row> rows =  DataSourceKey.use("ds2"
    , () -> Db.selectAll("tb_account"));

在多租户等某些场景下,动态的添加新的数据源也是支持的。

FlexDataSource flexDataSource = (FlexDataSource) FlexGlobalConfig
        .getDefaultConfig().getConfiguration()
        .getEnvironment().getDataSource();

//新的数据源
HikariDataSource newDataSource = new HikariDataSource();

flexDataSource.addDataSource("newKey", newDataSource);

字段加密

字段加密指的是我们从数据库中取出数据的时候,对其中的一些字段进行加密,这样返回的内容为加密内容,而非明文内容。

字段加密的功能实现依赖于 MyBatis-Flex 实体类监听:

public class AccountOnSetListener implements SetListener {
    @Override
    public Object onSet(Object entity, String property, Object value) {

        if (value != null){
            //对字段内容进行加密
            value = encrypt(value);
        }

        return value;
    }
}

@Table(value = "tb_account", onSet = AccountOnSetListener.class)
public class Account {

    @Id(keyType = KeyType.Auto)
    private Long id;

    private String userName;

    private String password;

    //getter setter
}

除了字段加密之外,字典回写、字段权限、字段脱敏等功能的实现都依赖于实体类监听。

总结

这篇文章我们简单对比了 MyBatis-Flex 和 MyBatis-Plus ,并对 MyBatis-Flex 的个别核心功能进行了简单介绍。

更多关于 MyBatis-Flex 的介绍,大家可以去 MyBatis-Flex 的官网看看,地址:https://mybatis-flex.com/ 。

来源:
https://mp.weixin.qq.com/s/wvk_twc-DCURiNiE5njFXA



Tags:ORM 框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Go 语言流行 ORM 框架
ORM,全称 Object-Relational Mapping,即对象-关系映射,是一种程序设计技术,用于实现面向对象编程语言里对象的表现形式与关系数据库中数据的存储之间的转换。在实际工作中,我们...【详细内容】
2023-10-05  Search: ORM 框架  点击:(230)  评论:(0)  加入收藏
超越 Mybatis-Plus?超强 ORM 框架横空出世
最近逛开源社区的时候,偶尔发现了一个 MyBatis 增强框架-MyBatis-Flex ,感觉挺不错的,集合了 MyBatis-Plus、Fluent-MyBatis 的优点。 MyBatis-Flex 的作者是一位技术大佬,还开...【详细内容】
2023-07-27  Search: ORM 框架  点击:(265)  评论:(0)  加入收藏
java开发之Java ORM 框架推荐
1 前言ObjectiveSQL 是一个Java ORM 框架,它不仅是Active Record 模式在Java 中的应用,同时还针对复杂SQL 编程提供近乎完美的解决方案,使得Java 代码与SQL 语句有机的结合,改变...【详细内容】
2021-12-13  Search: ORM 框架  点击:(342)  评论:(0)  加入收藏
Pony - 最智能的 Python ORM 框架
在代码里手写 SQL 并不是一件愉快的事情,故而,代码中往往使用 ORM,把代码中定义的数据模型、查询和数据操作转换为 SQL 语言来操作数据库。不同的 ORM,对于数据库操作的抽象程度...【详细内容】
2020-08-06  Search: ORM 框架  点击:(1319)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(53)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(67)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条