Fluent Mybatis 牛逼!

news2024/11/16 21:52:06

这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。

推荐一些chrome浏览器必装的插件!

40 个 SpringBoot 常用注解

VSCode 花式玩法(摸鱼)收藏一下 !

使用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 >= 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 api的能力,以及IDE对代码的渲染效果。

代码:https://gitee.com/fluent-mybatis/fluent-mybatis-docs/tree/master/spring-boot-demo/

换成mybatis原生实现效果


1. 定义Mapper接口


public interface MyStudentScoreMapper {

List<Map<String, Object>> summaryScore(SummaryQuery paras);

}

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

@Data

@Accessors(chain = true)

public class SummaryQuery {

private Integer schoolTerm;

private List subjects;

private Integer score;

private Integer minCount;

}

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

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

#{item}

and score >= #{score}

and is_deleted = 0

group by school_term, subject

having count(score) > #{minCount}

order by school_term, subject

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

@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会简单比较多,实现效果如下:

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

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

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

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

生成代码编码比较

fluent mybatis生成代码设置


public class AppEntityGenerator {

stati

c 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”;

@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(
ame());

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(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试大全】互联网面试软实力【必看】

软实力 推荐大家使用Markdown语法写简历&#xff0c;然后再将Markdown格式转换为PDF格式后进行简历投递。如果你对Markdown语法不太了解的话&#xff0c;可以花半个小时简单看一下Markdown语法说明: http://www.markdown.cn/ 面试 假如你是网络申请者【拉勾、boss等】&…

Latex 分式格式处理

分式 分式命令&#xff1a;\frac{分子}{分母}。 对于行内短分式&#xff0c;可用斜线/输入&#xff0c;例如&#xff1a;(xy)/2 举例&#xff1a; 行内分式 \(\frac{xy}{yz} \) (显示为&#xff1a;) 行间分式 \[\frac{xy}{yz}\] (显示为&a…

【PCB设计特别篇之阻抗计算】还在用SI9000进行阻抗计算?

有了叠层信息后&#xff0c;才可以进行阻抗计算&#xff0c;走线阻抗与线宽、线距、介质厚度、绿油厚度、介质介电常数、铜箔厚度等一些信息相关&#xff0c;所以要现有叠层&#xff0c;才能进行阻抗计算。 阻抗计算的工具有很多&#xff0c;下面介绍几种&#xff1a; 1、SI900…

RSS Can:使用 Golang 实现更好的 RSS Hub 服务(一)

聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 这个事情涉及的东西比较多&#xff0c;所以我考虑拆成一个系列来聊&#xff0c;每篇的内容不要太长&#xff0c;整理负担和阅读负担都轻一些。 本篇是第一…

Go代码审计学习(二)

文章目录环境搭建漏洞一&#xff1a;代码逻辑错误、没有做有效的鉴权漏洞二&#xff1a;目录穿越、任意文件读取漏洞三&#xff1a;条件竞争漏洞四&#xff1a;钩子函数执行命令参考链接环境搭建 Gitea是从gogs衍生出的一个开源项目&#xff0c;是一个类似于Github、Gitlab的多…

自学python第三年才懂,这事儿影响着最终的学习结果

前言 如果这件事你还没搞明白&#xff0c;那你学python会跟我一样&#xff0c;学了几年跟没学差不多&#xff01; 当然&#xff0c;这件事仅限于学python是想赚钱或者提升职场竞争力的人明白即可&#xff0c;其他人别浪费时间了。 这事儿很重要 我从2018年底开始自学python&a…

SpringBoot2核心技术(基础入门)- 03 自动配置原理【3.1依赖管理+2容器功能】

1、SpringBoot特点 1.1、依赖管理 ● 父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent…

(已更新)2023春节倒计时新款HTML单页源码

2023春节倒计时新款HTML单页自适应页面&#xff0c;有兴趣的可以看看&#xff01;背景图片自己修改喜欢的&#xff01; 源码介绍 自适应页面&#xff0c;支持安卓和ioswx背景音乐播放附带多个背景音乐&#xff0c;由于技术原因&#xff0c;一些js进行了加密&#xff08;支持i…

Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

一、导入包 <!-- dynamic-datasource --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.2.1</version> </dependency> 二、配置yam配置文…

【Flask框架】——09 视图和URL总结

目录一、创建flask项目1、安装环境2、创建项目3、启动程序4、访问项目二、flask参数说明1.初始化flask项目2.参数说明3.DEBUG调试模式三、应用程序的参数加载1.从配置对象中加载2.从配置文件中加载3.从环境变量中加载4.从Pycharm中的运行时设置环境变量的方式加载5.企业项目开发…

Flink-多流转换(合流,分流,双流join)

8 多流转换 8.1 分流 简单实现 对流三次filter算子操作实现分流 // 筛选 Mary 的浏览行为放入 MaryStream 流中DataStream<Event> MaryStream stream.filter(new FilterFunction<Event>(){Overridepublic boolean filter(Event value) throws Exception {retur…

vue-admin-template侧边栏修改成抽屉式

目录 一、修改sidebar组件 二、修改store 三、修改sidebaritem页面 四、修改navbar页面 五、修改layout 六、修改样式 一、修改sidebar组件 src—layout—components—sidebar—index.vue 把组件sidebar改成drawer <template><div :class"{ has-logo: s…

【AGC】崩溃服务flutter报缺失recordFatalException方法的问题

问题背景&#xff1a; cp反馈集成AGC-崩溃服务的flutter插件&#xff0c;使用最新的1.3.0300版本&#xff0c;出现下面错误 /Users/yin/Documents/projects/flutter/.pub-cache/hosted/pub.dartlang.org/agconnect_crash-1.3.0300/android/src/main/java/com/huawei/agconnec…

【脚本项目源码】Python制作艺术签名生成器,打造专属你的个人艺术签名

前言 本文给大家分享的是如何通过利用Python制作艺术签名生成器&#xff0c;废话不多直接开整~ 开发工具 Python版本&#xff1a; 3.6 相关模块&#xff1a; requests模块 PIL模块 PyQt5模块 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即…

一个.NET的轻量级JWT库

这两天网上闲逛的时候&#xff0c;看到一个.NET的轻量级JWT库LitJWT&#xff0c;LitJWT号称主要关注性能&#xff0c;能提升至少5倍的编码/解码速度&#xff0c;以及更少的配置&#xff01; LitJWT支持的平台为netstandard 2.1或net5.0更高。 LitJWT宣传的性能对比图&#xf…

vulnhub靶机:presidential1

目录 进行靶机ip的扫描 nmap扫描开发的端口和服务信息 目录扫描 修改host文件 子域名搜集 phpmyadmin管理端登录 phpmyadmin漏洞利用 反弹shell capabilities提权 获取root权限 靶机总结 靶机下载网址&#xff1a;Presidential: 1 ~ VulnHub Kali ip&#xff1a;19…

数据分析方法-五大理论、分析框架、应用、数据分析作用

1、统计学理论 1.1 大数定量 定义&#xff1a; 指大量重复某一实验时&#xff0c;最后的频率会无限接近于事件的概率 数据的样本量越大&#xff0c;我们预测和计算的概率就越准确 数据的样本量越小&#xff0c;我们预测和计算的概率就越可能失效 举例&#xff1a; 某产品用户…

keepalived 主备使用

keepalived 主备使用 本篇主要介绍一下 keepalived 的基本的 主备使用 1.概述 什么是 keepalived呢,它是一个集群管理中 保证集群高可用的软件,防止单点故障,keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&#xff0c;即虚拟路冗…

CH36X系列芯片Linux系统使用教程

一、概述 CH365是一个连接PCI总线的通用接口芯片&#xff0c;CH367/CH368是连接PCI-Express总线的通用接口芯片。支持I/O端口映射、存储器映射、扩展ROM以及中断&#xff0c;提供主动并口、SPI、I2C、GPIO等硬件接口。基于如上芯片可将PCI/PCIe总线转换为简便易用的类似于ISA总…

R语言使用Rasch模型分析学生答题能力

最近我们被客户要求撰写关于IRT的研究报告&#xff0c;包括一些图形和统计输出。几个月以来&#xff0c;我一直对序数回归与项目响应理论&#xff08;IRT&#xff09;之间的关系感兴趣。 在这篇文章中&#xff0c;我重点介绍Rasch分析。 最近&#xff0c;我花了点时间尝试理解…