# HNUSQL **Repository Path**: liqkjm/HNUSQL ## Basic Information - **Project Name**: HNUSQL - **Description**: 修改minisql数据库 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-10-19 - **Last Updated**: 2024-07-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HNUSQL 采用Java开发的一个小型数据库系统,采用文件方式存储,实现了一般数据库操作: 建库,建表,建立索引,选择数据库,删除数据库,删除表,删除索引,插入,删除,查询,修改,显示所有数据库,显示所有表,退出 ## 测试 执行命令: `execfile test.txt;` ## 项目结构 - / - bin 编译后class文件 - data 数据存储 - XXX database 1 - XXX file 1 - XXX file 2 - src 源代码 - API.class --- SQL接口实现层,接收并响应消息 - Buffer_Manager --- 缓存管理器,内存与文件系统之间的桥梁 - Catalog - Catalog_Manager --- 分类管理器,提供包括库、表的元信息等 - File_Handle - HNUSQL --- 启动文件 - Index - Index_Manager --- 索引管理器,提供从不同键值映射到对应记录的快速索引信息 - Interpreter --- SQL翻译器,将SQL翻译成API可识别的消息 - Page_Handle - Record - Record_Manager --- 记录管理器,提供取回数据库记录(数据)的方法 Catalog Manager,分类管理器,提供包括库、表的元信息等 Index Manager,索引管理器,提供从不同键值映射到对应记录的快速索引信息 Record Manager,记录管理器,提供取回数据库记录(数据)的方法 Buffer Manager,缓存管理器,内存与文件系统1之间的桥梁 ## 操作 数据库采用正则表达式匹配命令,词法分析。 源代码如下: ``` //定义正则表达式 query = ""; create_database_pattern = "create database [^\\s]+"; create_table_pattern = "create table [^\\s]+.*\\(.*\\)"; create_index_pattern = "create index [^\\s]+ on [^\\s]+.*\\([\\s]*[^\\s]+[\\s]*\\)"; use_pattern = "use [^\\s]+"; drop_database_pattern = "drop database [^\\s]+"; drop_table_pattern = "drop table [^\\s]+"; drop_index_pattern = "drop index [^\\s]+"; insert_pattern = "insert into [^\\s]+ values[\\s]*\\(.+\\)"; delete_pattern = "delete from [^\\s]+.*"; update_pattern = "update [^\\s]+ set [^\\s]+.* where .*"; select_pattern = "select [^\\s].* from [^\\s]+.*"; execfile_pattern = "execfile .*"; show_database_pattern = "show database"; show_table_pattern = "show table"; ``` 具体操作: ```$xslt HNUSQL>show database; demo HNUSQL>drop database demo; drop database Query Time : 0.032 seconds! HNUSQL>show database; HNUSQL>create database test; create database Query Time : 0.252 seconds! HNUSQL>use test; use database Query Time : 0.236 seconds! HNUSQL>create table student(sno char(4),sname char(9)); create table attribute 0 <4> unique attribute 1 <9> unique primary key Query Time : 0.004 seconds! HNUSQL>insert into student values("2","Little"); insert into table value 0 : char<1><2> value 1 : char<6> Query Time : 0.0 seconds! HNUSQL>select * from student; 1 dama 2 little select all records from table Query Time : 0.0 seconds! HNUSQL> ... ``` ## 原理 ## 执行流程 HNUSQL -> Interpreter -> API -> *_Manager/// ## 具体代码实现 ## 修改源代码 ## 附件 ### 相关Java基础知识点 1. BufferedReader类 readLine() BufferedReader是缓冲字符输入流,继承于Reader,它的作用是为其他字符输入流添加一些缓冲功能。 在这里用来分批读取命令,因为输入的SQL命令可能有多行。 2. ObjectOutputStream 对象输出流,序列化流,利用输出流向文件中写入对象 特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。 3. Serializable 序列化 序列化:对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量, 不是方法)保存下来,并且可以在需要时再将对象恢复。虽然你可以用你自己的各种各样的方法来保存对象的状态, 但是Java给你提供一种应该比你自己的好的保存对象状态的机制,那就是序列化。 总结:Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(系列化),并且可以从其它地方把该Byte 流里的数据读出来 (反序列化)。 4. File类 fileList()查询文件列表