美文网首页Java
再见MybatisPlus,阿里推出新ORM框架

再见MybatisPlus,阿里推出新ORM框架

作者: java涛仔 | 来源:发表于2021-12-10 13:20 被阅读0次

    使用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_create  datetimenotnullcomment'记录创建时间',    gmt_modified datetimenotnullcomment'记录最后修改时间',    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_scorefromstudent_scorewhereschool_term >=2000andsubjectin('英语','数学','语文')andscore >=60andis_deleted =0groupbyschool_term, subjecthavingcount(score) >1orderbyschool_term, subject;

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

    三者实现对比

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

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

    换成mybatis原生实现效果

    定义Mapper接口

    publicinterfaceMyStudentScoreMapper {    List> summaryScore(SummaryQuery paras);}

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

    @Data@Accessors(chain =true)publicclassSummaryQuery{privateInteger schoolTerm;privateList subjects;privateInteger score;privateInteger minCount;}

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

    selectschool_term,    subject,    count(score)ascount,    min(score)asmin_score,    max(score)asmax_score,    avg(score)asmax_scorefromstudent_scorewhereschool_term >=#{schoolTerm}and subjectin#{item}    and score >=#{score}and is_deleted =0groupbyschool_term,subject    havingcount(score) > #{minCount}    orderbyschool_term, subject

    实现业务接口(这里是测试类,实际应用中应该对应 Dao 类)

    @RunWith(SpringRunner.class)@SpringBootTest(classes= QuickStartApplication.class)publicclassMybatisDemo{@AutowiredprivateMyStudentScoreMapper mapper;@Testpublicvoidmybatis_demo(){// 构造查询参数SummaryQuery paras =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会简单比较多,实现效果如下

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

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

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

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

    生成代码编码比较

    fluent mybatis生成代码设置

    publicclassAppEntityGenerator{staticfinalString url ="jdbc:mysql://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{staticString dbUrl ="jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";@TestpublicvoidgenerateCode(){        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();    }}

    FluentMybatis特性一览

    三者对比总结

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

    对 Fluent Mybatis 感兴趣的网友,支持大家去阅读官方源码,发现更多新大陆!

    资料获取方式   https://docs.qq.com/doc/DQVZmeHpBdWJBeXpi

    相关文章

      网友评论

        本文标题:再见MybatisPlus,阿里推出新ORM框架

        本文链接:https://www.haomeiwen.com/subject/zfukfrtx.html