he-maoke

导航

day34Mysql数据库及MySQL模块讲解

昨日内容回顾

知识点回顾

node入门(npm命令以及node命令)

node events模块(eventEmitter) http模块(createSercver) fs模块(读写操作)

登录注册(协同fs模块)

//http模块 fs模块 url模块
const http = require("http")
const {readFile,writeFile} = require("fs")
const {parse} = require("url")
const {decode} = require("querystring")
//创建服务
const server = http.createServer()
// 服务监听对应请求
server.on("request",(req,res)=>{
//指定对应的响应头
res.setHeader("Content-type","application/json;charset=utf-8")
res.setHeader("Access-Control-Allow-Origin","*")
res.setHeader("Access-Control-Allow-Origin-Method","*")
//获取路由
let router = parse(req.url).pathname
//登录
if(router=="/login" && req.method == "POST"){
//获取post请求的数据
let data = ""
req.on("data",(chunk)=>{
data+=chunk
})
req.on("end",()=>{
//将对应的data变成一个对象
data = decode(data)
//读取对应的文件 根据文件的数据进行判断
readFile("./db.json",(err,dataBuffer)=>{
if(err)
throw new Error("错误")
//读取的数据是一个buffer类型 buffer=> String =>对象
let db = JSON.parse(dataBuffer.toString())
//默认没有
let flag = false
//响应对象
let obj = new ResponseObj()
//获取里面的users 进行遍历
db.users.forEach(item=>{
if(item.username == data.username && item.password ==
data.password){
flag = true
obj.data = item
}
})
//对应flag进行判断
if(flag){
obj.message = "登录成功"
res.write(JSON.stringify(obj))
}else{
obj.message = "登录失败"
res.write(JSON.stringify(obj))
}
res.end()
})
})
}
//注册
if(router=="/register" && req.method == "POST"){
//获取post请求的数据
let data = ""
req.on("data",(chunk)=>{
data+=chunk
})
req.on("end",()=>{
//将对应的data变成一个对象
data = decode(data)
//将数据写入(拿数据出来 再将数据加入到对应的数组里面 再把数据写进去)
readFile("./db.json",(err,dataBuffer)=>{
if(err)
throw new Error("错误")
//读取的数据是一个buffer类型 buffer=> String =>对象
let db = JSON.parse(dataBuffer.toString())
//将数据加入到读出来的数组里面
let user = {
id: Date.now(),
username:data.username,
password:data.password
}
db.users.push(user)
//响应对象
let obj = new ResponseObj()
//将对应的db对象写入文件
writeFile("./db.json",JSON.stringify(db),function(err){
if(err)
throw new Error("注册失败")
obj.message = "注册成功"
obj.data = user
res.write(JSON.stringify(obj))
res.end()
})
})
})
}
})
// 对于服务进行监听 端口号的值 1 - 65525区间内(注意事项 前100端口号不使用 计算机自己占了)
server.listen(12345,()=>{
console.log("server is started!port is 12345,host is localhost");
})
//响应对象
class ResponseObj{
constructor(code=200,message='',data={}){
this.code = code
this.message = message
this.data = data
}
}

Mysql

数据库(数据的仓库 他里面是存放数据的)数据库分为两类(关系型数据库(持久化数据库)非关系型数据库(内存数据库k-v))

关系型数据库(SQL)

mysql(免费200万条以下)

orcale(专业性质的数据库)

sql server (微软的数据库 依赖于framework的插件(c#))

db2(erp专用数据库)

...

非关系型数据库(NO-SQL)

redis(非常好用的内存数据库 跟对应的mysql区别不是很大)

mongodb(基于bson存储的数据库)

...

专业名词

主键 所有的数据依赖的一个主要的内容(他不重复 而且一个表只有一个id)

外键 一个表依赖于一个表的某个内容(外键)

列(字段)看作是exec表格里面的一个列(字段名是唯一的)

游标(标识)查询速度更快

触发器(一个对应的监听器) 为了更好的执行对应的sql语句

存储过程(相当于一个方法 抽取了很多业务代码)封装调用

索引 (建立的一个查询的快捷键)为了更快的查询(sql优化)

 表 相当于一个对象(他里面的内容就是他的属性)

库 多个表组成的一个集合称为库

...

常用的sql语句

ddl数据库定义语句(对应表和库的增删改查)

dcl数据库控制语句

dml 数据库模型语句(对应表里面的内容的增删改查)

数据库环境的构建(mysql)

1.下载安装(小皮 内置了mysql环境)

2.在小皮里面启动了对应的MySQL服务

3.使用可视化工具进行连接

在安装的小皮的mysql安装路径下的bin目录下进入cmd(默认情况下用户名root密码)root)

mysql -u root -p

 

 

 DDL语句

创建数据库

create database 库名

查看数据库

show databases

 

 

 进入数据库

use 数据库名

删除数据库

drop database 数据库名

创建表

create table 表名(列 类型 约束,列1 类型 约束...)

查看表

show tables

 

 

 删除表

drop table 表名

DML数据库模型语言

添加数据

drop table 表名

指定对应的字段进行添加(不能为空的字段必须填写)

insert into t_user(username,password) values('张三','456')

查询(主要操作的)*不推荐

select * from t_user

修改操作

##修改操作 (根据什么修改 where 条件)
update t_user set username = 'lisa',password='jack' where id = 4

删除操作(不推荐)

##删除操作
delete from t_user where id = 4

软删除(通过标识的更改让他这个数据查不出来)

update t_user set status=0 where id = 1

查询操作

条件查询(where 里面可以出现逻辑运算a

select * from t
_
user where username='jack' and password="123" or password =
'
456'

数量查询(count 查数量 as 取别名)

## 数量查询 as 取别名
select count(*) as 数量 from t_user where age<10

统计(求和)

## 计算所有人的年龄
select sum(age) from t_user

分页查询

## 分页查询 (多少条到多少条) 开始的位置 条数
select * from t
_
user WHERE password = "456" LIMIT 3,3

排序

## 排序 DESC ASC
select * from t
_
user where status = 1 ORDER BY age ASC
select * from t
user where status = 1 ORDER BY age DESC

模糊查询like

## 查出所有姓张的
select * from t
_
user where username LIKE "张%"
## 查出名字里面出现德
select * from t
_
user where username LIKE "%%"
## 查出 张开头 只有一个 华结尾 _下滑线表示一个 %表示所有
select * from t
_
user where username LIKE "张_华"

MySql模块

操作对应的数据库(核心数据)

mysql模块入门

1.导入

const mysql = require('mysql'

2.新建连接(填入 主机名 端口号 密码 数据库)

let conn = mysql.createConnection({
host:"localhost",
port:
"
3307",
user:
"
root
"
,
password:"root",
database:"db"
})

3.得到连接对象(进行连接)

conn.connect()

主要执行方法query

const mysql = require('mysql')
let conn = mysql.createConnection({
host:"localhost",
port:
"
3307",
user:
"
root
"
,
password:"root",
database:"db"
})
conn.connect((err)=>{
if(err)
throw new Error('连接失败')
console.log('连接成功');
})
//执行对应的sql语句 sql语句字符串 回调函数(err,data)(promise)
let querySql = "select * from t_user"
conn.query(querySql,(err,data)=>{//data返回的是一个数组 这个数组里面是多个对象
if(err)
throw new Error('执行失败')
data.forEach(user=>{
console.log(`id为${user.id}username为${user.username}password为
${user.password}age为${user.age}`);
})
})
let updateSql = "update t_user set username='jack' where id=8"
conn.query(updateSql,(err,data)=>{//对象一个
if(err)
throw new Error('执行失败')
console.log(data.serverStatus);
})
let insertSql = "insert into t_user(username,password,age) values('张三
丰','123',123)"
conn.query(insertSql,(err,data)=>{//对象一个
if(err)
throw new Error('执行失败')
console.log(data.serverStatus);
})
let deleteSql = "delete from t_user where id=12"
conn.query(deleteSql,(err,data)=>{//对象一个
if(err)
throw new Error('执行失败')
console.log(data.serverStatus);
})

占位符

//这个?表示当前这个值不确定 也就是说这个?是一个占位符(防止sql注入)
let querySql = "select * from t_user where id = ?"
conn.query(querySql,8,(err,data)=>{//data返回的是一个数组 这个数组里面是多个对象
if(err)
throw new Error('执行失败')
data.forEach(user=>{
console.log(`id为${user.id}username为${user.username}password为
${user.password}age为${user.age}`);
})
})
let updateSql = "update t_user set username=? where id=?"
conn.query(updateSql,['刘德华',8],(err,data)=>{//对象一个
if(err)
throw new Error('执行失败')
console.log(data.serverStatus);
})

连接池(pool)

//连接池相当于多个连接存储的容器
const mysql = require('mysql')
//createConnection 有局限性 使用createPool
let pool = mysql.createPool({
host:'localhost',
port:
"
3307",
user:
'
root',
password:"root",
database:"db"
})
//里面有俩个参数 一个是错误对象 一个是连接对象
pool.getConnection((err,conn)=>{
if(err)
throw new Error('获取连接失败')
// conn.connect() 获取连接的时候自动帮我们做了连接操作
conn.query('select * from t_user',(err,data)=>{
if(err)
throw new Error('执行sql错误')
console.log(data);
})
// conn.end() 执行完会自动回收到连接池
})

utill封装

//连接池相当于多个连接存储的容器
const mysql = require('mysql')
//createConnection 有局限性 使用createPool
let pool = mysql.createPool({
host:'localhost',
port:
"
3307",
user:
'
root',
password:"root",
database:"db"
})
//执行sql语句的方法 返回值是一个promise对象(then返回对应的数据 catch返回对应的错误)
function execute(sql,params=''){
return new Promise((resolve,reject)=>{
pool.getConnection((err,conn)=>{
if(err)
reject('获取连接失败')
conn.query(sql,params,(err,data)=>{
if(err)
reject('执行sql错误')
resolve(data)
})
})
})
}
//导出操作
module.exports = {
execute
}

登陆注册实现

//http模块 fs模块 url模块
const http = require("http")
const {parse} = require("url")
const {decode} = require("querystring")
//导入工具类
const { execute } = require('./util')
//创建服务
const server = http.createServer()
// 服务监听对应请求
server.on("request",(req,res)=>{
//指定对应的响应头
res.setHeader("Content-type","application/json;charset=utf-8")
res.setHeader("Access-Control-Allow-Origin","*")
res.setHeader("Access-Control-Allow-Origin-Method","*")
//获取路由
let router = parse(req.url).pathname
//登录
if(router=="/login" && req.method == "POST"){
//获取post请求的数据
let data = ""
req.on("data",(chunk)=>{
data+=chunk
})
req.on("end",async()=>{
//将对应的data变成一个对象
data = decode(data)
let obj = new ResponseObj()
//查询对应的username和password是否存在
await execute('select * from t_user where username=? and
password=?',
[data.username,data.password])
.
then((result)=>{
if(result.length>0){
// 登录成功
obj.data = result[0]
obj.message = "登录成功"
}else{
// 登录失败
obj.message = "登录失败"
}
})
res.write(JSON.stringify(obj))
res.end()
})
}
//注册
if(router=="/register" && req.method == "POST"){
//获取post请求的数据
let data = ""
req.on("data",(chunk)=>{
data+=chunk
})
req.on("end",async()=>{
//将对应的data变成一个对象
data = decode(data)
let obj = new ResponseObj()
//查询对应的username和password是否存在
await execute('insert into t_user(username,password) values(?,?)',
[data.username,data.password])
.
then((result)=>{
if(result.serverStatus == 2){
// 注册成功
obj.data = data
obj.message = "注册成功"
}else{
// 注册失败
obj.message = "注册失败"
}
})
res.write(JSON.stringify(obj))
res.end()
})
}
})
// 对于服务进行监听 端口号的值 1 - 65525区间内(注意事项 前100端口号不使用 计算机自己占了)
server.listen(12345,()=>{
console.log("server is started!port is 12345,host is localhost");
})
//响应对象
class ResponseObj{
constructor(code=200,message='',data={}){
this.code = code
this.message = message
this.data = data
}
}

 

posted on 2022-07-13 16:34  hmkyj  阅读(55)  评论(0编辑  收藏  举报