Mybstis-Plus相信大家都很熟悉了,在Mybatis的基础上只做增强,不做改变,为简化开发,提高效率而生。目前Plus的活跃度还是很高的,现在的版本已经到3.5.9,我现在用的还是3.5.5呢。最近在研究Plus的一个问题偶然发现了mybatis-mp,官网查看以后发现确实比较强大,基本上不需要写sql了,究竟mp和plus谁更厉害,大家来评论一下吧。
介绍
Mybatis-mp是在mybatis的基础上进行扩展,方便、学习成本低、提供优雅的api,轻量级的orm,改动了少许mybatis代码,配置和mybatis一样。提供了Lamda 链式写法,尤其是QueryChain可以构建更复杂的查询场景;支持流程api设计,支持多表join,乐观锁,租户等特性;最重要的是兼容所有的数据库,而且是同时兼容,意味着我们只需要学一套代码就能实现不同的数据库crud,这一点是其他ORM不具有的。
最新版本是11月26日发布的1.7.6,按照目前的更新频率以及社区的活跃度,大概率有赶超plus的趋势啊。
十大亮点
- 默认值可以自定义、可动态设置
- 支持不同数据库主键自增配置 不同数据库自增逻辑是不一样的,使用不同的数据库需要配置不同的自增逻辑。mp完美的解决了这个问题。
- 可自动填充删除时间 支持多个标记字段、
- 提供sql模板 可以编写任意sql 遇到不符合orm的场景,不需要全部重写orm,支持改写部分sql
- mapWithKey 支持把查询结果转成map对象格式,快速提高效率
- 非实体类与实体类自动挂钩
- 良好的枚举支持
- mybatis.xml orm映射 (这一点plus也有)
- 优雅的xml和@Select 自动分页
- 多层嵌套、VO自动映射和自动select所需列 mp支持复杂的多表映射,多层级po,不需要每个字段手动select 了
快速开始
SpringBoot 2
cn.mybatis-mp
mybatis-mp-spring-boot-parent
1.7.6
pom
import
cn.mybatis-mp
mybatis-mp-spring-boot-starter
SpringBoot 3
cn.mybatis-mp
mybatis-mp-spring-boot-parent
1.7.6-spring-boot3
pom
import
cn.mybatis-mp
mybatis-mp-spring-boot-starter
mapper
public interface SysUserMapper extends MybatisMapper {
}
示例
@Service
public class Test{
@Autowired
private SysUserMapper sysUserMapper;
public void demo() {
Pager pager = QueryChain.of(sysUserMapper)
.eq(SysUser::getId,1)
.like(SysUser::getUserName,"xxx")
.paging(Pager.of(1,10));
}
}
特别说明
1、mybatis-mp 默认不对 null 、空字符 进行处理,这一点和plus是一样的。如果要更新空,需要我们自己处理。
2、mybatis-mp只涉及M层,不涉及Service Controller。Mapper层和Dao 层; 其实都是 Dao层;Mapper层其实一般都不是对外;而Dao 层是对外 面向Service的。
3、sql自动优化,主要是对 left join,order by优化。left join 最好是1对1的关系,否则需要自己关闭JOIN SQL优化,否则会导致count不准。
核心功能
1、QueryChain 链路查询
SysUserRoleVo sysUserRoleVo = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.join(SysUser.class, SysRole.class,on->on.eq(SysUser::getRole_id,SysRole::getId))
.eq(SysUser::getId,1)
.like(SysUser::getUserName,"abc")
.groupBy(SysUser::getId)
.having(SysUser::getId,c->c.count().gt(0))
.orderBy(SysUser::getId)
.returnType(SysUserRoleVo.class)
.get();
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
// 忽略 空字符串 条件参数
// 对字符串进行trim 去空格操作
.forSearch(true);
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
.ignoreNullValueInCondition(true)
// 忽略 空字符串 条件参数
.ignoreEmptyInCondition(true)
// 对字符串进行trim 去空格操作
.trimStringInCondition(true);
这两种写法是等同的。
提供魔法forSearch方式。
2、逻辑删除
逻辑删除增加beforeValue、afterValue、deleteTimeField。plus 的话只有一个标记删除字段isDelete
3、savebatch 真正的批量操作
总结
简单写了了demo试了一下基本可以和mybatis-plus打平,mp和plus各自有各自的特点,咱也不能一棒子打死就说谁好谁不好,能解决业务问题就是好。mp目前还算是一个新产品,稳定性、扩展性、安全性还有待市场检验。
好了,今天就介绍这么多了,欢迎大家评论区留言讨论。