最近逛开源社区的时候,偶尔发现了一个 MyBatis 增强框架-MyBatis-Flex ,感觉挺不错的,集合了 MyBatis-Plus、Fluent-MyBatis 的优点。
MyBatis-Flex 的作者是一位技术大佬,还开源了知名 CMS 系统 JPress 以及微服务框架 JFinal。
个人认为这个框架还是挺有潜力的,准备后面在个人项目中试试。同时,也希望这个项目能够持续维护下去,不断完善。
根据官网介绍,MyBatis-Flex 是一个优雅的 MyBatis 增强框架,具备下面这些特点:
MyBatis-Flex 几乎支持所有主流的数据库,例如,MySQL、MariaDB、DB2、PostgreSQL、SQLite、达梦、人大金仓等等。并且,还可以通过自定义方言的方式,持续添加更多的数据库支持。
多提一点:QueryWrapper 是 MyBatis-Flex 的核心类,增删改、查询和分页都是借助 QueryWrapper 实现的。并且,QueryWrapper 可以被序列化通过 RPC 进行传输,因此,在微服务项目中,我们可以在客户端(网关、Controller 层等)构造出 QueryWrapper,传给 Provider 层进行查询返回数据。
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 倍左右。
测试源码在这里: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 提供了 @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