当前位置: 首页 > 后端技术 > Java

FluentMybatis、nativeMybatis、MybatisPlus功能对比

时间:2023-04-01 17:25:57 Java

使用fluentmybatis,不需要编写具体的xml文件,可以通过javaapi构造更复杂的业务sql语句,从而实现集成代码逻辑和sql逻辑。不再需要在Dao中组装查询或更新操作,然后在xml或mapper中组装参数。与原生的Mybatis、MybatisPlus或者其他框架相比,FluentMybatis提供了哪些便利?下面通过一个典型的业务需求来实现和比较需求场景设置。如有学生成绩表结构如下:createtable`student_score`(idbigintauto_incrementcomment'主键ID'主键,student_idbigintnotnullcomment'学号,Gene_mantinyintDefault0NotNullComment'性别,0:Female;1:Male',SCHOOL_TERMIntNULLComment',SubjectVarchar(30)NULLComment',ScoreIntNullComment',datetimenotnullcomment'记录创建时间',gmt_modifieddatetimenotnullcomment'记录最后修改时间',is_deletedtinyintdefault0notnullcomment'tombstoneidentifier')engine=InnoDBdefaultcharset=utf20year0statistics;现在三个科目('英语','数学','语文')的及格分数按学期分类,科目统计的最低分,最高分和平均分,样本数需要大于1,统计结果按学期和学科排序。我们可以这样写SQL语句如下selectschool_term,subject,count(score)ascount,min(score)asmin_score,max(score)asmax_score,avg(score)asmax_scorefromstudent_scorewhereschool_term>=2000andsubjectin('English','Mathematics','Chinese')和score>=60andis_deleted=0groupbyschool_term,subjecthavingcount(score)>1orderbyschool_term,subject;使用fluentmybatis、nativemybatis和Mybatisplus实现三者的对比。使用fluentmybatis实现以上功能,我们可以在代码上看到fluentapi的能力和IDE的渲染效果。改为mybatis原生实现效果定义Mapper接口publicinterfaceMyStudentScoreMapper{List>summaryScore(SummaryQueryparas);}定义接口需要使用的参数实体SummaryQuery@Data@Accessors(chain=true)publicclassSummaryQuery{privateIntegerschoolTerm;私有列表主题;私人整数分数;privateIntegerminCount;}定义实现业务逻辑的mapperxml文件,count(score)作为count,min(score)作为min_score,max(score)作为max_score,avg(score)作为max_scoresterchollfromstudent_wscore={schoolTerm}andsubjectin#{item}andscore>=#{score}andis_deleted=0按学期分组,主题有count(score)>#{minCount}orderbyschool_term,subject实现业务接口(这里是测试类,应该对应实际应用中的Dao类)@RunWith(SpringRunner.class)@SpringBootTest(classes=QuickStartApplication.class)publicclassMybatisDemo{@AutowiredprivateMyStudentScoreMapper映射器;@testpublicvoidmybatis_demo(){//构造参数summaryqueryparas=newSummaryQuery().setschoolterm(2000).setsubjects(arrays.aslist.aslist(“英语”,“”,“”,“数学”,“语文”))。setScore(60).setMinCount(1);List>summary=mapper.summaryScore(paras);System.out.println(摘要);}}总之,直接使用mybatis,实现步骤相当繁琐,效率太低。改用mybatisplus有什么影响?换成mybatisplus就可以达到效果了。mybatisplus的实现比mybatis简单很多。实现效果如下,红框圈出。在写mybatisplus的时候,更多的使用了硬编码的字符串(可以部分用Entity的getlambda方法代替字符串编码)。字符串的硬编码会给开发者造成很多使用障碍。个人认为主要有两点:字段名的记忆和打字困难实体属性跟随数据库字段变化后的运行时错误其他框架,比如TkMybatis,在封装性和易用性上都弱于mybatisplus,所以不再比较。生成代码编码对比fluentmybatis生成代码设置publicclassAppEntityGenerator{staticfinalStringurl="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",/**实体类父包路径**/basePack="cn.org.fluent.mybatis.springboot.demo",/**实体代码源目录**/srcDir="spring-boot-demo/src/main/java",/**Dao代码源目录**/daoDir="spring-boot-demo/src/main/java",/**如果表定义记录创建、记录修改、逻辑删除字段**/gmtCreated="gmt_create",gmtModified="gmt_modified",logicDeleted="is_deleted",/**需要删除的表生成文件(表名:对应实体名)**/tables=@Table(value={"student_score"}))staticclassAbc{}}mybatisplus代码生成集publicclassCodeGenerator{staticStringdbUrl=“jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8”;@TestpublicvoidgenerateCode(){GlobalConfigconfig=newGlobalConfig();DataSourceConfigdataSourceConfig=newDataSourceConfig();dataSourceConfig.setDbType(DbType.MYSQL).setUrl(dbUrl).setUsername("root").setPassword("密码").setDriverName(Driver.class.getName());StrategyConfigstrategyConfig=newStrategyConfig();strategyConfig.setCapitalMode(true).setentityLombokModel(false).setNaming(namingStrategy.underline_to_camel).setColumnNamnaming(namingstrategy.underline_underline_to_to_camel).setEntityTobleTientitytablefieldantableFieldEffieldEffieldEnableAbleNable({"student_score"}).setLogicDeleteFieldName("is_deleted").setTableFillList(Arrays.asList(newTableFill("gmt_create",FieldFill.INSERT),newTableFill("gmt_modified",FieldFill.INSERT_UPDATE)));配置.setActiveRecord(false).setIdType(IdType.AUTO).setOutputDir(System.getProperty("user.dir")+"/src/main/java/").setFileOverride(true);...")概述ent).execute();对于功能点的实现,评委们肯定会有自己的判断。笔者这里也总结了一个对比。-MybatisPlusFluentMybatis代码生成Entity生成Entity,再通过编译生成Mapper、Query、Update和SqlProviderGenerator。可用性和Mybatis之间的共生关系需要被替换。动态SQL构建方式应用启动时,根据Entity注解信息构建动态xml片段,注入Mybatis解析器。编译应用时根据Entity注解编译生成对应方法的SqlProvider,在mybatis的Mapper上使用@InsertProvider@SelectProvider@UpdateProvider注解关联动态SQL结果方便调试吗?调试起来并不容易。调试起来并不容易。直接定位到SQLProvider方法,设置断点。可以通过硬编码字段名构造动态SQL,也可以使用Entity的get方法的lambda表达式编译生成相应的方法。名称,可以直接调用方法。字段变化后发现的错误是通过get方法的lambda表达式发现的。它可以被编译和找到。无法通过字段编码编译查找。在编译时可以找到不同的字段。动态SQL构造方法使用接口参数法和接口名法。,FluentAPI的编码效率更高,语法渲染功能不存在。通过关键变量select、update、set、and、or,可以使用IDE语法渲染,可读性更高