10秒内插入亿量级数据,我滴妈,真牛逼...

【MyBatis-Plus】之批量插入 一、应用情景介绍 在实际的项目开发过程中,常常遇到批量保存数据的场景,当数据量比较少,比如只有几条数据的情况下,我们可以使用 for 循环来 insert 数据,但如果数据量比较多的情况下就不行,特别是并发的情况下,因为这样会增加数据库的负担。 我们通过查看 mybatis-plus 源码发现,mybatis-plus 的 IService API 接口提供了批量插入的接口: public interface IService<T> { ...... /** * 插入 阅读详情

在这里插入图片描述

一、前言

相信很多小伙伴都遇到过大数据量导入DB,或者说数据库分表带来的数据批量插入,这时候会遇到个问题就是插入效率低的问题,例如博主前段时间在导入几千万条万条数据时,过程耗时***秒,具体多少?反正没有继续等,直接崩溃。

于是乎对代码做了点优化,最后做到了10s内!!!



开始表演,mock下过程


原始写法,用的正常mybatisplus插入:

public void insertMore() {
        long beginTime = System.currentTimeMillis();

        int num = 10000000;
        List<SysAdmin> sysAdminList = new ArrayList<>();

        for (int i = 0; i < num; i++) {
            SysAdmin sysAdmin = new SysAdmin();
            sysAdmin.setUserName("学员" + i);
            sysAdmin.setRealName("学员" + i);
            sysAdmin.setPassword("***");
            sysAdmin.setPhone("10086");
            sysAdmin.setEmail("10086@qq.com");
            sysAdmin.setInfo("测试用户");
            sysAdminList.add(sysAdmin);
        }
        
        adminService.saveBatch(sysAdminList);


        long endTime = System.currentTimeMillis();

        System.out.println("耗时" + (endTime - beginTime) / 1000 + "秒");
 }

结果: 等了几分钟都没插入完

耗时*********************************秒

多线程分批插入

public void insertMore() {
        long beginTime = System.currentTimeMillis();

        int num = 10000000;
        List<SysAdmin> sysAdminList = new ArrayList<>();

        for (int i = 0; i < num; i++) {
            SysAdmin sysAdmin = new SysAdmin();
            sysAdmin.setUserName("学员" + i);
            sysAdmin.setRealName("学员" + i);
            sysAdmin.setPassword("***");
            sysAdmin.setPhone("10086");
            sysAdmin.setEmail("10086@qq.com");
            sysAdmin.setInfo("测试用户");
            sysAdminList.add(sysAdmin);
        }
        int nThreads = 100;

        int size = sysAdminList.size();
        ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
        List<Future<Integer>> futures = new ArrayList<Future<Integer>>(nThreads);

        for (int i = 0; i < nThreads; i++) {
            final List<SysAdmin> adminList = sysAdminList.subList(size / nThreads * i, size / nThreads * (i + 1));

            Callable<Integer> task1 = () -> {
                adminService.saveBatch(adminList);
                return 1;
            };
            futures.add(executorService.submit(task1));
        }
        executorService.shutdown();

        long endTime = System.currentTimeMillis();

        System.out.println("耗时" + (endTime - beginTime) / 1000 + "秒");
}

结果:

耗时9秒

代码说明:

上面是通过应用ExecutorService 建立了固定的线程数,然后根据线程数目进行分组,批量依次导入。一方面可以缓解数据库的压力,另一个面线程数目多了,一定程度会提高程序运行的时间。

缺点就是要看服务器的配置,如果配置好的话就可以开多点线程,配置差的话就开小点。

Mybatis-plus---的批量插入 丝滑的批量操作,我选它insertBatchSomeColumn 阅读详情

相关推荐

Mybatis 大数据量的批量insert解决方案

关于Mybatis 大数据量批量insert解决方案

小灯光环 12万+

JAVA高效率 (秒级) 将千万条数据导入数据库 (已封装工具类)【详解】【一看就懂】

最近在导入一个500w+的数据至数据库时,遇到一个异常,相信做大数据应该都有遇到。500w的数据说大不大,说小也不小,既然问题出现了,那么就一定要解决。 异常如下图所示: 所使用的方法在如下链接: MySQL数据库10秒内插入百万条数据 (多字段)【详解】 由于数据通过该方式转换为一条sql,执行读取工作量过于庞大,导致所创建的对象都为强引用,垃圾回收机制无法释放内存,所导致堆内存溢出而造成的异常。 想了一下,虽然通过prepareStatement的addBatch( )方法可以做到.

杨大仙 2万+

基于轻量级php搜索sphider站内搜索初级优化

站内搜索初级优化php1>. 概述: 站内搜索引擎顾名思义即网站内的信息搜索引擎,随着网络的发展,网站已经成为了企业或机构最重要的公共形象门户。每天,大量潜在的客户、合作者、投资人,分析师等会登陆企业的网站,网站带给他们的感受将直接影响到他们对公司的评价。根据IDC的调查显示:当用户登陆一个网站时,在一开始如果不能很快地检索到他所需要的信息,则50%的用户会立刻离开此网站,其中的60%将不

chijiaodaxie的博客 25万+

一亿条mysql更新_如何将上亿条大容量数据导入MYSQL

我有一份数据量达到1,0015,0806条的csv文件,现在需要导入Mysql中。 在我电脑中安装的版本是MYSQL8.0.12,常见的管理工具有:已知的有三种办法: ...

weixin_30724201的博客 952

【Python百日进阶-Web开发-Feffery】Day364 - 轻量级的 python ORM:peewee基础

文章目录1 peewee是什么?2 ORM模型2.1 ORM模型导入2.2 ORM的基本技术有3种3 peewee官网4 peewee安装5 连接数据库5.1 连接MySQL数据库5.2 连接Sqlite数据库6 模型定义7 创建数据表7.1 每次创建一张表7.2 一次创建多张表8 插入数据8.1 插入一条数据8.2 插入多条数据9 查询数据9.1 查询所有数据9.3 查询单条数据10 删除数据11 更新数据12 关联数据 1 peewee是什么? peewee 是一个轻量级的 python ORM 库。内

专注于医院数据分析技术与系统开发的创作与分享。 341

电力现货市场出清机制解析:从理论到实践(附节点电价计算实例)

本文深入解析电力现货市场的核心出清机制,重点阐述了节点边际电价的计算原理与实践方法。通过对比系统边际电价、节点边际电价和分区边际电价三种模式,揭示了市场出清价格如何反映电力供需与网络阻塞。文章结合IEEE 30节点系统,提供了基于MATLAB和最优潮流模型的计算实例,详细展示了从构建模型到求解对偶变量以获取节点电价的全过程,为理解电力市场定价机制提供了从理论到实践的完整路径。

whisky的博客 754

hibernate 插入 效率_Hibernate(二)- 插入数据

通过for循环插入10个Product对象到数据库步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:效果步骤4:插入数据到数据库步骤 1 : 先运行,看到效果,再学习老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。步骤 2 : 模仿和排错在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。 模仿过程难免...

weixin_39685836的博客 93

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8506

动画:面试官问我插入排序和冒泡排序哪个更牛逼?

作者 | 小鹿同学 来源 | 小鹿动画学编程 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排...

墨鱼菜鸡 631

汽车电子电气架构演进:从分布式ECU到域集中与中央计算

汽车电子电气架构(EEA)是整车电子系统的顶层设计框架,定义了计算、通信、供电等核心要素的组织方式。其演进遵循从分布式到集中式的技术路径,旨在解决传统架构下ECU数量膨胀带来的成本、复杂度和协同难题。通过域控制器(DCU)整合功能域,以及向中央计算+区域控制架构发展,实现了硬件资源池化、软硬件解耦与高速通信。这一变革的核心技术价值在于提升算力利用率、简化线束布局、支持软件定义汽车(SDV)与持续OTA升级。在智能电动汽车时代,新架构为智能座舱、自动驾驶等复杂应用提供了可扩展的平台基础,推动了汽车产业从硬件导

weixin_30326741的博客 383

AutoGenTestCase - AI大模型生成测试用例

AI技术助力高效软件测试:AutoGenTestCase工具介绍 传统手工测试存在效率低、覆盖不全等痛点。AutoGenTestCase工具集成DeepSeek、通义千问等AI大模型,能快速解析需求并自动生成标准化测试用例,将数小时工作缩短至分钟级。该工具部署简单,仅需配置APIKey即可运行,支持多种测试用例类型比例设置,并输出Markdown和Excel格式的测试用例。通过GitHub或网盘下载后,用户可按照教程完成APIKey配置、需求文档上传和用例生成等操作,显著提升测试效率与覆盖完整性。

YIqifeibaQI的博客 347

存在就不插入_动画:面试官问我插入排序和冒泡排序哪个更牛逼?

来自公众号:小鹿动画学编程写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料...

weixin_30475939的博客 250

论文理解【LLM-OR】——【OptMATH】A Scalable Bidirectional Data Synthesis Framework for Optimization Modeling

本文提出 LLM-OR 领域的双向数据合成框架 OptMATH,从已有 MF/PD 出发反向生成 NL,再使用 AutoFormulator 进行正向建模,通过最优值匹配 rejection sampling 确保语义一致性。实现了难度可控的语义一致数据合成

佚失的诗篇 497

100亿级订单怎么调度,来一个大厂的极品方案

尼恩给大家做一下系统化、体系化的 订单的超时处理的方案,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。大家可以把这个海量任务定时调度的方案写入简历。

架构师尼恩 6749

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 460

多机器人协同:水下机器人集群的分布式控制与ROS仿真实践

本文探讨了多自主水下机器人(AUV)集群的分布式控制方法,重点分析了欠驱动6自由度AUV模型的反馈线性化技术。通过ROS/Gazebo仿真平台,详细介绍了系统架构设计、通信延迟补偿策略及环境扰动应对方案,为水下协同作业提供实用参考。

jupi8的博客 686

再见,Teamviewer!这款国产轻量级远程桌面软件超牛逼!

来源:量子位对很多Mac用户来说,想用远程控制请教下大佬,太难了。在Windows上一个QQ就能搞定的事,而Mac用户几乎只能依赖Teamviewer。Teamviewer还遭到不少吐槽:...

Python数据之道 577

YOLOv8/v9 遥感图像目标检测实战指南:建筑物检测与变化监测

遥感图像在城市规划、灾害评估、农业监管等领域应用广泛,但传统目标检测方法存在效率低、精度不足、难以适配遥感图像大尺寸、多尺度目标等问题。本文以“建筑物检测与变化监测”为核心,基于DOTA、NWPU VHR-10等公开数据集,系统讲解YOLOv8/v9在遥感图像中的实战流程。从数据获取、格式转换、模型训练优化,到大图切片推理、建筑物变化监测,全程提供可复现的代码与参数配置。通过针对性优化(旋转增强、切片推理等),模型在NWPU VHR-10数据集上mAP50达0.85以上,可适配卫星影像、无人机航拍等多场景

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 519

冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

(给算法爱好者加星标,修炼编程内功)来源:小鹿动画学编程,作者:小鹿同学写在前边排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。虽然我们基本知道了这些排序算法,...

weixin_39954682的博客 90

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java数组插入其他元素向后移动比较快的方法

今天看ArrayList 源码时发现了一个可以快速移动数组的方法System.arraycopy() 它一共5个参数 原数组 (就是要被复制的数组) 从那个位置开始 目标数组 复制到那个位置 复制多少元素 这样一看没什么啊 但是当目标数组和被数组数组是同一个数组时就会有意想不到的结果 可以看一下下面的代码 public class ArrayListTest { public static void main(String[] args) { int elementData[] =

一叶一菩提的博客 1281

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

冒泡排序java思维导图_动画:面试官问我插入排序和冒泡排序哪个更牛逼?

写在前边排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的...

weixin_29111277的博客 129

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

一款比 Elasticsearch 更快、更强劲的轻量级搜索引擎!我的天,这也太牛逼了吧...

Manticore Search 是一个使用 C++ 开发的高性能搜索引擎,创建于 2017 年,其前身是 Sphinx Search。Manticore Search 充分利用了 Sphinx,显着改进了它的功能,修复了数百个错误,几乎完全重写了代码并保持开源。这一切使 Manticore Search 成为一个现代,快速,轻量级和功能齐全的数据库,具有出色的全文搜索功能。Manticore Search目前在GitHub收获3.7k star,拥有大批忠实用户。

民工哥的博客 606

使用轻量级工具emoji-java处理emoji表情字符

在之前做博客,测试编辑博客和评论功能时,发现如果输入了emoji表情的话,无法插入数据库,会报错类型不匹配的错误。后来在网上找了很多解决办法,最后发现github上有个很牛逼的轻量级开源工具叫emoji-java。 github地址:https://github.com/vdurmont/emoji-java 基本使用方法在github的README文件里有说明,不过是英文的,我简单研究了一下...

xiao190128的专栏 1049

只有 Python ORM Pony ORM,一个牛逼的ORM

只有 Python 魔法少女才知道的 PonyORM 开发项目时,经常会用到 ORM,而 Python 里能用的 ORM 其实也没几个,以我目前的开发经验来看,比较顺手的 ORM 有 Django 内置的那个,或是写 Flask 时,可以配合使用大佬封装好的 Flask-SQLAlchemy。而它们都与框架绑定,当你想在 W...

从零开始学习python --zeropython 1408
上一篇: Kafka原理详细介绍
下一篇: java中如何查询一个指定的子字符在字符串中出现的所有or指定次数的下标索引
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值