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

小技巧notebook

小技巧notebook

1、MybatisPlus 批量保存

从BaseMapper接口方法可知,mybatis plus mapper只有根据id批量删除和查询,没有批量保存(insert 、update),要实现也很简单,需要定义一个Service

@Service
@Slf4j
public class QueueUsedInfoService extends ServiceImpl<QueueUsedInfoMapper, QueueUsedInfo> implements BatchInsertService {
}
interface BatchInsertService extends IService<QueueUsedInfo> {
}

其中QueueUsedInfoMapper实现了BaseMapper接口:

@Mapper
public interface QueueUsedInfoMapper extends BaseMapper<QueueUsedInfo> {
}

这个时候可以发现QueueUsedInfoService中有诸如saveBatch,saveOrUpdateBatch方法使用

2、MybatisPlus 注解实现脚本标签使用

比如、、这些标签,在mapper映射文件中可以直接使用,但是如果通过注解的话是不可以直接用的,需要用到{“”}标签包裹,如

@Select({"""<script>SELECTe.id,d.* FROM(SELECTc.* FROM(SELECTa.cluster_id,a.cluster_user,substring_index( substring_index( a.used, ',', b.help_topic_id + 1 ), ',', - 1 ) AS queue FROMpartition_info aINNER JOIN mysql.help_topic b ON b.help_topic_id &lt; ( length( a.used ) - length( REPLACE ( a.used, ',', '' )) + 1 ) ) c WHERECONCAT( c.cluster_id, '-', c.queue ) IN <foreach item='item' index='index' collection='items' open='(' separator=',' close=')'>#{item}</foreach>) dLEFT JOIN queue_used_info e ON d.cluster_id = e.cluster_id AND d.cluster_user = e.cluster_user AND d.queue = e.queue</script>"""})
List<QueueUsedInfo> getQueueUsedInfos(@Param("items") List<String> lstCondition);

另外注意

3、Mybatis实现insert时,同时根据主键唯一性有条件update

<!--批量操作,无则insert 有则update,update时根据最后更新时间做三元表达式判断:更新时间小于数据库时间,则不更新-->
<insert id="batchInsertOrUpdate" parameterType="list">insert into sc_job(id,cluster_id,job_user,job_status,last_update_time) values<foreach collection ="lstJob" item="item" separator =",">(#{item.id},#{item.clusterId},#{item.jobUser},#{item.jobStatus},#{item.lastUpdateTime})</foreach >on DUPLICATE KEY UPDATElast_update_time = IF(last_update_time > values(last_update_time),last_update_time,values(last_update_time)),cluster_id = IF(last_update_time > values(last_update_time),cluster_id,values (cluster_id)),job_user = IF(last_update_time > values(last_update_time),job_user,values (job_user)),job_status = IF(last_update_time > values(last_update_time),job_status,values (job_status))
</insert>

解释:如果没出现主键冲突,则insert;出现主键冲突的情况下满足条件的字段进行update

4、MySQL 利用help_topic系统表实现字符串无限制分割

前提:账号拥有root权限

SELECTa.cluster_id,substring_index( substring_index( a.used, ',', b.help_topic_id + 1 ), ',', - 1 ) AS queue FROMpartition_info aINNER JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.used ) - length( REPLACE ( a.used, ',', '' )) + 1 ) 

对表used字段进行无限制分割,原理:

利用help_topic.help_topic_id自增属性,得到切割后数据个数,然后使用substring_index循环切割,每次得到最后一个,这种方法的缺陷是需要MySQL用户拥有root权限

另外一种办法:

SELECTa.cluster_id,substring_index( substring_index( a.used, ',', b.id + 1 ), ',', - 1 ) AS queue FROMpartition_info aINNER JOIN (SELECT (@ROW :=@Row + 1) as id FROM user_info,(SELECT @Row:=-1) zz) b ON b.id < ( length( a.used ) - length( REPLACE ( a.used, ',', '' )) + 1 ) 

user_info表是库种已存在的表,行数必须大于分割字段的最大逗号数,利用其row number的特性创建自增序列,建议选用初始化表,保证有足够多的原始数据作为@Row的支撑

5、跨服务器数据库数据交叉处理脚本

#!/bin/bash 
echo "Start Check Data."#mysqldump source schema and data
mysqldump -h192.168.137.129 -P3307 -uroot -proot parauser --tables 源库表 > ./parauser.sql;
mysqldump -h192.168.137.129 -P3307 -uroot -proot ngbilling --tables 源库表 > ./ngbilling.sql;#source schema and validate data to console
mysql -h192.168.137.129 -P3306 -uroot -proot -e"
use 目标库;
set names utf8;
source ./parauser.sql;
source ./ngbilling.sql;---------------------------业务处理------------------------------------DROP TABLES 源库表;
commit;"#remove dump file
rm ./ngbilling.sql ./parauser.sql -f;echo "Check Data Successful." 
exit; 

6、年份分表数据批量导出备份

#!/bin/bash 
echo "Start Export Matomo Data..."
#$1为要导出数据年份,$2为需要创建备份数据库名称(不需要手动创建,matomo_backup.sql放export.sh同级目录)
echo "导出$1年的数据到备份数据库$2...";
#mysqldump导出源数据库结构及数据,具体数据库连接信息请自行修改
mysqldump -h192.168.137.128 -P3306 -uroot -proot matomo --column-statistics=0 > ./matomo.sql;#切换到目标数据库服务器,具体数据库连接信息请自行修改
mysql -h192.168.137.128 -P3307 -uroot -proot -e"
#创建备份库
CREATE DATABASE IF NOT EXISTS $2 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin;
use $2;
source ./matomo_backup.sql;#创建数据源临时库
CREATE DATABASE IF NOT EXISTS matomo DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin;
use matomo;
set names utf8;
source ./matomo.sql;#导出需要备份年份的数据(普通表)
---------------------------
INSERT IGNORE INTO $2.matomo_archive_invalidations SELECT * FROM matomo_archive_invalidations where DATE_FORMAT(ts_invalidated,'%Y') = $1;
---------------------------#切换到备份库,通过存储过程、游标创建备份库中不存在的数据表及数据插入
use $2;#处理matomo_archive_blob_*;matomo_archive_numeric_*数据表集合(年份表)
DROP PROCEDURE IF EXISTS export_list;
delimiter $
CREATE PROCEDURE export_list()
BEGIN#遍历结束标志DECLARE var_flag INT DEFAULT 0;#遍历表名变量DECLARE var_table_name VARCHAR(100);#表集合DECLARE table_name_list CURSOR FORSELECT table_name FROM information_schema.tablesWHERE table_schema = 'matomo' AND table_type = 'base table'AND(table_name like 'matomo_archive_blob_%' AND SUBSTR(table_name,21,4) = $1ORtable_name like 'matomo_archive_numeric_%' AND SUBSTR(table_name,24,4) = $1) ;#将结束标志绑定到游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_flag = 1;#打开游标OPEN table_name_list;FETCH table_name_list INTO var_table_name;WHILE var_flag !=1 DO#判断表类型IF FIND_IN_SET('matomo_archive_blob_',var_table_name)THEN#需要先判断该表在备份库是否存在,不存在需要先创建,然后再插入数据SET @createTableStr = CONCAT('CREATE TABLE IF NOT EXISTS ',var_table_name,'(idarchive int(10) UNSIGNED NOT NULL,name varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,idsite int(10) UNSIGNED NULL DEFAULT NULL,date1 date NULL DEFAULT NULL,date2 date NULL DEFAULT NULL,period tinyint(3) UNSIGNED NULL DEFAULT NULL,ts_archived datetime NULL DEFAULT NULL,value mediumblob NULL,PRIMARY KEY (idarchive, name) USING BTREE,INDEX index_period_archived(period, ts_archived) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT');ELSE#先判断该表在备份库是否存在,不存在需要先创建,然后再插入数据SET @createTableStr = CONCAT('CREATE TABLE IF NOT EXISTS ',var_table_name,'(idarchive int(10) UNSIGNED NOT NULL,name varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,idsite int(10) UNSIGNED NULL DEFAULT NULL,date1 date NULL DEFAULT NULL,date2 date NULL DEFAULT NULL,period tinyint(3) UNSIGNED NULL DEFAULT NULL,ts_archived datetime NULL DEFAULT NULL,value mediumblob NULL,PRIMARY KEY (idarchive, name) USING BTREE,INDEX index_period_archived(period, ts_archived) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT');END IF;PREPARE stmt FROM @createTableStr;EXECUTE stmt;#对matomo_archive_blob_*;matomo_archive_numeric_*数据表数据进行备份SET @insertStr = CONCAT('INSERT IGNORE INTO ',var_table_name,' SELECT * FROM matomo.',var_table_name);PREPARE stmt FROM @insertStr;EXECUTE stmt;FETCH table_name_list INTO var_table_name;END WHILE;CLOSE table_name_list;
END;#执行存储过程
CALL export_list();#删除存储过程
DROP PROCEDURE export_list;#切换回matomo临时库
use matomo;#删除临时源库
DROP DATABASE matomo;
commit;"#remove dump file
rm ./matomo.sql;echo "Export Data Successful."
exit; 

导出备份完成后对源库表清理脚本

#!/bin/bash 
echo "Start Clean Matomo Data..."
echo "开始清除已备份的$1年数据,请确保已执行export.sh进行备份...";
mysql -h192.168.137.128 -P3306 -uroot -proot -e"
use matomo;#删除已备份年份的历史数据(普通表)
DELETE FROM matomo_archive_invalidations where DATE_FORMAT(ts_invalidated,'%Y') = $1;#删除matomo_archive_blob_*;matomo_archive_numeric_*已备份年份的数据表(年份表)
DROP PROCEDURE IF EXISTS drop_table_list;
delimiter $
CREATE PROCEDURE drop_table_list()
BEGINDECLARE i INT DEFAULT 1;WHILE i <= 12 DOIF i < 10THENSET @dropTableStr = CONCAT('DROP table IF EXISTS matomo_archive_blob_$1_0' , i , ',' , 'matomo_archive_numeric_$1_0' , i);ELSESET @dropTableStr = CONCAT('DROP table IF EXISTS matomo_archive_blob_$1_' , i , ',' , 'matomo_archive_numeric_$1_' , i);END IF;PREPARE stmt FROM @dropTableStr;EXECUTE stmt;SET i = i+1;END WHILE;
END;#执行存储过程
CALL drop_table_list();
#删除存储过程
DROP PROCEDURE drop_table_list;
commit;"echo "Clean Data Successful."
exit; 

7、MySQL数据同步到Redis步骤

#将利用redis管道模式将MySQL数据刷入Redis
#1、MySQL查询结果拼接成Redis执行脚本,见:db/mysql_to_redis.sql
#2、将上一步脚本执行查询结果写入文件(具体的地址,数据库s,账号,密码根据需要设置,mysql_to_redis.sql,mtr.txt路径为MySQL容器路径)
docker exec mysql /bin/bash -c 'mysql -h192.168.137.128 -P3306 -uroot -proot -Dngbilling --skip-column-names --raw < /mydir/mysql_to_redis.sql > /mydir/mtr.txt'
#3、cat数据文件,通过管道符将结果让redis-cli批量刷入redis(具体的地址,数据库,密码根据需要设置,mtr.txt为redis容器根路径)
cat mtr.txt |redis-cli -h 192.168.137.128 -n 0 --pipe -a root

8、MySQL根据select结果集批量更新

UPDATE console.cluster a
INNER JOIN ( SELECT name, is_proxy, resource_type FROM console.b_cluster ) b ON b.name = a.id
SET a.owned = b.is_proxy ,a.res_type = b.resource_type;UPDATE console.account_group a,ngbilling.b_group b
SET a.fee_name = b.group_name
WHEREa.id = b.group_id;

相关文章:

小技巧notebook

小技巧notebook 1、MybatisPlus 批量保存 从BaseMapper接口方法可知&#xff0c;mybatis plus mapper只有根据id批量删除和查询&#xff0c;没有批量保存&#xff08;insert 、update&#xff09;&#xff0c;要实现也很简单&#xff0c;需要定义一个Service Service Slf4j …...

【2451. 差值数组不同的字符串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &…...

Java面试-每日十题

目录 1.try-catch-finally中的finally的执行机制 2.什么是Exception和Error 3.Throw和Throws的区别 4.Error与Exception区别 5.Java中的I/O流是什么&#xff0c;分为几类 6.I/O与NI/O 7.常用的I/O的类有哪些 8.字符流与字节流的区别 9.Java反射创建对象 10.什么是类的…...

java.awt.datatransfer.Clipboard剪切板获取String字符串文本

java.awt.datatransfer.Clipboard剪切板获取String字符串文本 有两种方法获取 直接从Clipboard获得 (String) systemClipboard.getData(DataFlavor.stringFlavor);从Clipboard获得Transable再获得String (String) systemClipboard.getContents(null).getTransferData(DataFlav…...

HCIA——VLAN

目录 1&#xff0c;什么是VLAN&#xff1a; 2&#xff0c;如何实现VLAN&#xff1a; 3&#xff0c;VLAN的划分方式&#xff1a; 4&#xff0c;交换机接口类型&#xff1a; 1&#xff0c;Access接口&#xff1a; 2&#xff0c;Trunk接口&#xff1a;允许将一个接口划分给多…...

测试分析流程及输出项

测试分析 一、确认测试范围 根据测试项目的不同需求&#xff0c;有大致几类测试项目类型&#xff1a;商户平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析&#xff0c;并给出对应…...

OO设计原则

OO设计原则&#xff1a;SOLID SOLID SRP&#xff08;The Single Responsibility Principle&#xff0c;单一责任原则&#xff09; 不应有多于1个的原因使得一个类发生变化一个类&#xff0c;一个责任 OCP&#xff08;The Open-Closes Principle&#xff0c;开放-封闭原则&…...

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…...

【Spring Boot】033-使用 `@ResponseBody` 注解代替`ServletResponse`?

【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse&#xff1f; 文章目录 【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse&#xff1f;0、全局总结一、ResponseBody 注解与 ServletResponse 比较1、ResponseBody 注解2、ServletResponse3、总结 二…...

【openGauss实战13】闪回技术

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

Top大学教授:青年学者,请避免这些写作问题→

在科研初期&#xff0c;很多作者由于缺乏经验和指导&#xff0c;糊里糊涂地发了一些质量较低的论文。 为了帮助青年科学家提高写作能力&#xff0c;比利时鲁汶大学的Blocken教授&#xff08;同时也是Building & Environment、Journal of Wind Engineering & Industrial…...

使用midjourney搞出一套三国人物画像!

当下已进入如火如荼的全民AI时代&#xff0c;最近体验了下midjourney&#xff0c;使用它的以图生图功能生成出来一套三国人物画像&#xff0c;和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程&#xff0c;大致如下&#x…...

ELK日志分析系统

ELK日志分析系统 日志主要包括系统日志/var/log 应用日志 安全日志secure&#xff0c; rsyslog远程传输日志进行汇总集中化管理&#xff0c;日志统计和检索又成为一件比较麻烦的事情&#xff0c;、 1、完整日志系统基本特征 收集&#xff1a;能够采集多种来源的日志数据 …...

整型在内存中的存储

目录 一、为什么内存中存储补码&#xff1f; 二、大小端概念 百度笔试试题&#xff1a; 几道小题&#xff1a; 一、为什么内存中存储补码&#xff1f; 上一节我们了解了原码&#xff0c;反码&#xff0c;补码的概念&#xff08;http://t.csdn.cn/N0grg&#xff09;&#xff…...

子集-回溯算法

1题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1…...

公司study three

ctrlwind&#xff1a;新建桌面 ctrlwin 箭头 切换桌面 WIN CTRL F4 删除桌面 stream foreach遍历 instFormModifytracesList.stream().forEach(s->{ s.setModifyUser(sysUserTemplate.getNameById(s.getModifyUser()));});拼接 String collect2 peopleList.stream()…...

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…...

CycloneDDS开源代码在Linux系统上编译生成可执行文件的详细步骤

cyclonedds开源代码在Linux系统上编译生成可执行文件的详细步骤 1 远程仓库CycloneDDS源码下载2 创建build目录3 进入build目录4 指定安装路径前缀5 编译 cmake --build6 编译完成后进行安装7 版本构建并编译7.1 虚拟机网络桥接7.2 镜像源添加7.3 CUnit单元测试工具安装7.4 编译…...

PLL锁相环的一部分--鉴频鉴相器

鉴频鉴相器作为锁相环的一部分也是有相对应的独立芯片. 鉴频鉴相器芯片主要有以下几种&#xff1a; LM565/LM565C 鉴频鉴相器芯片XR2211CP 鉴频鉴相器芯片NE567 比较器、鉴频、鉴相 ICMC1496/LM1496 综合运算放大器与调制/解调器 ICLM567 比较器、鉴频、鉴相 ICMC100EP2100 高…...

CSS实现磨砂玻璃(毛玻璃)效果样式

要实现磨砂玻璃背景&#xff0c;可以使用 CSS3 中的 ::before 伪元素和 backdrop-filter 属性&#xff0c;结合 opacity 属性和 blur() 函数来实现。 具体实现步骤如下&#xff1a; 创建一个具有背景的元素&#xff0c;例如一个 div 元素。 div {background-image: url(&quo…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...