0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Fluent Mybatis、原生Mybatis和Mybatis Plus对比

我快闭嘴 来源:稀土掘金技术社区 作者:稻草江南 2022-09-15 15:41 次阅读

使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数。那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?

需求场景设置

我们通过一个比较典型的业务需求来具体实现和对比下,假如有学生成绩表结构如下:

createtable`student_score`
(
idbigintauto_incrementcomment'主键ID'primarykey,
student_idbigintnotnullcomment'学号',
gender_mantinyintdefault0notnullcomment'性别,0:女;1:男',
school_termintnullcomment'学期',
subjectvarchar(30)nullcomment'学科',
scoreintnullcomment'成绩',
gmt_createdatetimenotnullcomment'记录创建时间',
gmt_modifieddatetimenotnullcomment'记录最后修改时间',
is_deletedtinyintdefault0notnullcomment'逻辑删除标识'
)engine=InnoDBdefaultcharset=utf8;

现在有需求:

统计2000年三门学科('英语', '数学', '语文')及格分数按学期,学科统计最低分,最高分和平均分, 且样本数需要大于1条,统计结果按学期和学科排序

我们可以写SQL语句如下

selectschool_term,
subject,
count(score)ascount,
min(score)asmin_score,
max(score)asmax_score,
avg(score)asmax_score
fromstudent_score
whereschool_term>=2000
andsubjectin('英语','数学','语文')
andscore>=60
andis_deleted=0
groupbyschool_term,subject
havingcount(score)>1
orderbyschool_term,subject;

那上面的需求,分别用fluent mybatis, 原生mybatis 和 Mybatis plus来实现一番。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

三者实现对比

使用fluent mybatis 来实现上面的功能

ff4ebcc8-317a-11ed-ba43-dac502259ad0.png

具体代码

我们可以看到fluent api的能力,以及IDE对代码的渲染效果。

换成mybatis原生实现效果

  1. 定义Mapper接口
publicinterfaceMyStudentScoreMapper{
List>summaryScore(SummaryQueryparas);
}

  1. 定义接口需要用到的参数实体 SummaryQuery
@Data
@Accessors(chain=true)
publicclassSummaryQuery{
privateIntegerschoolTerm;

privateListsubjects;

privateIntegerscore;

privateIntegerminCount;
}

  1. 定义实现业务逻辑的mapper xml文件
<selectid="summaryScore"resultType="map"parameterType="cn.org.fluent.mybatis.springboot.demo.mapper.SummaryQuery">
selectschool_term,
subject,
count(score)ascount,
min(score)asmin_score,
max(score)asmax_score,
avg(score)asmax_score
fromstudent_score
whereschool_term>=#{schoolTerm}
andsubjectin
<foreachcollection="subjects"item="item"open="("close=")"separator=",">
#{item}
foreach>
andscore>=#{score}
andis_deleted=0
groupbyschool_term,subject
havingcount(score)>#{minCount}
orderbyschool_term,subject
select>

  1. 实现业务接口(这里是测试类, 实际应用中应该对应Dao类)
@RunWith(SpringRunner.class)
@SpringBootTest(classes=QuickStartApplication.class)
publicclassMybatisDemo{
@Autowired
privateMyStudentScoreMappermapper;

@Test
publicvoidmybatis_demo(){
//构造查询参数
SummaryQueryparas=newSummaryQuery()
.setSchoolTerm(2000)
.setSubjects(Arrays.asList("英语","数学","语文"))
.setScore(60)
.setMinCount(1);

List>summary=mapper.summaryScore(paras);
System.out.println(summary);
}
}

总之,直接使用mybatis,实现步骤还是相当的繁琐,效率太低。那换成mybatis plus的效果怎样呢?

换成mybatis plus实现效果

mybatis plus的实现比mybatis会简单比较多,实现效果如下

ff827bda-317a-11ed-ba43-dac502259ad0.png

如红框圈出的,写mybatis plus实现用到了比较多字符串的硬编码(可以用Entity的get lambda方法部分代替字符串编码)。字符串的硬编码,会给开发同学造成不小的使用门槛,个人觉的主要有2点:

  1. 字段名称的记忆和敲码困难
  2. Entity属性跟随数据库字段发生变更后的运行时错误

其他框架,比如TkMybatis在封装和易用性上比mybatis plus要弱,就不再比较了。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

生成代码编码比较

fluent mybatis生成代码设置

publicclassAppEntityGenerator{
staticfinalStringurl="jdbc//localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";

publicstaticvoidmain(String[]args){
FileGenerator.build(Abc.class);
}

@Tables(
/**数据库连接信息**/
url=url,username="root",password="password",
/**Entity类parentpackage路径**/
basePack="cn.org.fluent.mybatis.springboot.demo",
/**Entity代码源目录**/
srcDir="spring-boot-demo/src/main/java",
/**Dao代码源目录**/
daoDir="spring-boot-demo/src/main/java",
/**如果表定义记录创建,记录修改,逻辑删除字段**/
gmtCreated="gmt_create",gmtModified="gmt_modified",logicDeleted="is_deleted",
/**需要生成文件的表(表名称:对应的Entity名称)**/
tables=@Table(value={"student_score"})
)
staticclassAbc{
}
}

mybatis plus代码生成设置

publicclassCodeGenerator{

staticStringdbUrl="jdbc//localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";

@Test
publicvoidgenerateCode(){
GlobalConfigconfig=newGlobalConfig();
DataSourceConfigdataSourceConfig=newDataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl(dbUrl)
.setUsername("root")
.setPassword("password")
.setDriverName(Driver.class.getName());
StrategyConfigstrategyConfig=newStrategyConfig();
strategyConfig
.setCapitalMode(true)
.setEntityLombokModel(false)
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setEntityTableFieldAnnotationEnable(true)
.setFieldPrefix(newString[]{"test_"})
.setInclude(newString[]{"student_score"})
.setLogicDeleteFieldName("is_deleted")
.setTableFillList(Arrays.asList(
newTableFill("gmt_create",FieldFill.INSERT),
newTableFill("gmt_modified",FieldFill.INSERT_UPDATE)));

config
.setActiveRecord(false)
.setIdType(IdType.AUTO)
.setOutputDir(System.getProperty("user.dir")+"/src/main/java/")
.setFileOverride(true);

newAutoGenerator().setGlobalConfig(config)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setPackageInfo(
newPackageConfig()
.setParent("com.mp.demo")
.setController("controller")
.setEntity("entity")
).execute();
}
}

FluentMybatis特性一览

ff97dbe2-317a-11ed-ba43-dac502259ad0.png

三者对比总结

看完3个框架对同一个功能点的实现, 各位看官肯定会有自己的判断,笔者这里也总结了一份比较。

- Mybatis Plus Fluent Mybatis
代码生成 生成 Entity 生成Entity, 再通过编译生成 Mapper, Query, Update 和 SqlProvider
Generator易用性
和Mybatis的共生关系 需替换原有的SqlSessionFactoryBean 对Mybatis没有任何修改,原来怎么用还是怎么用
动态SQL构造方式 应用启动时, 根据Entity注解信息构造动态xml片段,注入到Mybatis解析器 应用编译时,根据Entity注解,编译生成对应方法的SqlProvider,利用mybatis的Mapper上@InsertProvider @SelectProvider @UpdateProvider注解关联
动态SQL结果是否容易DEBUG跟踪 不容易debug 容易,直接定位到SQLProvider方法上,设置断点即可
动态SQL构造 通过硬编码字段名称, 或者利用Entity的get方法的lambda表达式 通过编译手段生成对应的方法名,直接调用方法即可
字段变更后的错误发现 通过get方法的lambda表达的可以编译发现,通过字段编码的无法编译发现 编译时便可发现
不同字段动态SQL构造方法 通过接口参数方式 通过接口名称方式, FluentAPI的编码效率更高
语法渲染特点 通过关键变量select, update, set, and, or可以利用IDE语法渲染, 可读性更高


审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Fluent
    +关注

    关注

    0

    文章

    25

    浏览量

    11603
  • mybatis
    +关注

    关注

    0

    文章

    57

    浏览量

    6646

原文标题:Fluent Mybatis、原生Mybatis,、Mybatis Plus 大对比,哪个更好用?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文了解MyBatis的查询原理

    本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本文
    的头像 发表于 10-10 11:42 1088次阅读

    Mybatis的内部设计介绍

    Mybatis源码分析-整体设计(一)
    发表于 06-06 09:43

    数据库整合Mybatis框架

    微服务 SpringBoot 20(九):整合Mybatis
    发表于 07-16 11:03

    MyBatis的整合

    SpringBoot-15-之整合MyBatis-注解篇+分页
    发表于 10-28 08:09

    MyBatis学习笔记-HelloWorld

    (二)MyBatis学习笔记-HelloWorld
    发表于 06-02 14:51

    Mybatis是什么

    Mybatis第一讲
    发表于 06-04 15:33

    mybatis快速入门

    本文详细介绍了mybatis相关知识,以及mybatis快速入门步骤详解。
    的头像 发表于 02-24 09:41 3168次阅读
    <b class='flag-5'>mybatis</b>快速入门

    MyBatis的实现原理

    本文主要详细介绍了MyBatis的实现原理。mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession Executor
    的头像 发表于 02-24 11:25 6286次阅读
    <b class='flag-5'>MyBatis</b>的实现原理

    Mybatis-Plus Mybatis增强工具包

    ./oschina_soft/gitee-mybatis-plus.zip
    发表于 06-13 11:34 1次下载
    <b class='flag-5'>Mybatis-Plus</b> <b class='flag-5'>Mybatis</b>增强工具包

    easy-mybatis Mybatis的增强框架

    ./oschina_soft/gitee-easy-mybatis.zip
    发表于 06-14 09:45 1次下载
    easy-<b class='flag-5'>mybatis</b> <b class='flag-5'>Mybatis</b>的增强框架

    MyBatis-Plus的使用与测试

    本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。
    的头像 发表于 08-22 11:56 966次阅读

    源码学习之MyBatis的底层查询原理

    本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本文
    的头像 发表于 10-10 11:42 491次阅读

    MyBatis-Plus为什么不支持联表

    MyBatis Plus Join`一款专门解决MyBatis Plus 关联查询问题的扩展框架,他并不一款全新的框架,而是基于`MyBatis
    的头像 发表于 02-28 15:19 1767次阅读
    <b class='flag-5'>MyBatis-Plus</b>为什么不支持联表

    介绍一款基于Mybatis-Plus的代码自助生成器

    在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。
    的头像 发表于 05-23 14:16 856次阅读
    介绍一款基于<b class='flag-5'>Mybatis-Plus</b>的代码自助生成器

    mybatis和mybatisplus的区别

    是一个轻量级的持久层框架,它提供了一个灵活的SQL映射机制,使得开发者可以编写原生SQL语句来操作数据库。MyBatis的设计目标是将原生SQL和对象关系映射(ORM)相结合,以便开发者可以灵活地操作数据库。 而
    的头像 发表于 12-03 11:53 1335次阅读