03. Springboot集成Mybatis-flex(一)

news2024/11/28 7:31:28

目录

1、前言

2、MyBatis-Flex 是什么?

3、框架功能对比

4、性能对比

5、快速使用

5.1、Maven添加依赖

5.2、数据源配置

5.3、创建实体类和表

5.4、创建Dao

5.5、创建Service

5.6、创建Controller接口测试

5.7、测试结果

6、小结


1、前言

现在主流的Mybatis增强框架有很多,当然项目中最经常使用的还是MybatisPlus为主。但是用过MybatisPlus的小伙伴也知道,对于单表操作,链式的编码方式以及提供的Lambda支持可以简化很多代码量,但是如果多表操作,就显得心有余而力不足了。因此大多数项目中对于多表操作,仍然选择采用XML的编写方式。那么这里介绍一款Mybatis增强框架,号称集成了MybatisPlus等多个框架的优点。那就是Mybatis-Flex。

2、MyBatis-Flex 是什么?

官网地址:MyBatis-Flex - MyBatis-Flex 官方网站

与Mybatis Plus类似,Mybatis Flex也是基于Mybatis的一个增强的ORM框架。但是相比之前更轻量,更灵活,性能更高。

以下摘抄自官网:

MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。

总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。

3、框架功能对比

MyBatis-Flex 和同类框架「功能」对比 - MyBatis-Flex 官方网站

功能或特点

MyBatis-Flex

MyBatis-Plus

Fluent-MyBatis

对 entity 的基本增删改查

分页查询

分页查询之总量缓存

分页查询无 SQL 解析设计(更轻量,及更高性能)

多表查询: from 多张表

多表查询: left join、inner join 等等

多表查询: union,union all

单主键配置

多种 id 生成策略

支持多主键、复合主键

字段的 typeHandler 配置

除了 MyBatis,无其他第三方依赖(更轻量)

QueryWrapper 是否支持在微服务项目下进行 RPC 传输

未知

逻辑删除

乐观锁

SQL 审计

数据填充

数据脱敏

✔️(收费)

字段权限

✔️(收费)

字段加密

✔️(收费)

字典回写

✔️(收费)

Db + Row

Entity 监听

多数据源支持

借助其他框架或收费

多数据源是否支持 Spring 的事务管理,比如@Transactional和TransactionTemplate等

多数据源是否支持 "非Spring" 项目

多租户

动态表名

动态 Schema

4、性能对比

MyBatis-Flex 和同类框架「性能」对比 - MyBatis-Flex 官方网站

可以看下具体的性能对比(我这边没有具体测试过),这里直接给出官网的结论:

5、快速使用

5.1、Maven添加依赖

<dependencies>
    <!-- 这里为mybatis-flex依赖 -->
    <dependency>
        <groupId>com.mybatis-flex</groupId>
        <artifactId>mybatis-flex-spring-boot-starter</artifactId>
        <version>1.6.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.5.0</version>
    </dependency>

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.21</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

5.2、数据源配置

这里多数据源使用SpringBoot的多数据源,Mybatis-Flex也支持多数据源配置。

server:
  port: 8080

spring:
  application:
    name: springboot-mybatis-flex
  profiles:
    active: dev
  jackson:
    # 不要全局限制,避免字段格式不一致
    date-format: "yyyy-MM-dd HH:mm:ss"
    locale: zh_CN
    time-zone: GMT+8

  # druid config
  datasource:
    dynamic:
      primary: primary
      datasource:
        primary:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/my-game?useUnicode=true&characterEncoding=utf8&useSSL=false
          username: root
          password: root

          
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      validation-query: SELECT 1
      initial-size: 10
      min-idle: 10
      max-active: 20
      min-evictable-idle-time-millis: 180000
      test-on-borrow: false
      test-while-idle: true
      remove-abandoned: true
      remove-abandoned-timeout-millis: 1800
      log-abandoned: true
      pool-prepared-statements: true
      max-open-prepared-statements: 100
      filter:
        slf4j:
          enabled: false
      web-stat-filter:
        enabled: false
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

5.3、创建实体类和表

实体类User:

package org.shamee.demo.entity;

import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.*;

import java.io.Serializable;
import java.util.Date;


/**
 * @Table 注解自动映射实体类和表字段
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("t_user")
public class User implements Serializable {

    /**
     * 声明主键ID,并指定生成器为雪花ID
     */
    @Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
    private String id;

    /**
     * Column声明字段名称,onInsertValue 自动填充时间
     */
    @Column(value = "createdTime", onInsertValue = "now()")
    private Date createdTime;

    @Column(value = "updatedTime", onInsertValue = "now()", onUpdateValue = "now()")
    private Date updatedTime;

    /**
     * Column声明字段名称,isLogicDelete 逻辑删除
     */
    @Column(value = "isDeleted", isLogicDelete = true)
    private Boolean isDeleted = false;

    @Column(value = "userId")
    private String userId;

    @Column(value = "userName")
    private String userName;

    @Column(value = "isUse")
    private Boolean isUse;

    @Column(value = "battleNum")
    private Integer battleNum;

    @Column(value = "atk")
    private Integer atk;

    private String extension;
}

表t_user:

CREATE TABLE `t_user`  (
  `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `userId` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `userName` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `isUse` tinyint(4) NULL DEFAULT NULL,
  `battleNum` int(11) NULL DEFAULT NULL,
  `atk` int(11) NULL DEFAULT NULL,
  `extension` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  `createdTime` datetime(0) NULL DEFAULT NULL,
  `updatedTime` datetime(0) NULL DEFAULT NULL,
  `isDeleted` tinyint(4) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

5.4、创建Dao

package org.shamee.demo.dao;

import com.mybatisflex.core.BaseMapper;
import org.shamee.demo.entity.User;

public interface UserDao extends BaseMapper<User> {
}

5.5、创建Service

package org.shamee.demo.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.shamee.demo.dao.UserDao;
import org.shamee.demo.entity.User;
import org.shamee.demo.entity.table.UserTableDef;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService extends ServiceImpl<UserDao, User> {

    /**
     * 查询全部
     * @return
     */
    public List<User> selectAll(){
        return this.getMapper().selectAll();
    }

    /**
     * 根据userId获取User数据
     * @param userId
     * @return
     */
    public User listById(String userId){
        QueryWrapper wrapper = QueryWrapper.create()
                // 这里可以指定查询字段
                .select(UserTableDef.USER.USER_ID, UserTableDef.USER.USER_NAME, UserTableDef.USER.ATK)
                // sql from表名
                .from(User.class)
                // 查询条件,这里的UserTableDef.USER代码自动编译生成,类似lombok
                .where(UserTableDef.USER.USER_ID.eq(userId));
        return this.getMapper().selectOneByQuery(wrapper);
    }


    /**
     * 新增
     * @param user
     */
    public void insert(User user){
        this.getMapper().insert(user);
    }

    /**
     * 更新User
     * @param user
     */
    public void updateEntity(User user){
        this.getMapper().update(user);
    }

    /**
     * 局部更新
     * @param userId
     * @param userName
     */
    public void updateRow(String userId, String userName){
        UpdateChain.of(User.class)
                .set(User::getUserName, userName)
                .where(User::getUserId).eq(userId).update();
    }

    /**
     * 删除
     * @param userName
     */
    public void deleteByWrapper(String userName){
        QueryWrapper queryWrapper = QueryWrapper.create().where(UserTableDef.USER.USER_NAME.eq(userName));
        this.getMapper().deleteByQuery(queryWrapper);
    }
}

5.6、创建Controller接口测试

package org.shamee.demo.controller;

import org.shamee.demo.entity.User;
import org.shamee.demo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/api/demo/user")
public class UserController {

    @Resource
    private UserService userService;


    /**
     * 查询全部
     * @return
     */
    @GetMapping("listall")
    public List<User> listall(){
        return userService.selectAll();
    }

    /**
     * 按userId查询
     * @return
     */
    @GetMapping("listById")
    public User listById(){
        return userService.listById("zhangsan");
    }

    /**
     * 新增
     * @return
     */
    @GetMapping("insert")
    public Boolean insert(){
        User user = User.builder().userId("zhangsan").userName("张三").atk(100).battleNum(200).build();
        userService.insert(user);
        return Boolean.TRUE;
    }

    /**
     * 更新
     * @return
     */
    @GetMapping("update")
    public Boolean update(){
        userService.updateRow("zhangsan", "张三三");
        return Boolean.TRUE;
    }

    /**
     * 删除
     * @return
     */
    @GetMapping("delete")
    public Boolean delete(){
        userService.deleteByWrapper("张三三");
        return Boolean.TRUE;
    }
}

5.7、测试结果

先执行insert接口插入数据后,调用listall查看数据列表。

6、小结

习惯了Mybatis Plus后,Mybatis Flex上手还是很类似的,就是会有一些语法的差异。如声明主键注解,字段映射注解,QueryWrapper使用差异等等。整体来说是Mybatis增强版,官方也提供了很多高级使用配置,感兴趣的可以探索一下。

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

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

相关文章

git报错:git Permission denied, please try again.

1 问题描述: git clone/pull代码时提示输入密码,密码输入正确但是报错:git Permission denied, please try again. 2 解决方案: step1 检查SSH Key是否存在#cd ~/.ssh #lsstep2 获取SSH Key如果存在id_rsa.pub 或 id_dsa.pub 文件,跳过此步。 如果不存在,则生成: 先查…

浙江移动与中兴通讯合作项目被评为“光华杯”东部赛区一等奖!

近日&#xff0c;浙江移动携手中兴通讯共同打造的创新合作项目“构建面向东数西算的传输全光底座赋能美丽浙江”在2023年第二届“光华杯”东部赛区决赛中被评为一等奖&#xff0c;该项目以运力为核心&#xff0c;可实践应用于“东数西算”建设工程当中&#xff0c;提供高速无阻…

8. 基于消影点进行相机内参(主点)的标定

目录 1. ocam模型2. 消影点3. 基于消影点进行相机主点标定3.1 基于ocam模型的主点标定 感谢大家的阅读。 1. ocam模型 可以参考我的另一篇博客ocam模型。 这里简单提一下ocam模型&#xff1a; 这个模型将中心折反射相机和鱼眼相机统一在一个通用模型下&#xff0c;也称为泰勒模…

深眸科技迭代深度学习算法,以AI机器视觉技术扩围工业应用场景

智能制造是制造业数智化转型升级的发展方向&#xff0c;在当前以高端装备制造为核心的工业4.0时代背景下&#xff0c;越来越多的制造企业意识到机器视觉对于提高效率、降低成本&#xff0c;从而提升企业效益的意义。 目前&#xff0c;机器视觉已成为制造业迈向智能制造过程中极…

XC6206 低压线性稳压器 300mA低功耗LDO

XC6206系列是一款采用CMOS和激光修整技术制造的高精度、低能耗、3端子、正电压调压器。该系列提供了一个大的电流和一个明显的小的辍学电压。 XC6206由限流器电路、驱动器晶体管、精确参考电压和纠错电路组成。该系列兼容低ESR陶瓷电容。电流限制器的折叠电路作为短路保护以及输…

利用EXCEL进行XXE攻击

利用EXCEL进行XXE攻击 原因 原因 Microsoft Office从2007版本引入了新的开放的XML文件格式&#xff0c;新的XML文件格式基于压缩的ZIP文件格式规范&#xff0c;由许多部分组成。 我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件&#xff0c;可以发现其中多数是…

canvas绘制网格背景

/*** Event 方法* description: canvas 绘制网格背景* */drawGrid(element, lineColor, lineStepX, lineStepY, bgColor, bgStepX, bgStepY) {const canvas document.querySelector(element)const context canvas.getContext(2d)context.save();context.lineWidth 0.5;conte…

Mac cocoapods 3分钟安装教程( 国内镜像源方法)

参考链接&#xff1a;2023最新总结&#xff0c;Mac下使用Homebrew完全指南&#xff01; - 知乎 1.打开终端&#xff0c; 执行&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.运行&#xff0c;可以选择清…

Hazelcast系列(二):hazelcast集成

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成 目录 前言 集成 环境 配置 配置一 配置二 配置三 测试 其他 总结 前言 前面通过 Hazelcast系列(一)&#xff1a;初识hazelcast 让我们对Hazelcast有了一个大…

Leetcode:【485. 最大连续 1 的个数】

题目 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 难度&#xff1a;简单 题目链接&#xff1a;485. 最大连续 1 的个数 示例1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 …

JavaScript 基础第四天笔记

JavaScript 基础 - 第4天笔记 理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型的特征&#xff0c;结合数学对象实现简单计算功能。 理解函数的封装的特征掌握函数声明的语法理解什么是函数的返回值知道并能使用常见的内置函数 函数 …

Java-day16(Java常用类)

Java常用类 1.String类 public class test1 {/** String&#xff1a;代表不可变的字符序列&#xff0c;底层使用char[]存放* String是final的 * */Testpublic void test() {String str1 "Java EE";String str2 "Java EE";String str3 new String("…

自学WEB服务器搭建01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端、后端&#xff08;服务端&#xff09;数据库 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发…

强引用,弱引用,软引用,虚引用它们有什么区别?你知道吗?

目录 1. 先简单了解JVM内存模型 2. 强引用类型解析 2.1 强引用理论解释 2.2 强引用代码演示 3. 软引用类型解析 3.1 软引用理论解释 3.2 软引用与强引用的区别&#xff1f; 3.3 软引用代码展示 3.4 软引用的使用场景&#xff1f; 4. 弱引用类型解析 4.1 弱引用理论解…

Windows无法安装到这个磁盘怎么办?

在固态硬盘&#xff08;SSD&#xff09;上安装Windows 11/10/8/7会使您的计算机运行速度更加快速&#xff0c;程序响应速度更加迅捷&#xff0c;如果您遇到了和上述案例相似的情况&#xff0c;Windows无法安装到固态硬盘上&#xff0c;也不用太过苦恼&#xff0c;造成此问题的原…

iOS设备自动备份软件哪个更好用?

备份是在使用iOS设备时经常用到一个功能。有很多种方法可以自动备份iOS设备&#xff0c;有通过iCloud进行自动备份的方法&#xff0c;有通过iTunes进行的&#xff0c;而今天小编再给大家介绍一个通过iOS设备管理软件iMazing进行自动备份的方法。这三种方法究竟哪一个更适合大家…

ElasticSearch自学笔记

es学习内容 day01 概念区别 Mysql和es概念对比 mysql:擅长事务类型的操作&#xff0c;可以确保数据的安全和一致性ES:擅长海量数据的搜索&#xff0c;分析和计算 mapping 属性 创建index的时候值为true就是参与搜索 索引库修改 PUT /库名/_mapping 字段名必须是新字段名文…

3dmax渲染内存不足,这样解决!

在3dmax工作时显示以下错误消息&#xff0c;3ds Max 中“发生内存不足错误”或者是3dmax渲染内存不足&#xff0c;可能还注意到系统性能很慢。 3dmax渲染内存不足原因&#xff1a; 发生此错误的原因是计算机在完成您请求的操作之前耗尽了可用内存。执行任何过程时都可能会出…

DP7340——192KHz双声道输入24位AD 转换器

DP7340是一款完整的采样、模数音频信号转换、抗混叠滤波的芯片&#xff0c;在串行格式下以每声道最高200kHz采样率高达24位宽&#xff0c;并支持大部分的音频数据格式。 DP7340基于一个带线性模拟低通滤波器的五阶Multi-BitΔ∑调制器&#xff0c;自动检测信号频率和主时钟频率…

记:CN 470-510MHz Band

目录 CN470-510 序头格式 CN470-510频道频率 CN470-510 数据速率和终端输出功率编码 CF470-510 JoinResp CFList CN470-510 LinkADRReq命令 CN470-510 最大载荷大小 CN470-510接收窗口 CN470-510默认参数 CN470-510 序头格式 应使用以下同步字&#xff1a; 调制同步字…