Qt中SQLite3的增、删、改、查操作

2023-11-18

QT & sqlite3:

先说一下QT自带数据库sqlite3和另外用sqlite3插件的区别,他们的功能是一样的,但是代码就不一样了。QT对数据库具有完善的支持,不需要加任何其他插件就可以直接使用,但是如果你要是加了sqlite3插件,调用数据库就跟直接调用一个驱动一样,直接调用接口函数:openclose……,换言之QT自带的数据库语言就用不上了。

一、使用Qt自带的数据库sqlite3

Qt自带了很多常用的数据库驱动,使用起来非常方便如下图所示:


使用Qt自带数据库SQLite3的代码实例:

Connect to Sqlite and do insert, delete, update and select

  

Foundations of Qt Development\Chapter13\sqltest\sqlite\main.cpp
/*
 * Copyright (c) 2006-2007, Johan Thelin
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 *     * Redistributions of source code must retain the above copyright notice, 
 *       this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright notice,  
 *       this list of conditions and the following disclaimer in the documentation 
 *       and/or other materials provided with the distribution.
 *     * Neither the name of APress nor the names of its contributors 
 *       may be used to endorse or promote products derived from this software 
 *       without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include <QApplication>

#include <QtSql>
#include <QtDebug>

int main( int argc, char **argv )
{
  QApplication app( argc, argv );
   //创建连接
  QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );//第二个参数可以设置连接名字,这里为default

  db.setDatabaseName( "./testdatabase.db" );// 设置数据库名与路径, 此时是放在上一个目录
  //打开连接
  if( !db.open() )
  {
    qDebug() << db.lastError();
    qFatal( "Failed to connect." );
  }
    
  qDebug( "Connected!" );
  //各种操作
  QSqlQuery qry;
  //创建table
  qry.prepare( "CREATE TABLE IF NOT EXISTS names (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug() << "Table created!";
    //增
  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (1, 'John', 'Doe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (2, 'Jane', 'Doe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (3, 'James', 'Doe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (4, 'Judy', 'Doe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (5, 'Richard', 'Roe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (6, 'Jane', 'Roe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (7, 'John', 'Noakes')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (8, 'Donna', 'Doe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );

  qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (9, 'Ralph', 'Roe')" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Inserted!" );
//查询
  qry.prepare( "SELECT * FROM names" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
  {
    qDebug( "Selected!" );
    
    QSqlRecord rec = qry.record();
    
    int cols = rec.count();
    
    for( int c=0; c<cols; c++ )
      qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
      
    for( int r=0; qry.next(); r++ )
      for( int c=0; c<cols; c++ )
        qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
  }
  
  
  qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = 'Roe'" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
  {
    qDebug( "Selected!" );
    
    QSqlRecord rec = qry.record();
    
    int cols = rec.count();
    
    for( int c=0; c<cols; c++ )
      qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
      
    for( int r=0; qry.next(); r++ )
      for( int c=0; c<cols; c++ )
        qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
  }


  qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = 'Roe' ORDER BY firstname" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
  {
    qDebug( "Selected!" );
    
    QSqlRecord rec = qry.record();
    
    int cols = rec.count();
    
    for( int c=0; c<cols; c++ )
      qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
      
    for( int r=0; qry.next(); r++ )
      for( int c=0; c<cols; c++ )
        qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
  }


  qry.prepare( "SELECT lastname, COUNT(*) as 'members' FROM names GROUP BY lastname ORDER BY lastname" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
  {
    qDebug( "Selected!" );
    
    QSqlRecord rec = qry.record();
    
    int cols = rec.count();
    
    for( int c=0; c<cols; c++ )
      qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
      
    for( int r=0; qry.next(); r++ )
      for( int c=0; c<cols; c++ )
        qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
  }
  //更新
  qry.prepare( "UPDATE names SET firstname = 'Nisse', lastname = 'Svensson' WHERE id = 7" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Updated!" );

  qry.prepare( "UPDATE names SET lastname = 'Johnson' WHERE firstname = 'Jane'" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Updated!" );
  //删除
  qry.prepare( "DELETE FROM names WHERE id = 7" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Deleted!" );

  qry.prepare( "DELETE FROM names WHERE lastname = 'Johnson'" );
  if( !qry.exec() )
    qDebug() << qry.lastError();
  else
    qDebug( "Deleted!" );


  db.close();

  return 0;
}
二、Qt中使用sqlite3插件

1、安装sqlite3插件

从官方网站http://www.sqlite.org下载完整版本。

2、安装sqlite3

网上可以看到很多修改下载之后的源代码的论坛,我估计那些帖子比较老一点,最新版的代码已经不存在那些bug了,可以直接编译

 *注意复制粘贴库函数的时候有的动态链接库如果单独复制会丢失之间的链接关系,所以需要一块复制

cp -arf libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 。。。

3、移植sqlite3

QTEinclude文件中建立新文件夹sqlite3,将头文件放到里面;把库文件放到QTElib文件中

4编程代码实例:

1 QT生成的.pro文件中添加库指令: LIBS += -lsqlite3

2 在调用数据库的文件的头文件里添加头文件和变量

 #include "sqlite3/sqlite3.h"            

 sqlite3 *db;        //数据库

 char *zErrMsg;      //出错信息

 char  **resultp;    //调用时的保存位置

 int  nrow;          //列数

int  ncolumn;       //行数

 char  *errmsg;      //出错信息

3)新建或打开数据库      

if( (sqlite3_open("people.db", &db)) != 0 ){

qDebug()<<"sqlite3 open is false";

 }

else {

qDebug()<<"sqlite3 open is OK";

 }

4 建立表格

sqlite3_exec(db, "create table person(name varchar(30) PRIMARY KEY, age int);", NULL, NULL, &zErrMsg);

*添加 PRIMARY KEY 是指定主键,每个数据库只能有一个,主键的值不能重复,比方说你设定name为主键,则相同名字的人只能保存第一个,其他的忽略不计。若想避免这种情况,则去掉主键或者设定id号为主键(id号一直加一,不会重复)。

5)往表格里写入信息

 a.直接添加数据  

 sqlite3_exec(db, "insert into person values('张翼', 30)", NULL, NULL, &zErrMsg);

 sqlite3_exec(db, "insert into person values('hongdy', 28)", NULL, NULL, &zErrMsg);                     

 b.添加数字变量

 int  data=10;

 char sql2[100];  //必须写明大小,划分内存,如果只写一个 char *sql2,会出现段错误

 sprintf(sql2,"insert into person values('张翼',%d);",data);

sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);

*sprintf的作用是字串格式化命令,主要功能是把格式化的数据写入某个字符串中

 c.添加字符串变量

 char data[]="张翼";

 char sql2[100];

 sprintf(sql2,"insert into person values('%s',10);",data);

sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);

 * %s需要用单引号注释             

d.添加text中的变量到数据库中

 这里需要汉字编码的问题,Windows下默认GBKGB2312编码,Linux下默认UTF-8编码,所以如果没有设置好会出现乱码

d1. main.cpp中添加以下指令,支持中文显示 

 #include <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

d2. 读取保存

 char *abc=ui->lineEdit->text().toUtf8().data();   //QString char*

 sprintf(sql2,"insert into person values('%s',%d);",abc,data);

sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);

*在调试的时候如果用串口超级终端调试的话,在ARM上显示正常,但是在串口是乱码,不要被迷惑

6)查询、调用数据库

a. 查询全部

sqlite3_get_table(db, "select * from person", &resultp, &nrow, &ncolumn, &errmsg);

*resultp保存数据库信息,nrow返回列数,ncolumn返回列数

b. 查询部分信息

sqlite3_get_table(db, "select * from person where name='zhang'", &resultp, &nrow, &ncolumn, &errmsg);

c. 变量查询查询

 char data[]="张翼";

 char sql3[100];

 sprintf(sql3,"select * from person where name='zhang';",data);

 sqlite3_get_table(db, sql3, &resultp, &nrow, &ncolumn, &errmsg);

 *查询时使用变量的方法和添加时一样

(7)关闭数据库

 sqlite3_close(db);

三、VS+QT使用SQL驱动

//1.添加SQL库:"Qt project setting"-->"Qt Modules",在SQL library复选框前打勾.或者在vs项目属性--》连接器--》输入里加入Qt5Sqllib
//2.添加头文件
//#include<QtSql>//这样写会报Cannot open include file: 'QtSql': No such file or directory,奇葩错误,因为QtSql只是一个文件夹
#include <QtSql/QSqlDatabase>//这样写可以
#include <QtSql/QSqlTableModel>
#include<QtSql/QSqlError>
//3.创建连接
qDebug()<< "available driver:" ;
  QStringList drivers=QSqlDatabase::drivers();
  foreach(QString driver,drivers)
    qDebug()<< "/t" <<driver;
  QSqlDatabase db=QSqlDatabase::addDatabase( "SQLITE" );
  qDebug()<< "SQLITE driver?" <<db.isValid();
  QString dsn=QString::fromLocal8Bit( "DRIVER={SQL SERVER};SERVER=192.168.0.123;DATABASE=test" );      db.setHostName( "192.168.0.123" );
  db.setDatabaseName(dsn);
  db.setUserName( "sa" );
  db.setPassword( "111111" );
  if (!db.open())
  {
    qDebug()<<db.lastError().text();
     QMessageBox::critical(0,QObject::tr( "Database Error" ),db.lastError().text());
     return false ;
  }
//4.查询数据
QSqlQuery query;
query.exec( "select * from mytable" );
while (query.next())
{
.........
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中SQLite3的增、删、改、查操作 的相关文章

  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 在 SQLite 中加密数据

    如何加密我的数据 就我研究的解决方案而言 有两种方法 使用android提供的算法加密数据 我使用android提供的 Cipher 来加密我的数据 但我在检索大量记录的数据时遇到问题 导致应用程序的性能显着降低 我对整个数据库进行了编码
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 将unix时间转换为字符串的Powershell函数?

    我正在尝试使用 ADO NET 和 PowerShell 读取 Firefox place sqlite datedase 的日期字段 显然这些字段是 Unix 时间的 我正在寻找 Net 日期时间或字符串的转换 Edit 我想将数据行绑定
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 使用 CursorLoader 查询 SQLite DB 并填充 AutoCompleteTextView

    我有一个 SQLite 数据库我想查询 我想通过 ICS 以 Android 2 2 为目标 我碰到this http www outofwhatbox com blog 2010 11 android simpler autocomple
  • 错误:任务“:app:packageDebug”执行失败 - Java 堆空间

    当我尝试构建 APK 时 我在 Android Studio 日志中收到此错误 错误 任务 app packageDebug 执行失败 Java堆空间 当我尝试在资产目录中构建 350 MB 大小的 sqlite 的 APK 时 就会出现此
  • Laravel - 调用未定义的方法 Illuminate\Database\Query\Builder::user()

    我正忙于Laravel 从头开始 更新记录和预加载 https laracasts com series laravel 5 from scratch episodes 10 我已经遵循了该教程 但在尝试在 CardsController
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • Eclipse 中有 SQLite 数据库查看器工具吗?

    我正在使用 Eclipse 进行 Android 编程 有没有可以在模拟器中查看SQLite数据库的工具 请参阅博客文章在 Eclipse 中浏览 Android 模拟器 SQLite 数据库 http www tylerfrankenst
  • 如何使用 Sqlite3 用列表中的值更新整个列

    我有一个数据集本地存储在 sqlite3 数据库中 我提取了一列 执行了一些操作 现在想要替换数据库列中的所有值 我怎样才能做到这一点 保证列和列表的长度相同 我只想用新值更新表 有没有一种简单的方法可以一次性完成这一切 使用Python
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP

随机推荐

  • QGis 二次开发教程(目录)

    目录 QGis 二次开发搭建 windows QGis QgsVectorLayer 图层加载 shp file矢量图层 QGis QgsVectorLayer 图层数据解析 获取经纬度集合和其他字段标量 QGis QgsVectorLay
  • Keras+CNN模型识别手写数字(mnist)详细分析

    CNN模型 CNN卷积神经网络 包含卷积层 卷积运算提取输入的不同特征 更多层的网络能从低级特征中迭代提取等复杂的特征 线性整流层 RELU 池化层 卷积后会得到维度很大的特征 将特征切成几个区域 取最大值或平均值 得到新的较小维度特征 全
  • tcp和udp,通信协议

    1 什么是tcp和udp 常用的网络通讯 浏览网页 软件聊天等等 都是基于tcp和udp传输的 2 tcp和udp的区别是什么 1 最大的区别是一个基于连接 一个基于非连接 举例说明 如果把人与人之间的通信比喻为进程之间的通信 写信和电话
  • 通俗易懂讲解区块链

    文章目录 一 区块链是什么 区块链的几个核心特点 1 去中心化 2 非常安全 3 不可篡改性 4 开放性 5 无第三方 6 匿名性 二 区块链与比特币的关系 三 通俗易懂解释区块链 1 民生领域 2 经济产业领域 3 政务领域 4 数字身份
  • B站马士兵python入门基础版详细笔记(6)

    前言 这篇文章是B站学习python入门基础班的视频的第五 六章内容 主要讲述的是列表 主要包括列表的创建 以及他的元素的增 删 查 改操作命令 一 列表的初始化 为什么要使用列表 列表就好比C语言中的数组 它可以在这个数组里面保存各种类型
  • 达梦数据库创建数据库实例、规划表空间

    1 创建数据库实例 1 1图形方式创建 到数据库安装目录 dm7 的 tool目录下 打开达梦数据库配置助手 dmdba localhost tool dbca sh 打开达梦数据库配置助手 选择创建数据库实例 点击 开始 如下图 创建数据
  • unity shader入门(一) 基本结构和变量声明

    文章目录 前言 Unity中shader相关的结构 什么是openGL和DirectX unity shader的分类 编写一个unity shader shader的基本结构 shader的property类型 在subshader中再次
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • 【知识分享】机器学习的基本流程

    个人理解的机器学习简单流程如下 0 收集数据 1 对数据集进行预处理 2 划分数据集 训练集 测试集 验证集 3 训练 4 验证模型 对每个步骤详细解释 0 收集数据 可以使用之前学过使用爬虫对特定网页内容爬取 或在数据网页等信息网站上直接
  • [error] MFC错误不能将参数1从"const char [3]"转换为"const wchar_t *"

    在做项目中经常遇到很多错误 这里我仅仅把自己遇到的一些错误和解决方法写出 供自己和大家查看 代码如下 CRect rect GetClientRect rect CString str str Format ld rect bottom M
  • OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1

    最近切换到64位系统上 运行以前的程序真是各种bug不停啊 主要还是系统位数导致的 先看下面这个错误 OpenCV Error Assertion failed type B type type CV 32FC1 type CV 64FC1
  • 解决ChatGML启动报错:RuntimeError: expected scalar type Half but found Float

    1 编辑web demo2 py文件 2 在原始命令加上 half 原始命令 model AutoModel from pretrained app model chatglm2 6b trust remote code True half
  • 如何优雅地实现 Excel 文件导出功能?(阿里出品的 EasyExcel,安利一波)

    EasyExcel 前言 导出是后台管理系统的常用功能 当数据量特别大的时候会内存溢出和卡顿页面 曾经自己封装过一个导出 POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件
  • 区块链技术详解

    区块链概述 区块链定义 区块链 是一个共享的 不可篡改的账本 旨在促进业务网络中的交易记录和资产跟踪流程 资产 可以是有形的 如房屋 汽车 现金 土地 也可以是无形的 如知识产权 专利 版权 品牌 几乎任何有价值的东西都可以在区块链网络上跟
  • 关于ROM,RAM,FLASH的个人理解

    RAM和ROM是指的存储介质 不是存储器 在硬件构造上不同 所以性质不同 但都是半导体存储介质 RAM是随机存取存储器 随机是什么意思呢 意思是 给定一个地址 可以立即访问到数据 访问时间和位置无关 RAM特点是掉电会丢失数据 但是RAM的
  • docker -toolbox host is not running 最简单解决方案

    很多小伙伴下载toolbox后 用gitbash运行docker machine start 可能会出现 docker host is not running的错误信息 其实我觉得就是无法启用虚拟机服务 打开虚拟机可以看到其实创建的虚拟机是
  • 小米手机安装linux视频教程,屏幕失灵的小米5手机安装linuxdeploy centos7记录

    几年前使用的小米5手机不知道什么时候屏幕失灵了 触摸任何地方都没有反应 幸好下面三个实体按键还是好的 就拿来安装一下linux系统 我到华强北去问了一下 修好屏幕至少需要100多块 这个手机卖旧手机也就是100块 懒得换屏幕盖板了 刚好前段
  • java sqlexception_java.sql.SQLException

    java sql SQLException ResultSet is closed是什么错误 java sql SQLException ResultSetisclosed是什么错误 java sql SQLException Result
  • 项目开发中开发文档出现的问题及其对策

    在常规项目开发管理中 很多项目专家都提出要用各种各样规范的文档对开发工作进行管理 但是在日常工作中 由于这些文档的编写的管理工作都是相当繁重的 以致让一线员工不能主动积极使用 更新这些文档 长期下来 这些管理型的 设计型的文档所发挥的作用就
  • Qt中SQLite3的增、删、改、查操作

    QT sqlite3 先说一下QT自带数据库sqlite3和另外用sqlite3插件的区别 他们的功能是一样的 但是代码就不一样了 QT对数据库具有完善的支持 不需要加任何其他插件就可以直接使用 但是如果你要是加了sqlite3插件 调用数