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

    文章

    4941

    浏览量

    73137
  • Fluent
    +关注

    关注

    0

    文章

    25

    浏览量

    11981

原文标题:Fluent Mybatis 牛逼!

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    系统调用和API有什么区别

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

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

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

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

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

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

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

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

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

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

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

    从电表到云平台:安科瑞数字化方案如何唤醒罗森便利店节能潜力?

    罗森于1939年始创于美国,1975年从美国取得特许加盟许可后在日本开出了第一家店铺。目前,罗森发展成为了以便利店事业为核心,横跨便利店以及娱乐相关两大事业的大型集团。截止2022年12月底,共有
    的头像 发表于 05-12 10:05 400次阅读
    从电表到云平台:安科瑞数字化方案如何唤醒罗森<b class='flag-5'>便利</b>店节能潜力?

    安科瑞助力罗森便利店:解锁能源管理改造新篇章

    安科瑞徐赟杰18706165067 1 项目概括 罗森于1939年始创于美国,1975年从美国取得特许加盟许可后在日本开出了第一家店铺。目前,罗森发展成为了以便利店事业为核心,横跨便利店以及娱乐相关
    的头像 发表于 05-12 09:31 396次阅读
    安科瑞助力罗森<b class='flag-5'>便利</b>店:解锁能源管理改造新篇章

    用DLPA3000+DLPC3478+MSP430+SII1161(HDMI Reciever)设计产品,如何将板子运行起来

    您好,我们自己用DLPA3000+DLPC3478+MSP430+SII1161(HDMI Reciever)设计产品,请问如何一步一步的将板子运行起来?之前没做过这条线,还望详细指教下。我们
    发表于 02-28 06:39

    DeepSeek等AI大模型,人人都能当医生吗?

    作者:京东健康 王付刚 春节期间,DeepSeek的爆火无疑让大家对AI大模型有全新的认识和体验。与其他大模型不同之处,DeepSeek不仅提供答案,还输出推理过程,这一功能引起了大家的震惊和担忧
    的头像 发表于 02-13 11:19 6458次阅读

    hyper vm,hyper vm是什么工具

    ,为企业决策提供有力支持。今天就为大家介绍hypervm是什么工具。    Hyper-V是微软开发的原生虚拟化技术,允许用户在单个物理主机上创建和运行多个虚拟机(VM),每个虚拟机都拥有独立的操作系统、应用程序和资源。Hyper-V
    的头像 发表于 01-22 15:59 883次阅读
    hyper vm,hyper vm是什么工具<b class='flag-5'>呢</b>

    画板子的时候是应该怎么处理ADS5407的GND

    请问我使用ADS5407的时候,它的datasheet里面只提供一个地而且并没有说明GND是数字地还是模拟地,那我画板子的时候是应该怎么处理它的GND
    发表于 01-22 06:57

    使用DAC34H84 datasheet提供的参考上电配置顺序同步不了,datasheet上提供的同步顺序还有问题?

    PLL的N分频器,这样的话所有的DAC内部的OSTR应该就能保持同步,然后提供其他信号? 3、在提供ISTR时是不是也有讲究,我觉得ISTR应该跟OSTR是不是有时序关系(data
    发表于 01-15 07:12

    请问ADS1278是否需要提供负电压?

    ADS1278输入端采用运放THS4521,如果THS4521采用双电源供电并且为单端输入双端输出,输入交流信号,那是否也需要提供一个负电压给ADS1278?还是说ADS1278本身不需要提供负电压就可以??
    发表于 01-07 06:59

    卡诺模型为人工智能领域提供一种全新的视角

    在探索人工智能如何更深层次满足用户需求、提升用户体验的旅程中,卡诺模型(Kano Model)提供一个极具价值的理论框架。这一模型不仅为产品开发者带来了深刻的洞察力,同时也为人工智能领域的创新提供
    的头像 发表于 12-11 10:17 946次阅读