服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

2021-11-05 10:13、唐城 Java教程

对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?很多朋友对这一问题不是很清楚,今天小编给大家带来一篇教程关于Fluent Mybatis如何做到代码逻辑和sql逻辑的合一,一起看看吧

使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。不再需要在dao中组装查询或更新操作,在xml或mapper中再组装参数。那对比原生mybatis, mybatis plus或者其他框架,fluentmybatis提供了哪些便利呢?

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

场景需求设置

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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语句如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 >= 2000
  and subject in ('英语', '数学', '语文')
  and score >= 60
  and 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 Mybatis如何做到代码逻辑和sql逻辑的合一

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

代码:

换成mybatis原生实现效果

1. 定义mapper接口

?
1
2
3
public interface mystudentscoremapper {
    list<map<string, object>> summaryscore(summaryquery paras);
}

2. 定义接口需要用到的参数实体 summaryquery

?
1
2
3
4
5
6
7
8
@data
@accessors(chain = true)
public class summaryquery {
    private integer schoolterm;
    private list<string> subjects;
    private integer score;
    private integer mincount;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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_score
    from student_score
    where school_term >= #{schoolterm}
    and subject in
    <foreach collection="subjects" item="item" open="(" close=")" separator=",">
        #{item}
    </foreach>
    and score >= #{score}
    and is_deleted = 0
    group by school_term, subject
    having count(score) > #{mincount}
    order by school_term, subject
</select>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@runwith(springrunner.class)
@springboottest(classes = quickstartapplication.class)
public class mybatisdemo {
    @autowired
    private mystudentscoremapper mapper;
 
    @test
    public 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会简单比较多,实现效果如下:

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

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

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

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

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

生成代码编码比较

fluent mybatis生成代码设置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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代码生成设置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class codegenerator {
 
    static string dburl = "jdbc:mysql://localhost:3306/fluent_mybatis_demo?usessl=false&useunicode=true&characterencoding=utf-8";
 
    @test
    public 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();
    }
}

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

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

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

作者:稻草江南

链接:juejin.cn/post/6886019929519177735

Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

到此这篇关于fluent mybatis如何做到代码逻辑和sql逻辑的合一的文章就介绍到这了,更多相关fluent mybatis代码逻辑和sql逻辑的合一内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_41570658/article/details/119327923

延伸 · 阅读

精彩推荐
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12