使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。

不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数。那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?

需求场景设置

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

create table `student_score`
(id           bigint auto_increment comment '主键ID' primary key,student_id   bigint            not null comment '学号',gender_man   tinyint default 0 not null comment '性别, 0:女; 1:男',school_term  int               null comment '学期',subject      varchar(30)       null comment '学科',score        int               null comment '成绩',gmt_create   datetime          not null comment '记录创建时间',gmt_modified datetime          not null comment '记录最后修改时间',is_deleted   tinyint default 0 not null comment '逻辑删除标识'
) engine = InnoDB default charset=utf8;

现在有需求:

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

我们可以写SQL语句如下

select school_term,subject,count(score) as count,min(score)   as min_score,max(score)   as max_score,avg(score)   as max_score
from student_score
where school_term >= 2000and subject in ('英语', '数学', '语文')and score >= 60and is_deleted = 0
group by school_term, subject
having count(score) > 1
order by school_term, subject;

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

三者实现对比

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

图片

具体代码

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

换成mybatis原生实现效果

  1. 定义Mapper接口

public interface MyStudentScoreMapper {List<Map<String, Object>> summaryScore(SummaryQuery paras);
}
  1. 定义接口需要用到的参数实体 SummaryQuery

@Data
@Accessors(chain = true)
public class SummaryQuery {private Integer schoolTerm;private List<String> subjects;private Integer score;private Integer minCount;
}
  1. 定义实现业务逻辑的mapper xml文件

<select id="summaryScore" resultType="map" parameterType="cn.org.fluent.mybatis.springboot.demo.mapper.SummaryQuery">select school_term,subject,count(score) as count,min(score) as min_score,max(score) as max_score,avg(score) as max_scorefrom student_scorewhere school_term >= #{schoolTerm}and subject in<foreach collection="subjects" item="item" open="(" close=")" separator=",">#{item}</foreach>and score >= #{score}and is_deleted = 0group by school_term, subjecthaving count(score) > #{minCount}order by school_term, subject
</select>
  1. 实现业务接口(这里是测试类, 实际应用中应该对应Dao类)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = QuickStartApplication.class)
public class MybatisDemo {@Autowiredprivate MyStudentScoreMapper mapper;@Testpublic void mybatis_demo() {// 构造查询参数SummaryQuery paras = new SummaryQuery().setSchoolTerm(2000).setSubjects(Arrays.asList("英语", "数学", "语文")).setScore(60).setMinCount(1);List<Map<String, Object>> summary = mapper.summaryScore(paras);System.out.println(summary);}
}

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

换成mybatis plus实现效果

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

图片

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

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

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

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

生成代码编码比较

fluent mybatis生成代码设置

public class AppEntityGenerator {static final String url = "jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";public static void main(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"}))static class Abc {}
}

mybatis plus代码生成设置

public class CodeGenerator {static String dbUrl = "jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";@Testpublic void generateCode() {GlobalConfig config = new GlobalConfig();DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setDbType(DbType.MYSQL).setUrl(dbUrl).setUsername("root").setPassword("password").setDriverName(Driver.class.getName());StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setCapitalMode(true).setEntityLombokModel(false).setNaming(NamingStrategy.underline_to_camel).setColumnNaming(NamingStrategy.underline_to_camel).setEntityTableFieldAnnotationEnable(true).setFieldPrefix(new String[]{"test_"}).setInclude(new String[]{"student_score"}).setLogicDeleteFieldName("is_deleted").setTableFillList(Arrays.asList(new TableFill("gmt_create", FieldFill.INSERT),new TableFill("gmt_modified", FieldFill.INSERT_UPDATE)));config.setActiveRecord(false).setIdType(IdType.AUTO).setOutputDir(System.getProperty("user.dir") + "/src/main/java/").setFileOverride(true);new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig).setPackageInfo(new PackageConfig().setParent("com.mp.demo").setController("controller").setEntity("entity")).execute();}
}

FluentMybatis特性一览

图片

三者对比总结

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

图片
IT技术分享社区个人博客网站:https://programmerblog.xyz文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

Java技术:干掉 XML配置文件,新出的 Fluent Mybatis 技术真香!相关推荐

  1. java加载xml配置文件_java读取配置文件的几种方法

    原标题:java读取配置文件的几种方法 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring ...

  2. maven项目编译漏掉src/main/java下的xml配置文件

    在整合Spring + Mybatis框架的时候,自动扫描配置都已经配置好了. 配置如下: <?xml version="1.0" encoding="UTF-8& ...

  3. java axmlprinter_安卓xml配置文件解析工具-AXMLPrinter2.jar(androidmanifest.xml 反编译)下载官方最新版-西西软件下载...

    AXMLPrinter2.jar apk分析APK文件,取得APK文件中的 包名.版本号及图标,很强大的工具,再一次感受到了批处理的牛逼.可以将android安卓编译过的二进制XML文件(binary ...

  4. 干掉Navicat:正版,MySQL官方客户端真香!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 如果使用Navicat的话,避免不了需要到处寻找破解版,或 ...

  5. mybatis技术全攻略指南

    转载 作者: 夜泊 版本: v1.0 原文地址 第一章 mybatis简介 1.1 mybatis的历史 mybatis在2010年前叫ibatis是apache内部的一个项目,名字来源于intern ...

  6. Java解析xml文件dom4j篇(基于xml配置文件完成Excel数据的导入、导出功能完整实现)

    DOM4J解析XML文件 dom4j是一个Java的XML API,是jdom的升级产品,用来读写XML文件.另外对比其他API读写XML文件,dom4j是一个十分优秀的JavaXML API,具有性 ...

  7. java 读取 xml 配置文件内容

    java  读取 xml 配置文件内容 public static void main(String[] args) throws Exception {//创建读取的核心类SAXReader sax ...

  8. Java游戏服务器开发之二十--xml配置文件

    Java游戏服务器开发之二十--xml配置文件     游戏中使用的配置文件很多     像游戏中的关卡,英雄等级,装备之类都是使用配置文件(xml等)     比如有一个装备,配置表中有一条记录,数 ...

  9. java EE的apache-tomcat配置文件web.xml

    <?xml version="1.0" encoding="UTF-8"?>   <web-app version="2.5&quo ...

最新文章

  1. vue router html,vue-router.html
  2. 【攻防世界012】gametime
  3. PHP调用JS/CSS方法
  4. 在Mac里给Terminal终端自定义颜色
  5. python脚本转换成apk_使用Python-For-Android将Python脚本导出到Android可执行文件(.apk)...
  6. android手机常用功能,Windows Phone 7/Android手机常用功能对比
  7. 杭电1556 Color the ball
  8. c语言源程序自动评判系统,C语言源程序的自动评判毕业设计论文
  9. Spring Cloud Alibaba入门简介
  10. 如何给PDF添加签名或盖章
  11. JS实现继承的几种方式
  12. java pem 私钥_JAVA:如何使用密码保护将私钥保存在pem文件中
  13. 挠场的科学丨五、二十一世纪的挠力文明
  14. .NET(C#)下的移动彩信MM7协议研究之路(一:题记)
  15. Hyperledger Fabric 2.x 环境搭建
  16. ACM-ICPC 知识点 经验
  17. matlab能输入铁心参数,变压器铁心剩磁预测研究
  18. 计算机网络学习笔记(3.数据链路层 4.网络层)
  19. Photoshop基础教程
  20. pc/mobile前端一键复制粘贴

热门文章

  1. 产品架构开发方法(2011中国软件技术大会)
  2. 嵌入式根文件系统制作
  3. FCN-加载训练与测试数据
  4. c语言在程序中显示现在星期几,C语言程序设计: 输入年月日 然后输出是星期几...
  5. android 监听界面变化,Android之页面有变化用onWindowFocusChanged来监听权限是否开启...
  6. div悬浮在固定位置_悬浮式超声波致动器概要及研究动向
  7. perl与php,perl与php之异同
  8. Office Word界面和页面字体模糊不清的解决方案
  9. bzoj1190:[HNOI2007]梦幻岛宝珠
  10. 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)