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

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

3天内不再提示

Mybatis Plus或者其他框架及FluentMybatis提供了哪些便利呢?

jf_ro2CN3Fa 来源:稀土掘金 2023-02-03 15:16 次阅读

使用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来实现一番。

三者实现对比

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

9afa7b56-a2ed-11ed-bfe3-dac502259ad0.png

具体代码

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

换成mybatis原生实现效果

定义Mapper接口

publicinterfaceMyStudentScoreMapper{
List>summaryScore(SummaryQueryparas);
}

定义接口需要用到的参数实体 SummaryQuery

@Data
@Accessors(chain=true)
publicclassSummaryQuery{
privateIntegerschoolTerm;

privateListsubjects;

privateIntegerscore;

privateIntegerminCount;
}

定义实现业务逻辑的mapper xml文件


selectschool_term,
subject,
count(score)ascount,
min(score)asmin_score,
max(score)asmax_score,
avg(score)asmax_score
fromstudent_score
whereschool_term>=#{schoolTerm}
andsubjectin

#{item}

andscore>=#{score}
andis_deleted=0
groupbyschool_term,subject
havingcount(score)>#{minCount}
orderbyschool_term,subject


实现业务接口(这里是测试类, 实际应用中应该对应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会简单比较多,实现效果如下

9b2f8e2c-a2ed-11ed-bfe3-dac502259ad0.png

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

字段名称的记忆和敲码困难

Entity属性跟随数据库字段发生变更后的运行时错误

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

生成代码编码比较

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特性一览

9bd08fac-a2ed-11ed-bfe3-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语法渲染, 可读性更高






审核编辑:刘清

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

    关注

    0

    文章

    183

    浏览量

    32937
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43468
  • API串口
    +关注

    关注

    0

    文章

    13

    浏览量

    4820

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

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

收藏 人收藏

    评论

    相关推荐

    mybatis plus的常规用法

    上篇文章我们介绍过通过 Mybatis Plus 进行增删改查,如下这段代码: /** * 根据id修改 * UPDATE user SET user_name=?, user_age
    的头像 发表于 09-25 15:06 438次阅读
    <b class='flag-5'>mybatis</b> <b class='flag-5'>plus</b>的常规用法

    mybatis的开发环境搭建

    mybatis是个ORM(Object RelationalMapping 对象模型到关系模型的映射)框架。解决对象模型到二维表的关系模型的阻抗不匹配的问题。ORM框架在三层结构中,处在持久层,业务层调用持久层,持久层与数据库打
    发表于 05-27 06:19

    数据库整合Mybatis框架

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

    mybatis是什么_MyBatis的优缺点详解_mybatis框架入门详解

    Mybatis框架是别人开发的一种半成品软件,可以用来通过定制辅助快速开发是工具。MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory
    发表于 02-24 09:16 1.9w次阅读

    一篇让你熟练掌握 MyBatis-Plus

    MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率。下文使用缩写 mp来简化表示 MyBatis-plus,本文主要介绍 mp 搭配 Spring Boot
    的头像 发表于 06-01 09:30 2371次阅读
    一篇让你熟练掌握 <b class='flag-5'>MyBatis-Plus</b>!

    FluentMybatis提供了哪些便利呢?

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

    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>的增强<b class='flag-5'>框架</b>

    MyBatis-Plus的使用与测试

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

    MyBatis-Plus为什么不支持联表

    MyBatis Plus Join`一款专门解决MyBatis Plus 关联查询问题的扩展框架,他并不一款全新的
    的头像 发表于 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 25倍性能

    最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。
    的头像 发表于 05-30 09:56 386次阅读
    如何调优<b class='flag-5'>MyBatis</b> 25倍性能

    SpringBoot+Mybatis如何实现流式查询?

    使用mybatis作为持久层的框架时,通过mybatis执行查询数据的请求执行成功后,mybatis返回的结果集不是一个集合或对象,而是一个迭代器,可以通过遍历迭代器来取出结果集
    的头像 发表于 06-12 09:57 582次阅读

    mybatis和mybatisplus的区别

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

    mybatis框架的主要作用

    MyBatis框架是一种流行的Java持久化框架,主要用于简化数据库操作和管理。它提供了一种简洁的方式来访问数据库,并将SQL语句从Java代码中分离出来,从而提高了代码的可维护性和可
    的头像 发表于 12-03 14:49 1111次阅读