package sdnu.machi;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @ Description : 实现insert命令
* @ Author : 马驰
* @ CreateDate : 2019/12/31 22:19
*/
public class Insert {
private static String tableName;
public static void insertSql(String sql){
int index = sql.indexOf("(");
String name = sql.substring(12, index);
tableName = name.trim();
//System.out.println(tableName);
//判断是否有该表
String path = SQLConstant.getNowPath();
List<String> list = Utils.getAllTables(path);
boolean b = list.contains(tableName);
if(b) {
//得到当前路径
String nowPath = path + "\\" + tableName + ".txt";
//获取insert命令中两个括号中的内容
List<String> list1 = new ArrayList<>();
Pattern pattern = Pattern.compile("\\(.*?\\)");
Matcher matcher = pattern.matcher(sql);
while (matcher.find()) {
list1.add(matcher.group());
//System.out.println(matcher.group());
}
// System.out.println(list1.size());
// for(String s:list1){
// System.out.println(s);
// }
//判断语句是否正确,根据()的数目
//System.out.println(list.size());
if (list1.size() != 2) {
System.out.println("ERROR: 语句有错误");
Input.get();
} else {
List<String> columnName = getColumnName(nowPath, 1);
List<String> type = getColumnName(nowPath, 2);
// for(String s: columnName){
// System.out.println(s);
// }
String s1 = list1.get(0).substring(1, list1.get(0).length()-1).trim(); //第一个括号,字段
String s2 = list1.get(1).substring(1, list1.get(1).length()-1).trim(); //第二个括号,值
//对字符串进行转义
//String s11 = transMean(s1);
String s22 = transMean(s2);
String[] key = s1.split(",");
String[] value = s22.split(",");
for(int i = 0; i < key.length; i++){
key[i] = key[i].trim();
}
for(int i = 0; i < value.length; i++){
value[i] = value[i].trim();
}
//String s = ""; //最终要存储的字符串对象
// System.out.println(s1);
// System.out.println(s2);
// for(String k: key){
// System.out.println(k);
// }
//
// for(String k: value){
// System.out.println(k);
// }
String sep = SQLConstant.getSeparate();
int len = columnName.size();
String s = ""; //最终要存储的字符串对象
int flag1 = 0;
for(int i = 0; i < len; i++){
String s3 = columnName.get(i);
int flag = 0;
for(int j = 0; j < key.length; j++){
if(key[j].equals(s3)){
//System.out.println(type.get(i) + " " + value[j]);
String s4 = check(type.get(i), value[j]);
if(s4 == null){
flag1 = 1;
break;
}
else if(s4 == "machi"){
s += value[j] + sep;
flag = 1;
}
else {
s += s4 + sep;
flag = 1;
}
}
}
if(flag == 0){
s += "null" + sep;
}
if(flag1 == 1){
break;
}
}
//System.out.println(s);
//System.out.println(flag1);
if(flag1 == 0) {
writeFile(s);
System.out.println("Query OK");
}
Input.get();
}
}
else{
System.out.println("ERROR: 该表不存在");
Input.get();
}
}
/**
* @Description : 获取该表的所有列名
* @author : 马驰
* @param : path 表的路径; i 需要读出第i行
* @return : List 所有列名组成的列表
*/
public static List<String> getColumnName(String path, int i){
List<String> list = new ArrayList<>();
//对文件进行读取
try {
File file = new File(path);
FileReader reader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(reader);
//StringBuilder sb = new StringBuilder(); //定义一个字符串缓存
String s = "";
int index = 0;
//读取第i行
while((s = bufferedReader.readLine()) != null){
index++;
if(index == i) {
String sep = SQLConstant.getSeparate(); //获取分隔符
String[] strings = s.split(sep);
for(String s1:strings){
list.add(s1);
}
return list;
//System.out.println(s);
}
}
// //只读取第一行,第一行存放的是列名
// if((s = bufferedReader.readLine()) != null){
// String sep = SQLConstant.getSeparate(); //获取分隔符
// String[] strings = s.split(sep);
// for(String s1:strings){
// list.add(s1);
// }
// }
bufferedReader.close();
}catch(IOException e){
e.printStackTrace();
}
return list;
}
/**
* @Description : 对传入的字符串进行转义,如果字符串中有分隔符,则需要在分隔符前再加一个分隔符
* @author : 马驰
* @param : str 需要转义的字符串
* @return : String 转义后的字符串
*/
private static String transMean(String str){
String sep = SQLConstant.getSeparate(); //分隔符
String s = str.replaceAll(sep, sep + sep);
return s;
}
/**
* @Description : 将字符串写入数据库文件中
* @author : 马驰
* @param : s 需要写入的字符串,代表数据中的一行
* @return : 无
*/
private static void writeFile(String s){
//获取分隔符
String sep = SQLConstant.getSeparate();
//获取当前表的路径
String path = SQLConstant.getNowPath();
String nowPath = path + "\\" + tableName + ".txt";
//System.out.println();
//System.out.println(str);
//System.out.println(str);
try{
FileOutputStream fos = new FileOutputStream(
new File(nowPath), true);
s += "\r\n";
fos.write(s.getBytes());
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
/**
* @Description : 检查输入值的类型与之前定义字段的类型是否匹配
* @author : 马驰
* @param : type 该字段的数据类型; str 需要检查的字符串
* @return : String 检查完后要返回的字符串,例如char类型的要去掉""
*/
private static Stri
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
DBMS实现了如下功能(主要的指令格式参照了MySQL的命令行指令): 1.show databases; //列出目前所有存在的数据库 2.create database 数据库名; //创建一个数据库 3.drop database 数据库名; //删除一个数据库 4.use 数据库名; //使用一个数据库 5.show tables; //列出当前数据库中存在的所有表 6.create table(列名 类型 约束, .......); //创建一个表 7.describe 表名; // 打印一个表的详细信息 8.insert into 表名 (列名,.....) values (值,......); //向表中插入数据 9.select * from 表名; //查询表中的所有数据 10.drop table 表名; //删除一个表 11.help; //帮助信息; 12.quit; //退出
资源推荐
资源详情
资源评论
收起资源包目录
MyDatabase.zip (41个子文件)
MyDatabase
MyDatabase.iml 793B
src
sdnu
machi
Utils.java 3KB
Quit.java 256B
Format.java 802B
SqlAnalysis.java 2KB
Describe.java 2KB
Create.java 7KB
Help.java 449B
Input.java 876B
Use.java 788B
Start.java 242B
Drop.java 4KB
Insert.java 9KB
SQLConstant.java 1018B
Select.java 3KB
Show.java 2KB
TableGenerator.java 5KB
out
production
MyDatabase
sdnu
machi
Describe.class 3KB
Help.class 624B
Select.class 3KB
Start.class 425B
Show.class 2KB
Input.class 1KB
Format.class 759B
Quit.class 460B
Use.class 1KB
TableGenerator.class 5KB
Utils.class 2KB
Insert.class 5KB
SQLConstant.class 922B
Drop.class 3KB
SqlAnalysis.class 2KB
Create.class 5KB
META-INF
MyDatabase.kotlin_module 16B
.idea
uiDesigner.xml 9KB
vcs.xml 167B
workspace.xml 15KB
misc.xml 273B
modules.xml 260B
markdown-navigator-enh.xml 4KB
markdown-navigator.xml 3KB
共 41 条
- 1
资源评论
振华OPPO
- 粉丝: 38w+
- 资源: 571
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于ARIMA-LSTM-transformer等模型进行流感时间序列预测Python源码(高分项目)
- 基于景观生态风险评价的流域景观格局优化,教学视频和资料,喜欢的就下载吧,保证受用
- java设计模式-建造者模式(Builder Pattern)
- C语言刷题-lesson5_1731564764305.pdf
- JavaScript开发指南PDG版最新版本
- JavaScript程序员参考(JavaScriptProgrammer'sReference)pdf文字版最新版本
- jQuery1.4参考指南的实例源代码实例代码最新版本
- CUMCM-2018-D.pdf
- 私钥+助记词碰撞器 概括了BTC ETH BNB TRX SOL各链 最新版
- jQueryapi技术文档chm含jQuery选择器使用最新版本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功