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

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

3天内不再提示

FluentMybatis提供了哪些便利呢?

Android编程精选 来源:稀土掘金 作者:稻草江南 2022-06-10 10:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

场景需求设置

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


		

createtable`student_score` ( idbigintauto_increment comment'主键ID'primary key, student_id bigintnotnullcomment'学号', gender_man tinyint default0notnullcomment'性别, 0:女; 1:男', school_term intnullcomment'学期', subject varchar(30) nullcomment'学科', score intnullcomment'成绩', gmt_create datetime notnullcomment'记录创建时间', gmt_modified datetime notnullcomment'记录最后修改时间', is_deleted tinyint default0notnullcomment'逻辑删除标识' ) 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 andsubject in('英语', '数学', '语文') andscore >= 60 andis_deleted = 0 groupbyschool_term, subject havingcount(score) > 1 orderbyschool_term, subject;

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

三者对比

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

9782f770-e7e8-11ec-ba43-dac502259ad0.png

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

代码:https://gitee.com/fluent-mybatis/fluent-mybatis-docs/tree/master/spring-boot-demo/

换成mybatis原生实现效果

1. 定义Mapper接口


		

publicinterfaceMyStudentScoreMapper { ListString, Object>> summaryScore(SummaryQuery paras); }

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

		@Data @Accessors(chain = true) publicclassSummaryQuery { privateInteger schoolTerm; privateList<String> subjects; privateInteger score; privateInteger minCount; }3. 定义实现业务逻辑的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} and subject in <foreachcollection="subjects"item="item"open="("close=")"separator=","> #{item} foreach> and score >= #{score} and is_deleted = 0 groupbyschool_term, subject having count(score) > #{minCount} order byschool_term, subject select>4. 实现业务接口(这里是测试类, 实际应用中应该对应Dao类)

		@RunWith(SpringRunner.class) @SpringBootTest(classes = QuickStartApplication.class) publicclassMybatisDemo { @Autowired privateMyStudentScoreMapper mapper; @Test publicvoidmybatis_demo() {  SummaryQuery paras = newSummaryQuery() .setSchoolTerm(2000) .setSubjects(Arrays.asList("英语", "数学", "语文")) .setScore(60) .setMinCount(1); ListString, Object>> summary = mapper.summaryScore(paras); System.out.println(summary); } }总之,直接使用mybatis,实现步骤还是相当的繁琐,效率太低。那换成mybatis plus的效果怎样呢?

换成mybatis plus实现效果

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

97ab6296-e7e8-11ec-ba43-dac502259ad0.png

如红框圈出的,写mybatis plus实现用到了比较多字符串的硬编码(可以用Entity的get lambda方法部分代替字符串编码)。字符串的硬编码,会给开发同学造成不小的使用门槛,个人觉的主要有2点:1. 字段名称的记忆和敲码困难2. Entity属性跟随数据库字段发生变更后的运行时错误其他框架,比如TkMybatis在封装和易用性上比mybatis plus要弱,就不再比较了。生成代码编码比较

fluent mybatis生成代码设置


		publicclassAppEntityGenerator{ staticfinal String url = "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类parent package路径 **/ 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() { GlobalConfig config = newGlobalConfig(); DataSourceConfig dataSourceConfig = newDataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL) .setUrl(dbUrl) .setUsername("root") .setPassword("password") .setDriverName(Driver.class.getName()); StrategyConfig strategyConfig = 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(); } }

97e1be72-e7e8-11ec-ba43-dac502259ad0.png

看完3个框架对同一个功能点的实现, 各位看官肯定会有自己的判断,笔者这里也总结了一份比较。9844a514-e7e8-11ec-ba43-dac502259ad0.png

审核编辑 :李倩


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

    关注

    30

    文章

    4983

    浏览量

    74534
  • Fluent
    +关注

    关注

    0

    文章

    25

    浏览量

    12040

原文标题:Fluent Mybatis 牛逼!

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何为TEA2095T提供合适的Vcc

    我想设计一个 500W 的电源。输出50V 10A。 请问我能否将TEA2095T用于SR控制?据我所知,TEA2095T的供电电压最高可达38V。那么我该如何为TEA2095T提供合适的Vcc?因为我次级侧的输出电压为50V。
    发表于 05-15 06:10

    【节能学院】多店难管、电费难降?安科瑞为连锁便利提供智慧用电解决方案

    一、行业痛点:高能耗制约盈利对于连锁便利店品牌而言,24小时不打烊的便捷服务是盈利的底气,但电表上飞速跳动的数字,却往往成为运营的“隐忧”。中国连锁经营协会数据显示,便利店能耗占营收的12%-18
    的头像 发表于 03-19 08:42 425次阅读
    【节能学院】多店难管、电费难降?安科瑞为连锁<b class='flag-5'>便利</b>店<b class='flag-5'>提供</b>智慧用电解决方案

    分体 T5 LED 灯管的开关设计,怎样提升使用便利性?

    分体T5LED灯管的开关设计,怎样提升使用便利性?分体T5LED灯管开关设计:提升使用便利性的多维度解析分体T5LED灯管作为现代照明领域的重要产品,其开关设计对于提升使用便利性起着关键作用。以下
    的头像 发表于 02-12 13:11 355次阅读
    分体 T5 LED 灯管的开关设计,怎样提升使用<b class='flag-5'>便利</b>性?

    请问CW32系列微控制器提供哪些时钟源和定时器?

    CW32系列微控制器提供哪些时钟源和定时器?
    发表于 12-16 06:09

    系统调用和API有什么区别

    首先,什么是API?以汽车发动机为例: 档把就是发动机给你提供的api,当你想让汽车前进时只需要将其挂到“D”档位,然后轻踩油门就可以前进了,当你挂挡时你根本就不需要关心汽油是怎么进到发动机
    发表于 12-03 06:52

    海康威视当选国际贸易便利化分会常务理事单位

    11月18日上午,“粤港澳大湾区珠三角西岸进出口贸易通关便利化交流会暨中国出入境检验检疫协会国际贸易便利化分会成立大会”在珠海顺利召开。海康威视正式成为该分会发起成立后的首批常务理事单位之一。
    的头像 发表于 11-24 13:43 729次阅读

    ART-Pi中启用外部flash是在哪里配置qspi的引脚

    1、我目前是自己学习画了一块儿板子,想要学习rtthread+lvgl,我在添加完lvgl包的时候报错rom超。于是了解到需要使用外部flash。我的板子上也连接了QSPI接口的W25Q64JV
    发表于 10-10 06:09

    工业互联网平台如何为设备运维提供便利

    工业互联网平台通过整合数据采集、分析建模、远程协作、资源调度等能力,将传统设备运维从“被动抢修”“定期巡检”模式,升级为“预测性维护”“智能化运维”模式,从多个维度为设备运维提供核心便利,大幅提升
    的头像 发表于 09-08 14:19 570次阅读
    工业互联网平台如何为设备运维<b class='flag-5'>提供</b><b class='flag-5'>便利</b>

    什么是Wi-Fi 6 技术,在人们生活中有哪些便利应用

    silex希来科告诉您什么是Wi-Fi 6 技术,在人们生活中有哪些便利应用
    的头像 发表于 08-28 09:19 1375次阅读
    什么是Wi-Fi 6 技术,在人们生活中有哪些<b class='flag-5'>便利</b>应用

    3Dfindit 提供的数字立方体模型为研究项目的可视化提供支持

    作为学习项目的一部分,罗伊特林根教育大学的学生们在比辛根集中营纪念地的博物馆中使用 3Dfindit 动画立方体模型进行了学习。作为历史教学研讨会的一部分,学生们研究巴登-符腾堡州比辛根在
    发表于 08-01 14:36

    30千瓦的显示屏EMC如何整改

    南柯电子|30千瓦的显示屏EMC如何整改
    的头像 发表于 07-24 09:35 872次阅读

    恩智浦FS24功能安全SBC芯片详解 为区域控制器节点设计提供便利

    转变为区域控制器的节点单元。 针对这些节点单元,恩智浦不仅提供相应的处理器方案,还推出了节点的SBC芯片。本文将为大家详细介绍符合功能安全ASIL-B系统需求的FS24 SBC芯片。 FS24是一款高集成度的SBC,其内部集成了两路电源和一路C
    的头像 发表于 07-11 20:53 4685次阅读
    恩智浦FS24功能安全SBC芯片详解 为区域控制器节点设计<b class='flag-5'>提供</b><b class='flag-5'>便利</b>

    NVMe IP高速传输却不依赖便利的XDMA设计之三:系统架构

    ) 使用 AXI 总线接口。 设计使用标准化的 AXI 总线接口提供系统控制和数据传输功能, 在保证传输性能的同时, 更容易集成到应用环境中。 (5) 多队列并行管理与动态配置。 支持的最大 I/O 提交队列
    发表于 06-29 17:42

    HarmonyOS实战:实现任意拖动的应用悬浮窗口

    为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口?阅读完本篇文章你将学会在鸿蒙上如何实现这一功能。
    的头像 发表于 06-24 17:04 1502次阅读

    30千瓦的移动电源EMC如何整改

    南柯电子|30千瓦的移动电源EMC如何整改
    的头像 发表于 06-06 09:40 1076次阅读
    30千瓦的移动电源EMC如何整改<b class='flag-5'>呢</b>?