当前位置: 首页 > news >正文

MyBatis-Flex学习记录1---请各位大神指教

简介(官网介绍)

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

官方文档连接:https://mybatis-flex.com/

特征(官网介绍)

1、轻量:除了 MyBatis,没有任何第三方依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试; 3、把控性更高。
2、灵活:支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper**^灵活** 可以轻易的帮助我们实现 多表查询链接查询子查询 等等常见的 SQL 场景。
3、强大:支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键逻辑删除乐观锁配置数据脱敏数据审计数据填充 等等功能。

快速开始

  1. 依赖引入
<dependencies>
<!--        mybatis-fiex代码生成器依赖--><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-codegen</artifactId><version>1.5.8</version></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.5.8</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- for test only --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
  1. yml配置文件配置
spring:datasource:url: // 数据库连接username: // 数据库账户password: // 数据库密码// 如果需要自己编写xml文件则添加该配置
mybatis-flex:mapper-locations:- classpath*:/mapper/*.xml
  1. 在控制类添加MapperScan(“mapper坐在包路径”)扫描mapper

代码生成器

package com.example.mybatisflexdemo.utils;import cn.hutool.core.util.StrUtil;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;/*** @author cyh* 注意:由于 MyBatis-Flex 的 APT 功能会自动帮我们生成了 Mapper 的 Java 类,* 如果我们在代码生成器中选择生成 Mapper, 则建议把 APT 的 Mapper 生成功能给关闭掉,* 否则系统中会存在两份一样功能的 Mapper。*/
public class CodeGenerationUtil {public static void main(String[] args) {//配置数据源HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("jdbc:mysql://47.120.7.89:7878/so-token-db?nullNamePatternMatchesAll=true&autoReconnect=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");dataSource.setUsername("root");dataSource.setPassword("cyh032101");// 输入信息// 根包名//表前缀//表名Map<String, Object> map = scannerInfo();String basePackage = map.get("basePackage").toString();String preFixTable = map.get("preFixTable").toString();String tableNames = map.get("tableNames").toString();//创建配置内容,两种风格都可以。GlobalConfig globalConfig = createGlobalConfigUseStyle1(basePackage, preFixTable, tableNames);//通过 datasource 和 globalConfig 创建代码生成器Generator generator = new Generator(dataSource, globalConfig);//生成代码generator.generate();}public static GlobalConfig createGlobalConfigUseStyle1(String basePackage, String prefixTable, String tableName) {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.setBasePackage(basePackage);//设置表前缀和只生成哪些表if (StrUtil.isNotBlank(prefixTable)) {globalConfig.setTablePrefix(prefixTable);}// 输入表名则生成其中表,否则生成全部if (StrUtil.isNotBlank(tableName)) {String[] strings = tableName.split(",");globalConfig.setGenerateTable(strings);}//设置生成 entity 并启用 LombokglobalConfig.setEntityGenerateEnable(true);globalConfig.setEntityWithLombok(true);//设置生成 mapperglobalConfig.setMapperGenerateEnable(true);// 设置生成controllerglobalConfig.setControllerGenerateEnable(true);// 设置生成ServiceglobalConfig.setServiceGenerateEnable(true);globalConfig.setServiceImplGenerateEnable(true);
//        //可以单独配置某个列
//        ColumnConfig columnConfig = new ColumnConfig();
//        columnConfig.setColumnName("tenant_id");
//        columnConfig.setLarge(true);
//        columnConfig.setVersion(true);
//        globalConfig.setColumnConfig("tb_account", columnConfig);// 生成APTglobalConfig.setTableDefGenerateEnable(true);return globalConfig;}public static Map<String, Object> scannerInfo() {Scanner scanner = new Scanner(System.in);System.out.println("请输入根包名称(回车结束):");String basePackage = scanner.nextLine();System.out.println("\n");System.out.println("请输入表前缀(无前缀直接回车结束)");String preFixTable = scanner.nextLine();System.out.println("\n");System.out.println("请输入要生成的表名(多表名以,(英文逗号隔开)输入完成回车结束)");String tableName = scanner.nextLine();Map<String, Object> params = new HashMap<>();params.put("basePackage", basePackage);params.put("preFixTable", preFixTable);params.put("tableNames", tableName);return params;}
}

开启日志

@Slf4j
@Configuration
public class MyBatisFlexConfiguration {public MyBatisFlexConfiguration() {//开启审计功能AuditManager.setAuditEnable(true);//设置 SQL 审计收集器AuditManager.setMessageCollector(auditMessage ->log.info("{},{}ms", auditMessage.getFullSql(), auditMessage.getElapsedTime()));}
}

初步使用

  1. 登录用户信息单表查询
    public SaTokenInfo login(LoginDto params) {QueryWrapper wrapper = QueryWrapper.create().select(USER_INFO.ID).where(USER_INFO.USERNAME.eq(params.getUsername()).and(USER_INFO.PASSWORD.eq(params.getPassword())));Long uid = userInfoMapper.selectOneByQueryAs(wrapper, Long.class);if (ObjUtil.isNull(uid)) {throw new BaseException(500, "账号或者密码错误");}StpUtil.login(uid);return StpUtil.getTokenInfo();}// USER_INFO 是通过代码生成器 生成APT  
//globalConfig.setTableDefGenerateEnable(true);
// 自动生成的需要手动编码,以下类似
  1. 权限树形结构多表连接查询
public List<Map<String, Object>> getUserPermissions() {Long uid = Long.parseLong(StpUtil.getLoginId().toString());if (ObjUtil.isNull(uid)) {throw new BaseException(500, "登录信息获取失败,请刷新或重新登录");}QueryWrapper wrapper = QueryWrapper.create().select(PERMISSIONS_TREE.ALL_COLUMNS).select(META.ALL_COLUMNS).from(ROLE_USER).leftJoin(ROLE_PERMISSIONS).on(ROLE_USER.R_ID.eq(ROLE_PERMISSIONS.R_ID)).leftJoin(PERMISSIONS_TREE).on(ROLE_PERMISSIONS.P_ID.eq(PERMISSIONS_TREE.ID)).leftJoin(META).on(PERMISSIONS_TREE.META.eq(META.ID)).where(ROLE_USER.U_ID.eq(uid));List<PermissionMeta> metas = roleUserMapper.selectListByQueryAs(wrapper, PermissionMeta.class);return menuTree.menuList(metas);}

SQL语句

SELECT pt.id, pt.path, meta.*
FROM tb_role_user as rs
LEFT JOIN tb_role_permissions as rp  
ON rs.r_id = rp.r_id  
LEFT JOIN tb_permissions_tree as pt
ON rp.p_id = pt.id 
LEFT JOIN tb_meta as meta
ON pt.meta  = meta.id
WHERE  rs.u_id = {uid}

相关文章:

MyBatis-Flex学习记录1---请各位大神指教

简介&#xff08;官网介绍&#xff09; MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper帮助我们极大的减少了 SQL 编写的工作的同时&…...

二分查找旋转数组

已知整数数组nums&#xff0c;先按升序排序后&#xff0c;再旋转。旋转k位后&#xff0c;元素分别为nums[k],nums[k1]...nums[0]...nums[k-1]。请查找target 是否存在&#xff0c;如果存在返回所在索引&#xff1b;否则返回-1。假定nums没有重复的元素。 假定排序后的数组为{1…...

关于3D位姿旋转

一. 主动旋转和被动旋转 1. active rotation 主动旋转 站在坐标系的位置看旋转目标物&#xff1a;目标物主动发生旋转。 2. passive rotation 被动旋转 站在旋转目标物的位置看坐标系&#xff1a; 坐标系发生旋转&#xff0c;相当于目标物在坐标系内的位置被动地发生了旋转…...

解锁项目成功的关键:项目经理的结构化思维之道

1. 项目经理的核心职责 作为项目经理&#xff0c;我们的工作不仅仅是跟踪进度和管理团队。我们的角色在整个项目生命周期中都是至关重要的&#xff0c;从初始概念到最终交付。以下是项目经理的几个核心职责&#xff1a; 确保项目目标的清晰性项目的成功在很大程度上取决于其目…...

力扣974被K整除的子数组

同余定理 使用前缀和哈希表 由于可能是负数所以要进行修正&#xff1a;(sum%kk)%k class Solution { public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int,int> hash;hash[0 % k] 1; //0 这个数的余数int sum 0, ret 0;for(auto x…...

简单认识Docker数据管理

文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器&#xff0c;再开启数据就会消失&#xff0c;使用数据管理的数据卷挂载&#xff0c;实现了数据的持久化&#xff0c;重启数据还会存在…...

UDP数据报结构分析(面试重点)

在传输层中有UDP和TCP两个重要的协议&#xff0c;下面将针对UDP数据报的结构进行分析 UDP结构图示 UDP报头结构的分析 UDP报头有4个属性&#xff0c;分别是源端口&#xff0c;目的端口&#xff0c;UDP报文长度&#xff0c;校验和&#xff0c;它们都占16位2个字节&#xff0c;所…...

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)二(113)

需求&#xff1a; 有一个List<Map<String.Object>>,存储了区域的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;按区域维度统计每个区域出现的次数&#xff0c;并且按照次数的大小排序&#xff08;升序&#…...

C++进阶 类型转换

本文简介&#xff1a;介绍C中类型转换的方式 类型转换 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI&#xff08;了解&#xff09;总结 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型…...

Idea中隐藏指定文件或指定类型文件

Setting ->Editor ->Code Style->File Types → Ignored Files and Folders输入要隐藏的文件名&#xff0c;支持*号通配符回车确认添加...

第2步---MySQL卸载和图形化工具展示

第2步---MySQL卸载和图形化工具展示 1.MySQL的卸载 2.MySQL的图形化工具 2.1常见的图形化工具 SQLyog&#xff1a;简单。SQLyog首页、文档和下载 - MySQL 客户端工具 - OSCHINA - 中文开源技术交流社区 Mysql Workbench &#xff1a;MySQL :: MySQL Workbench DataGrip&…...

原型和原型链

好久没记了有点忘记了&#xff0c;来记录一下。 1、函数和对象的关系&#xff1a;对象都是通过函数创建的&#xff0c;函数也是一个对象。 2、原型和原型链 1.原型&#xff1a;原型分为两种 prototype&#xff1a;每一个函数都会有prototype属性&#xff0c;它指向函数的原型…...

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…...

LTPP在线开发平台【使用教程】

LTPP在线开发平台 点击访问 LTPP在线开发平台 LTPP&#xff08;Learning teaching practice platform&#xff09;在线开发平台是一个编程学习网站&#xff0c;该网站集文章学习、短视频、在线直播、代码训练、在线问答、在线聊天和在线商店于一体&#xff0c;专注于提升用户编…...

0818 新增码表 git拉取代码

目的是新增两个码表字段。然后和前端联调。 use db; delete from sys_dict_data where dict_type res_switch_status; INSERT INTO sys_dict_data VALUES (0, 1, 已接入, 1, res_switch_status, NULL, default, N, 0, , 2022-07-26 10:43:41, , NULL, NULL); INSERT INTO sys…...

AI 绘画Stable Diffusion 研究(十)sd图生图功能详解-精美二维码的制作

免责声明: 本案例所用安装包免费提供&#xff0c;无任何盈利目的。 大家好&#xff0c;我是风雨无阻。 为了让大家更直观的了解图生图功能&#xff0c;明白图生图功能到底是干嘛的&#xff0c;能做什么事情&#xff1f;今天我们继续介绍图生图的实用案例-精美二维码的制作。 对…...

C# File.ReadAllLines()报错

项目中需要读取一个文本文件的内容&#xff0c;调用C#的File.ReadAllLines(path)方法&#xff0c;但是报错&#xff0c;就提示unknown exception&#xff0c;也没其他提示了。 文件是在的&#xff0c;并且&#xff0c;如果把文件拷贝到另外一个路径&#xff0c;再次读取是正常…...

LeetCode 1162. As Far from Land as Possible【多源BFS】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【算法】二分查找(整数二分和浮点数二分)

二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;是一种效率较高的查找方法&#xff0c;时间复杂度为O(logN)。 二分查找采用了“分治”策略。使用二分查找时&#xff0c;数组中的元素之间得有单调性&#xff08;升序或者降序&#xff09;。 二分的模…...

git压缩/合并多次commit提交为1次commit提交

git压缩/合并N次commit提交为1次commit提交 假设有最近3次提交&#xff1a; commit_id1 commit_id2 commit_id3目标是把以上3次commit合并成1个commit&#xff0c;注意&#xff0c;最新的commit提交在最上面。 在git bash里面的操作步骤&#xff1a; &#xff08;1&#xff0…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...