🎯 一句话总结
| 场景 | 推荐选择 |
|---|---|
| 桌面软件、单机应用、小程序、嵌入式设备 | SQLite✅ |
| 网站后台、高并发、多人协作、大数据量 | MySQL✅ |
💡 本文不讲深奥原理,只讲怎么选、怎么用、怎么避坑。
📖 故事开场:小王的困境
小王用 JavaFX 做一个桌面记账软件,需要存用户的账单数据。
他一开始想装 MySQL,结果发现:
- 😱 MySQL 8.0 安装包 400MB+,安装完占 700MB 内存
- 😱 用户电脑没装 MySQL,软件根本跑不了
- 😱 换个电脑还要重新配数据库
后来他发现了SQLite—— 一个只有一个文件的数据库,直接塞进项目里,随软件一起打包!
🎉这就是 SQLite 的魅力:零配置、零安装、随用随走。
🏗️ 一、架构对比:一个"没服务器",一个"有服务器"
MySQL:经典的客户端-服务器模式
MySQL 是典型的C/S 架构:
- 有一个独立的mysqld 进程在后台运行
- 你的程序通过JDBC/网络连接到服务器
- 服务器再读写磁盘上的数据文件
特点:
- ✅ 支持多客户端同时连接(网站多人访问)
- ✅ 有完善的权限管理、事务、备份机制
- ❌ 需要单独安装、配置、维护
SQLite:无服务器的嵌入式模式
SQLite 是Serverless 架构:
- 没有独立的服务器进程
- 数据库就是一个
.db文件 - 你的程序直接通过库文件读写数据
特点:
- ✅ 零配置、零安装,一个文件搞定
- ✅ 启动速度极快(毫秒级)
- ✅ 可以随应用一起打包分发
- ❌ 单线程写入(多个程序同时写会锁死)
🔥关键区别:MySQL 是"饭店"(有服务员、有厨房),SQLite 是"自热火锅"(打开就能吃)。
📊 二、核心指标对比表
| 对比维度 | SQLite | MySQL |
|---|---|---|
| 体积 | 约 1MB(一个库文件) | 安装包 400MB+,运行占 500MB+ 内存 |
| 安装 | 不需要安装 | 需要安装、配置、启动服务 |
| 部署 | 直接复制.db文件 | 需要导出 SQL、导入、配权限 |
| 并发 | 单写多读(写会锁库) | 多线程读写,支持高并发 |
| 网络访问 | ❌ 不支持(本地文件) | ✅ 支持远程连接 |
| 数据量 | 适合 GB 级别 | 适合 TB 级别 |
| 用户权限 | ❌ 无(靠文件系统权限) | ✅ 精细的 GRANT 权限控制 |
| 事务 | ✅ ACID 完整支持 | ✅ ACID + 更复杂的隔离级别 |
| 存储引擎 | 只有一种 | InnoDB、MyISAM 等多种可选 |
| 适用场景 | 桌面App、嵌入式、测试、缓存 | 网站、企业系统、大数据 |
💻 三、Java 代码对比:连接方式差在哪?
SQLite:简单到离谱
Maven 依赖:
<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.41.2.1</version></dependency>连接代码:
// 不需要用户名密码!不需要启动服务!// 直接指定一个本地文件,不存在会自动创建Connectionconn=DriverManager.getConnection("jdbc:sqlite:mydata.db");🎉 就这一行!没有
Class.forName()也行(JDBC 4.0+ 自动加载)。
完整工具类:
publicclassSQLiteUtils{privatestaticfinalStringURL="jdbc:sqlite:student.db";publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager.getConnection(URL);}// 查询publicstaticResultSetquery(Stringsql){try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){returnstmt.executeQuery(sql);}catch(SQLExceptione){e.printStackTrace();returnnull;}}// 增删改publicstaticintupdate(Stringsql){try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){returnstmt.executeUpdate(sql);}catch(SQLExceptione){e.printStackTrace();return0;}}}MySQL:配置多一点
Maven 依赖:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>连接代码:
// 需要用户名、密码、地址、端口Stringurl="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai";Stringuser="root";Stringpassword="123456";Connectionconn=DriverManager.getConnection(url,user,password);⚠️ 还要确保 MySQL 服务已启动,否则直接报错
Communications link failure。
📝 四、SQL 语法对比:几乎一样,但有坑!
4.1 创建表
| SQLite | MySQL | |
|---|---|---|
| 自增主键 | INTEGER PRIMARY KEY AUTOINCREMENT | INT PRIMARY KEY AUTO_INCREMENT |
| 字符串 | TEXT | VARCHAR(255) |
| 日期 | TEXT或INTEGER | DATE/DATETIME |
SQLite 示例:
CREATETABLEstudent(idINTEGERPRIMARYKEYAUTOINCREMENT,-- 注意是 AUTOINCREMENTnameTEXTNOTNULL,ageINTEGER,scoreREAL-- 浮点数);MySQL 示例:
CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,-- 注意是 AUTO_INCREMENTnameVARCHAR(50)NOTNULL,ageINT,scoreDECIMAL(5,2));⚠️坑 1:SQLite 的自增只能用在
INTEGER PRIMARY KEY,不能是INT!
4.2 插入数据
两者语法完全一样:
INSERTINTOstudent(name,age,score)VALUES('张三',20,89.5);4.3 查询数据
也完全一样:
SELECT*FROMstudentWHEREage>18ORDERBYscoreDESC;4.4 查看建表语句
SQLite 特有(很有用!):
-- 查看某个表的创建语句SELECTsqlFROMsqlite_masterWHEREtype='table'ANDname='student';MySQL 用SHOW CREATE TABLE student;
🎨 五、在 IDEA 中使用 SQLite
5.1 添加依赖后,打开 Database 面板
View → Tool Windows → Database5.2 添加 SQLite 数据源
+ → Data Source → SQLite5.3 选择数据库文件
点击File旁边的浏览按钮,选择你的.db文件:
5.4 测试连接
点击Test Connection,看到绿色对勾就成功了!
💡不需要用户名密码,因为 SQLite 没有用户系统,权限靠操作系统的文件权限控制。
🐛 六、SQLite 常见踩坑指南
❌ 坑 1:database is locked(数据库被锁)
报错:SQLITE_BUSY: database is locked
原因:SQLite单线程写入。如果你在代码里开了两个 Connection 同时写,或者上一个 Connection 没关闭就开了新的,就会锁死。
解决:
// ❌ 错误示范:连接没关Connectionconn=getConnection();Statementstmt=conn.createStatement();stmt.executeUpdate("INSERT ...");// 忘记 close!下次再连就报错// ✅ 正确示范:用 try-with-resources 自动关闭try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){stmt.executeUpdate("INSERT ...");}// 自动 close,不会锁库🔥这是 SQLite 最重要的坑!记住:用一次,关一次。
❌ 坑 2:AUTOINCREMENT 不生效
原因:SQLite 的自增必须满足:
- 字段类型是
INTEGER(不能是INT) - 必须是
PRIMARY KEY
-- ✅ 正确idINTEGERPRIMARYKEYAUTOINCREMENT-- ❌ 错误idINTPRIMARYKEYAUTOINCREMENT-- INT 不行!❌ 坑 3:没有 Boolean 类型
SQLite 没有专门的BOOLEAN,用INTEGER代替:
0= false1= true
❌ 坑 4:不支持 ALTER TABLE 删列
SQLite 不支持直接删除列, workaround:
-- 1. 创建新表(不含要删的列)CREATETABLEstudent_new(idINTEGERPRIMARYKEY,nameTEXT);-- 2. 复制数据INSERTINTOstudent_newSELECTid,nameFROMstudent;-- 3. 删旧表DROPTABLEstudent;-- 4. 重命名ALTERTABLEstudent_newRENAMETOstudent;🎯 七、到底怎么选?一张图搞定
┌─────────────────────────────────────────────────────────────┐ │ 你的项目是什么类型? │ └─────────────────────────────────────────────────────────────┘ │ ┌───────────────┴───────────────┐ ▼ ▼ 【单机/桌面应用】 【网站/服务器】 │ │ ▼ ▼ ┌───────────┐ ┌───────────┐ │ SQLite │ │ MySQL │ │ ✅ 推荐 │ │ ✅ 推荐 │ └───────────┘ └───────────┘ 例子: 例子: • 桌面记账软件 • 电商网站 • 手机 App 本地缓存 • 后台管理系统 • 嵌入式设备 • 数据分析平台 • 个人笔记工具 • 高并发 API 服务更详细的场景对照
| 场景 | 推荐 | 理由 |
|---|---|---|
| 做一个给女朋友用的记账小软件 | SQLite | 她电脑不用装任何东西 |
| 毕业设计(单机版) | SQLite | 答辩时直接拷走就能跑 |
| 单元测试用数据库 | SQLite | 内存数据库:memory:,测完即丢 |
| 浏览器本地存储(IndexedDB 不够用时) | SQLite | 通过 WASM 运行在浏览器 |
| 公司官网 + 后台管理 | MySQL | 多人访问、需要权限控制 |
| 秒杀系统 | MySQL + Redis | 高并发 SQLite 扛不住 |
| 数据量 > 1GB | MySQL | SQLite 大文件性能下降 |
🚀 八、SQLite 进阶:内存模式(测试神器)
SQLite 有个超酷的功能 ——内存数据库:
// 数据存在内存里,程序结束就消失,速度极快!Connectionconn=DriverManager.getConnection("jdbc:sqlite::memory:");适用场景:
- 单元测试(每个测试用例一个独立内存库,互不干扰)
- 临时数据处理(比 HashMap 方便,有 SQL 语法)
- 数据缓存(重启程序自动清空)
📦 九、SQLite 数据库文件长什么样?
SQLite 数据库就是一个普通的文件:
myapp/ ├── src/ ├── lib/ └── data/ └── app.db ← 这就是整个数据库!就一个文件你可以:
- 用 U 盘拷走 ✅
- 用微信发给同事 ✅
- 用 Git 版本控制(但不推荐,二进制文件冲突难处理)
💡备份就是复制文件,简单粗暴!
🎓 总结
| 你关心什么 | 选 SQLite | 选 MySQL |
|---|---|---|
| 简单省事 | ✅ | ❌ |
| 零配置部署 | ✅ | ❌ |
| 高并发 | ❌ | ✅ |
| 大数据量 | ❌ | ✅ |
| 远程访问 | ❌ | ✅ |
| 用户权限 | ❌ | ✅ |
| 随软件打包 | ✅ | ❌ |
一句话:
🪶SQLite 是"瑞士军刀"—— 小巧、方便、随时能用,适合个人和小型项目。
🐬MySQL 是"重型卡车"—— 强大、稳定、能拉货,适合企业和高并发场景。
两者不是竞争关系,而是互补关系。很多项目同时用:MySQL 存核心数据,SQLite 做本地缓存或离线功能。
🔗 附录
SQLite 字段类型速查
| 类型 | 说明 | 对应 Java 类型 |
|---|---|---|
NULL | 空值 | null |
INTEGER | 整型 | Long/Integer |
REAL | 浮点 | Double/Float |
TEXT | 文本 | String |
BLOB | 二进制 | byte[] |
⭐如果本文对你有帮助,请点赞 + 收藏 + 关注!
💬有任何问题欢迎在评论区留言,有问必答!