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

    文章

    4741

    浏览量

    68326
  • Fluent
    +关注

    关注

    0

    文章

    25

    浏览量

    11647

原文标题:Fluent Mybatis 牛逼!

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

收藏 人收藏

    评论

    相关推荐

    开发更便利!迅为RK3568/RK3588 定制分区镜像发布

    开发更便利!迅为RK3568/RK3588 定制分区镜像发布
    的头像 发表于 11-11 14:00 323次阅读
    开发更<b class='flag-5'>便利</b>!迅为RK3568/RK3588 定制分区镜像发布

    住宅静态IP:为家庭网络带来的安全与便利

    住宅静态IP地址为家庭网络带来了诸多安全与便利
    的头像 发表于 10-24 07:50 134次阅读

    住宅动态IP:如何为您的家庭网络带来便利

    住宅动态IP,作为现代家庭网络的一种配置方式,能够为家庭用户带来诸多便利
    的头像 发表于 10-21 08:00 189次阅读

    声波定位给我们日常生活带来哪些便利

    在科技日新月异的今天,声波定位技术作为一项前沿科技,正悄然改变着我们的生活方式,为日常生活带来了前所未有的便利与惊喜。这项技术,通过发射声波并接收其反射回来的信号,精确测量物体位置或距离,不仅在科研
    的头像 发表于 10-11 13:27 161次阅读

    ESP32-S3开启psram后,SD卡就无法挂载

    ESP32-S3开启psram后,SD卡就无法挂载
    发表于 06-05 06:00

    费米气体和超导是什么关系?费米子的代码让电阻消失

    金属里面自由电子构成的特殊气体,叫做“费米气体”。那么,费米气体和超导是什么关系
    的头像 发表于 04-26 10:41 535次阅读
    费米气体和超导是什么关系<b class='flag-5'>呢</b>?费米子的代码让电阻消失<b class='flag-5'>了</b>?

    农业现代化:UWB模块为农业领域带来的效益和便利

    随着科技的进步和农业现代化的推进,超宽带(UWB)技术正逐渐在农业领域发挥重要作用。UWB模块作为UWB技术的核心组成部分,具有高精度、实时性强的特点,为农业生产提供新的技术手段和解决方案。本文将
    的头像 发表于 04-12 15:02 433次阅读

    特信手提式无人机屏蔽器的开发:带来的便利与实际应用

    随着无人机技术的普及,其带来的安全隐患也日益凸显。手提式无人机屏蔽器的开发,为我们提供一个便携、高效的解决方案,为我们的日常生活和工作带来了诸多便利。跟着深圳市特信电子有限公司的小编一起来了解一下吧:
    的头像 发表于 04-07 09:06 361次阅读

    一键掌控多媒体:中央控制系统的便利

    随着科技的进步,多媒体设备在各个领域中的应用越来越广泛。而中央控制系统作为其核心组成部分,为用户提供一键掌控多媒体的便利性。本文将详细探讨中央控制系统的便利性,帮助您更好地了解其在实
    的头像 发表于 01-23 14:53 394次阅读

    是否可以简单的将两个稳压芯片进行并联提供更大的输出电流

    如果一个稳压芯片输出电流不能够满足要求,是否可以简单的将两个稳压芯片进行并联提供更大的输出电流? 下
    的头像 发表于 12-29 16:22 4292次阅读
    是否可以简单的将两个稳压芯片进行并联<b class='flag-5'>提供</b>更大的输出电流<b class='flag-5'>呢</b>?

    FPGA如何给AD9240提供CLK电压?

    我们需要 XILINX FPGA 给 AD9240 提供 8MHz CLK,AD9240 给 FPGA 提供采样数据和溢出标志,但 FPGA 提供的 CLK 最高 3.3V,请问如何输入给 AD9240
    发表于 12-08 06:54

    4G插卡路由器:无线上网的便利与灵活性

    4G插卡路由器:无线上网的便利与灵活性
    的头像 发表于 11-28 17:27 904次阅读

    Java提供哪些注释语句

    Java提供很多种类型的注释语句,它们都有不同的用途和作用。在本文中,我们将详细介绍Java中的注释语句类型,并讨论它们的用法和如何正确使用它们。 单行注释(Single-line
    的头像 发表于 11-28 16:56 578次阅读

    配网行波型故障预警与定位装置带来的便利有哪些

    随着科技的不断发展,电力系统的智能化水平也在不断提高。在这个过程中,配网行波型故障预警与定位装置作为一种新型的电力系统监控设备,为电力系统的稳定运行提供有力保障。本文将从以下几个方面阐述配网行波型
    发表于 11-28 09:55

    DDS为ROS的通信系统提供哪些特性

    质量服务策略QoS DDS为ROS的通信系统提供哪些特性?我们通过这个通信模型图来看下。 DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信,回忆下之前我们配置树莓派
    的头像 发表于 11-24 17:59 686次阅读
    DDS为ROS的通信系统<b class='flag-5'>提供</b><b class='flag-5'>了</b>哪些特性