ORM 之 阿里 Fluent-Mybatis主推动态SQL 你学废了吗?

news2024/9/30 3:20:36

Mybatis作为在东亚开发者市场上占有绝对的使用优势,在中国大陆上讨论Mybatis优化的项目也是挺活跃。

局限于原始Mybatis繁琐的流程,自动代码生成、声明式SQL、动态SQL,以及诸多细节的内容:多租户、多数据源、数据脱敏、SQL审计、多表查询、多表join、自动化主键生成等等,推动项目开发降本增效,降低项目开发门槛,远离付费,哈哈。

产生了多个增强版工具:

  • TkMybatis(2014)
  • MybatisPlus(2016)
  • FluentMybatis(2020)
  • MybatisFlex(2023)

目前人气【MybatisPlus】还是最高的。

所以,现在的你在用什么框架呢?

今天看看阿里推进的FluentMybatis

2021年,【阿里官宣…新一代ORM框架…】吸引了注意,
目前看1.3K的star来看,受欢迎程度不如后起之秀。

那么,可以尝试吗?优化有哪些?

想必这是每一项新技术出来,普通大众都会问的问题。
每一项技术的出现都是为了解决某一方面的问题,或者处于某一角度的洞悉,看看这个产品的出发点和落脚点是什么?

出发点

Mybatis在东亚地区开发者市场近些年具有不可撼动的地位,并占中国JavaORM之首,短期内肯定占有较大的市场份额,有使用者那么就有市场!

落脚点

考虑到,当基于Mybatis的功能丰富到了一定的程度,会更加注重敏捷、高效、降低代码入侵性。
因此集各家所长,诞生了FluentMybatis

它有哪些特点?

  • 只需Entity
  • FluentAPI
  • 嵌套查询 IN EXISTS
  • 条件构造 NO IFELSE
  • AND OR 灵活组合
  • 连表查询
  • 环境和租户自定义

在这里插入图片描述

如何体验下功能

springBoot2.X版本下跑起来,主要有以下几个步骤:

  • 引入maven依赖
    • 需要包含fluent-mybatis的两个基础包
    <properties>
        <fluent-mybatis.version>1.8.7</fluent-mybatis.version>
    </properties>
 <!-- 引入fluent-mybatis 运行依赖包, scope为compile -->
        <dependency>
            <groupId>com.github.atool</groupId>
            <artifactId>fluent-mybatis</artifactId>
            <version>${fluent-mybatis.version}</version>
        </dependency>
        <!-- 引入fluent-mybatis-processor, scope设置为provider 编译需要,运行时不需要 -->
        <dependency>
            <groupId>com.github.atool</groupId>
            <artifactId>fluent-mybatis-processor</artifactId>
            <scope>provided</scope>
            <version>${fluent-mybatis.version}</version>
        </dependency>
  • springboot-web包
  • springboot-mybatis包
  • lombok和springboot-test
  • 此外数据库的驱动包,mysql-connector 或者 postgresql
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
          <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>2.3.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- Postgresql驱动包 -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

具体版本取决于自身springboot版本,我这边使用的是2.3.12.RELEASE,没有采用默认的Mysql,想看看其他非默认DB的对接情况。

  • 书写代码自动生成配置类
    • 确定连接DB的类型、URL、用户名、密码、driver名、schema等
    • 注意不同的DBType部分参数需要指明,默认支持Mysql
    • 执行自动生成配置类后,在配置目录下获取到dao\entity的类
@SpringBootTest(classes = FluentMybatisApplication.class)
public class SystemGeneratorDemo {
    // 数据源 url
    static final String url = "jdbc:postgresql://127.0.0.1:5432/dev";
    // 数据库用户名
    static final String username = "user";
    // 数据库密码
    static final String password = "pass";
    static final String dbDriver="org.postgresql.Driver";

    @Test
    public void generate() throws Exception {
        // 引用配置类,build方法允许有多个配置类
        FileGenerator.build(Empty.class);
    }

    @Tables(
            // 设置数据库连接信息
            url = url, username = username, password = password,
            dbType = DbType.POSTGRE_SQL, //指定PG,默认MySQL
            driver = dbDriver, //指定driver,默认MySQL
            // 设置entity类生成src目录, 相对于 user.dir
            srcDir = "src/main/java",
            // 设置entity类的package值
            basePack = "com.learning.fluentmybatis",
            // 设置dao接口和实现的src目录, 相对于 user.dir
            daoDir = "src/main/java",
            // 设置哪些表要生成Entity文件
            schema = "public", //指定schema, PG上有这个逻辑
            tables = {@Table(value = {"product_info"})}
    )
    static class Empty { //类名随便取, 只是配置定义的一个载体
    }
}

在这里插入图片描述

  • 自动生成实体关系查询类
    • maven compile操作后,能在target下获取dao.base\helper\mapper\wrapper等类,是DAO操作的核心类
      在这里插入图片描述

    • 在IDEA中,需要将target/generated-sources/annotations加入到source配置中,所谓源代码数据的一部分

    • IDEA配置中,Build,Execution,Deployment/Compilier/Annotation Processoers 打开Enable annotation processing,是编辑器自动识别构建的数据

经过以上配置,就已经完成根据配置扫描的表,自动生成查询所需的帮助类,支持动态的数据查询,不需要依赖繁琐的XML配置,灵活书写单表、多表的查询、更新、删除。

//主类或者配置类上开启包扫描
@MapperScan({"com.learning.fluentmybatis.mapper"})

//==================================
@SpringBootTest
public class ProductInfoMapperTest {
    @Qualifier("fmProductInfoMapper")
    @Autowired
    private ProductInfoMapper productInfoMapper;
    @Autowired
    private ProductInfoBaseDao productInfoBaseDao;

    @Test
    public void testInsert(){
        ProductInfoEntity entity = new ProductInfoEntity();
        entity.setName("test5");
        entity.setDisplayName("TEST5");
        productInfoMapper.insert(entity);
        System.out.println(entity.getId());
    }


    @Test
    public void testUpdate(){
        productInfoMapper.updateBy(productInfoMapper.updater().set.updateTime().is(new Date()).end()
                .where().id().eq(999L).end());
        ProductInfoEntity product = productInfoMapper.findOne(productInfoMapper.query().where().id().eq(999L).end());
        System.out.println(product.toString());
    }

    @Test
    public void testSelect(){
        ProductInfoEntity product = productInfoMapper.findOne(productInfoMapper.query().where().id().eq(999L).end());
        System.out.println(product.toString());
        
    }
}

其他指导文档、丰富的查询功能见官方,Fluent-Mybatis官方直通车点这里

今天的你,通过去收藏夹里拾破烂,学到了吗?

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

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

相关文章

MyBatis查询数据库之三(#{}vs${},like查询,resultMap,as,多表查询)

目录 查询操作 1.单表查询 1.1 参数占位符#{}和${} 1.2 ${}的优点 1.3 sql注入问题 ​编辑 面试常问&#xff1a;${}与#{}的区别 1.4 like查询 2.多表查询 2.1 返回字典映射&#xff1a;resultMap 2.2 多表查询 &#xff08;1&#xff09;建立 Articalinfo 实体类&a…

所有AI图都在这了

最近一直在玩AI生图&#xff0c;有点拔不出来了&#xff0c;喜欢生图的感觉&#xff0c;日积月累&#xff0c;已经有几千张图片了&#xff0c;想把这些图片都分享出来给大家欣赏&#xff0c;云盘、图片APP&#xff0c;感觉都不好用&#xff0c;最后熬夜码了一个属于自己的图片管…

(树) 剑指 Offer 68 - II. 二叉树的最近公共祖先 ——【Leetcode每日一题】

❓剑指 Offer 68 - II. 二叉树的最近公共祖先 难度&#xff1a;简单 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科 中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是…

2462. 雇佣 K 位工人的总代价

题目描述&#xff1a; 主要思路&#xff1a; 分别维护两个堆&#xff0c;取左右两边最小的那个。 class Solution { public:long long totalCost(vector<int>& costs, int k, int candidates) {priority_queue<int,vector<int>,greater<int>> ql…

清洗无效邮箱地址,让邮件营销更高效

作为一种低成本、高回报的营销手段&#xff0c;电子邮件营销因其传播效率高、营销范围广的特点被广泛应用。虽然现在短视频营销、搜索引擎营销、自媒体营销、内容营销等各种网络营销方式层出不穷。但是在整个网络营销宣传活动中&#xff0c;大多数企业还是会选择把邮件营销作为…

【Java从入门到大牛】File和IO流上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年8月9日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

《合成孔径雷达成像算法与实现》Figure3.5

clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; %信号带宽 K B/T; …

如何简化大型网络服务提供商中的DDoS防护事宜

分布式拒绝服务&#xff08;DDoS&#xff09;攻击对服务提供商构成重大威胁&#xff0c;它们有可能破坏关键基础设施并扰乱业务运营。然而对于大型服务提供商而言实施和管理有效的DDoS防护解决方案可能非常复杂且成本高昂。 下面&#xff0c;火伞云将和大家一起探讨如何简化大型…

【云原生】kubernetes控制器deployment的使用

目录 ​编辑 1 Controller 控制器 1.1 什么是 Controller 1.2 常见的 Controller 控制器 1.3 Controller 如何管理 Pod 2 Deployment 2.1 创建 deployment 2.2 查看 deployment 2.3 扩缩 deployment 2.4 回滚 deployment 2.5 删除 deployment 1 Controller 控制器 …

idea如何上传项目到github(超详细)

idea如何上传项目到github 1、IDEA配置2、项目上传到本地仓库2.1、创建本地git仓库2.2、Add操作2.3、Commit操作 3、项目上传到Github4、拿到登录Github的token 1、IDEA配置 File-Settings-VersionControl-Git Git的安装路径下bin目录下的git.exe可执行文件 可以直接点 Gene…

【生成式AI】Diffusion Model 原理详解

Diffusion Model 【碎碎念】感觉Diffusion Model里面的数学公式太多了QwQ&#xff0c;所以自己稍微梳理一下。 我自己是听B站的课程&#xff1a;李宏毅课程听懂的&#xff0c;感觉讲得很清楚 概念模型 Diffusion Model的基本思想就是&#xff1a; 把一张图片通过 T T Tstep …

Redis类型检查与命令多态

Redis中用于操作键的命令基本上可以分为两种类型。 其中一种命令可以对任何类型的键执行&#xff0c;比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。 举个例子&#xff0c;以下代码就展示了使用DEL命令来删除三种不同类型的键: # 字符串键 redis> SE…

实习碎碎念

话说实习一周多了&#xff0c;学到的比自学一个月都多~~~加油狗子你最棒&#xff01;&#xff01;&#xff01; 环境搭建坑死了 SSM框架环境配置 Ideamavenjdktomcatnavicat https://www.cnblogs.com/seigann/p/14528551.htmlhttps://www.cnblogs.com/seigann/p/14528551.h…

聚焦| 900万次点赞量 藏家绣娘直播大赛首秀引关注

义乌00后大学生驻村导师提交援藏教学成绩单 2023年7月30日&#xff0c;第三届全国“乡村振兴智创未来”巾帼共兴创业创新&#xff08;丹巴分赛区&#xff09;大赛暨“川府农博”试运行启动仪式在丹巴县高级中学体育馆举办。 本次比赛由金华市妇女联合会指导&#xff0c;中共丹…

C语言三子棋小游戏--数组的应用

注&#xff1a;在最后面&#xff0c;完整源码会以两种形式展现。在讲解时&#xff0c;以三个源文件的形式。 前言&#xff1a;三子棋&#xff0c;顾名思义&#xff0c;就是三个子连在一起就可以胜出。在本节我们要介绍的三子棋模式是这样子的&#xff1a;在键盘输入坐标&#x…

Python-OpenCV中的图像处理-物体跟踪

Python-OpenCV中的图像处理-物体跟踪 物体跟踪 物体跟踪 现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了&#xff0c;我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中&#xff0c;我们要提取的…

LAMMPS推出GUI界面,模拟从未如此简单

lammps一直没有编辑界面&#xff0c;对新手来说特别的不友好&#xff0c;不过&#xff0c;今年8月4号lammps推出了一款包含界面的版本。 运行效果如下图所示&#xff0c;这个版本带有独立的编辑界面&#xff0c;可以使用菜单新建或者打开in文件&#xff0c;也可以使用菜单运行…

python中 “”和“and”的区别

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 1、“&”和“and”有本质区别&#xff0c;属于不同类型的运行符号。& 是位运算&#xff1b;and 是逻辑运算。 2、首先是&&#xff1a;该运输符属于字符串的连接运算符&#xff0c;例如&#xff0c;“w“&”c…

FP独立站苦于投放广告?GG斗篷搞定难题!

在做FP独立站时&#xff0c;卖家常常面临各种难题。因为产品不是正品&#xff0c;因此广告很难过审。然而&#xff0c;为了获得利润&#xff0c;卖家总能找到适合的解决办法。以前&#xff0c;FP卖家常常使用SEO站群的方式&#xff0c;在搜索引擎上抢占免费流量&#xff0c;同时…

Linux-PG+postgres安装

一、PG数据库安装 1. 获取所需依赖包 wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-devel-5.0.1-7.el7.x86_64.rpm wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-5.0.1-7.el7.x86_64.rpm wge…