了解数据库的内部原理其实很不容易,大部分的读写都停留在理论文章上,因此肖哥带着大家使用Java手写一个完整的数据库,让大家了解数据库的解析器、性能分析器、认证、查询优化器,执行引擎、存储引擎、事务管理、MVCC,数据恢复等一系列功能。这个工作量比较大,属于每日1-2更新,大家如果想了解数据库的内容原理,掌握数据库的核心技术,那么可以跟着肖哥的步骤一步一步的学习。数据库会包含大家熟悉的数据结构与算法例如 B+树索引 ,R树索引 等,仅数据存储就包含了数据块(Chunks)、文件头(File Header)、键值存储(MVMap)、并发控制、事务、序列化与反序列化、压缩、加密、索引、持久化存储、内存映射存储、分片机制、以及计划中的压缩和碎片整理等能力。
公号Solomon肖哥弹架构获取更多精彩内容 ,需要完整代码的可以留言
手写数据库持续更新系列 ,喜欢的读者 , 一定要订阅哦
欢迎 点赞,收藏,关注 。
完整的数据库具备能力图:
手写计划
- 小白能够看得懂的最简化版本数据库
- 标准SQL解析器
- 存储引擎
- 执行引擎
- 事务管理
- 日志系统
- 元数据管理
- 安全管理
- 性能分析器
- 网络版
- 标准JDBC接口对接
整体手写系列的大模块会包含以上功能。
小白版本1
实现了对SQL语句的解析,支持基本的CREATE TABLE
、INSERT INTO
、SELECT
语句,并使用简单的词法和语法分析。:
import java.util.*;
import java.util.stream.Collectors;
class SQLDatabase {
private Map<String, List<List<String>>> tableData = new HashMap<>();
// 创建表
public void createTable(String tableName) {
tableData.putIfAbsent(tableName, new ArrayList<>());
}
// 插入数据
public void insertInto(String tableName, List<String> rowData) {
tableData.get(tableName).add(rowData);
}
// 执行SELECT查询
public List<List<String>> select(String tableName, String... conditions) {
List<List<String>> result = new ArrayList<>(tableData.get(tableName));
for (int i = 0; i < conditions.length; i += 2) {
String column = conditions[i];
String value = conditions[i + 1];
result.removeIf(row -> !row.contains(value) || !row.get(0).equals(column));
}
return result;
}
// 简单的词法分析器
private List<String> tokenize(String input) {
return Arrays.asList(input.split("\s+"));
}
// 简单的SQL解析器
public void executeSQL(String sql) {
List<String> tokens = tokenize(sql);
String command = tokens.get(0).toUpperCase();
switch (command) {
case "CREATE":
if (tokens.size() >= 3 && "TABLE".equals(tokens.get(1))) {
String tableName = tokens.get(2);
createTable(tableName);
System.out.println("Table '" + tableName + "' created.");
}
break;
case "INSERT":
if (tokens.size() >= 3 && "INTO".equals(tokens.get(1))) {
String tableName = tokens.get(2);
List<String> rowData = new ArrayList<>();
for (int i = 3; i < tokens.size(); i++) {
rowData.add(tokens.get(i));
}
insertInto(tableName, rowData);
System.out.println("Data inserted into '" + tableName + "'.");
}
break;
case "SELECT":
if (tokens.size() > 2 && "FROM".equals(tokens.get(1))) {
String tableName = tokens.get(2);
List<List<String>> selectedData = select(tableName, new String[tokens.size() - 3]);
for (List<String> row : selectedData) {
System.out.println(row);
}
}
break;
default:
System.out.println("Unsupported command.");
break;
}
}
}
public class Main {
public static void main(String[] args) {
SQLDatabase db = new SQLDatabase();
// 执行SQL语句
db.executeSQL("CREATE TABLE users");
db.executeSQL("INSERT INTO users Alice 25");
db.executeSQL("INSERT INTO users Bob 30");
db.executeSQL("SELECT FROM users Alice");
// 执行更复杂的SELECT语句
db.executeSQL("SELECT Alice FROM users WHERE 25");
}
}
此版本实现了以下功能:
createTable
:创建一个新的表。insertInto
:向表中插入一行数据。select
:执行一个简单的SELECT查询,支持基于列名和值的条件过滤。tokenize
:一个简单的词法分析器,将SQL语句分割成单词列表。executeSQL
:根据词法分析的结果,解析并执行SQL命令。
总结
案例非常简化,不支持完整的SQL语法,也没有实现数据持久化、事务、并发控制、索引等数据库系统的关键特性。此外,它仅支持字符串类型的数据和简单的条件查询。 此案例为了让大家有一个初步了解。后续会一步一步复杂化与标准化。
标签:Java,String,get,List,数据库,tableName,tokens,版本 From: https://blog.csdn.net/alises1314/article/details/140124408