首页 > 数据库 >数据库我是这样写出来的,Java版本1,持续更新

数据库我是这样写出来的,Java版本1,持续更新

时间:2024-07-02 16:27:25浏览次数:17  
标签:Java String get List 数据库 tableName tokens 版本

了解数据库的内部原理其实很不容易,大部分的读写都停留在理论文章上,因此肖哥带着大家使用Java手写一个完整的数据库,让大家了解数据库的解析器、性能分析器、认证、查询优化器,执行引擎、存储引擎、事务管理、MVCC,数据恢复等一系列功能。这个工作量比较大,属于每日1-2更新,大家如果想了解数据库的内容原理,掌握数据库的核心技术,那么可以跟着肖哥的步骤一步一步的学习。数据库会包含大家熟悉的数据结构与算法例如 B+树索引R树索引 等,仅数据存储就包含了数据块(Chunks)、文件头(File Header)、键值存储(MVMap)、并发控制、事务、序列化与反序列化、压缩、加密、索引、持久化存储、内存映射存储、分片机制、以及计划中的压缩和碎片整理等能力。

公号Solomon肖哥弹架构获取更多精彩内容 ,需要完整代码的可以留言

手写数据库持续更新系列 ,喜欢的读者 , 一定要订阅哦

欢迎 点赞,收藏,关注 。

完整的数据库具备能力图:

手写计划

  1. 小白能够看得懂的最简化版本数据库
  2. 标准SQL解析器
  3. 存储引擎
  4. 执行引擎
  5. 事务管理
  6. 日志系统
  7. 元数据管理
  8. 安全管理
  9. 性能分析器
  10. 网络版
  11. 标准JDBC接口对接

整体手写系列的大模块会包含以上功能。

小白版本1

实现了对SQL语句的解析,支持基本的CREATE TABLEINSERT INTOSELECT语句,并使用简单的词法和语法分析。:

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

相关文章

  • StarRocks 入门指南:创建和管理数据库及表
    本文介绍如何在StarRocks中创建数据库和表,插入数据,执行常用的系统管理命令,以及一些常用配置的修改方法,快速了解上手StarRocks。设置环境变量首先,我们需要设置JAVA_HOME环境变量,以便StarRocks能够找到Java运行时环境。exportJAVA_HOME="/data3/starrocks/jdk-17.0.11"......
  • JavaScript 中删除数组元素
    在JavaScript中,没有像Java的ArrayList中的remove方法那样直接删除指定元素的方法,删除指定下标的数组元素可以通过几种方式实现方法一:使用 splice() 方法splice()方法可以在数组中添加或删除元素,并返回被删除的元素。letarr=[1,2,3,4,5];letindexToRemove......
  • Java知识点整理 18 — Lambda表达式
    一.简介Lambda表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口,然后再执行等。过程相对繁琐。而如果使用函数式编程思想,可以直接通过传递......
  • 网络安全:网站服务器建立数据库连接时出错的解决办法…[通俗易懂]
    大家好,又见面了。PONY在这里教给大家2个简单处理办法,大神就不用看了,太简单浪费时间哈哈很多新手使用wordpress程序建站初期,会遇到页面提示:建立数据库连接出错,英文提示:“Errorestablishingadatabaseconnection”。那么遇到这种情况大家会很头疼,我到底哪里操作不对呀?本文中老......
  • Java JVM——11. 执行引擎
    1.概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而......
  • ORACLE数据库数据恢复
    ORACLE数据库常见问题故障:1、ORACLE数据库无法启动或无法正常工作。2、ORACLEASM存储破坏。3、ORACLE数据文件丢失。ORACLE数据库的解决方案1.检测是否存在硬件故障。2.以只读方式对故障存储做完整镜像3.在备份中进行数据分析及恢复操作。4.恢复后的数据会暂存在另一......
  • SqlServer数据库数据恢复
    故障服务器环境描述:一台故障服务器,因在正常运行中,意外断电,重启后发现SQLserver数据库的数据无法被读取。故障服务器分析检测:故障服务器进入系统发现是人为删除的,SQLserver数据库文件无法被读取,系统表被损坏,由于底层FileRecord被截断为0,无法找到文件开头,数据表结构也被损坏。......
  • SpringBoot3连接Mysql数据库
    pom引入包,启动器<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.o......
  • java实现微信登录
    前言上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。配置配置什么的就不多说了,详细的配置可以直接前往我上一篇查看。https://www.cnblogs.com/nothavebug/p/18277732流程实现(后端)(JAVA)(springboot)1.首先先配置一下applica......
  • 1.FineReport连接Oracle数据库
    1.服务器–定义数据连接2.添加JDBC3.配置JDBC4.添加数据库查询5.输入查询语句,预览结果......