MySQL基础语法

1.常用语法,增删查改

-- 1.查询语句 select 
-- 语法: select * from 表名称
-- 注意点:关键字不区分大小写
-- SELECT * FROM users

-- 2.查询指定列
-- 语法: select 列名称 * from 表名称
-- select id, password from users

-- 3.insert into 插入新的数据行
-- insert into 语句用于向数据表中插入新的数据行
-- 语法:insert into users (列1, 列2...) values ('值1', '值2')
-- 注意点:列和值要一一对应,多个列和多个值之间,要使用逗号分隔
-- insert into users (username, password) values ('ton', '1111')
-- select * from users

-- 4.update 语句
-- Update 语句用于修改表中的数据
-- 用update指定要更新的表
-- set 指定列
-- where 指定更新的条件
-- 语法:update 表名称 set 列名称 = 新值 where 列名称 = 某值
-- 示例:
-- 4.1. 更新某一行中的一个列
-- update users set username = 'cccc' where id = 2 
-- 4.2 更新某一行中的若干列
-- 注意点:记得提供更新条件,不然会导致整张表数据都更新,一定要慎重!
-- update users set password = '222222', status = 1 where id = 3 

-- 5.delete 语句用于删除表中的行
-- 语法解读:从指定的表中,根据where条件,删除对应数据行
-- 语法:delete from 表名称 where 列名称 = 值
-- delete from users where id = 2

-- 6.where 子句
-- 演示 where 子句的使用
-- select * from users where id>=2
-- select * from users where username<>'ls'
-- select * from users where username!='ls'

-- 7.使用 and 来显示所有状态为0且id小于3的用户
-- select * from users where status=0 and id<3

-- 8.使用 or 来显示所有状态为1 或 username 为 zs 的用户
-- select * from users where status=1 or username='zs'

-- 9.对users表中的数据,按照 status 字段进行升序排序
-- select * from users order by status

-- 10.按照 id 对结果进行降序的排序  desc 表示降序排序   asc 表示升序排序(默认情况下,就是升序排序的)
-- select * from users order by id desc

-- 11.对 users 表中的数据,先按照 status 进行降序排序,再按照 username 字母的顺序,进行升序的排序
-- select * from users order by status desc, username asc

-- 12.使用 count(*) 来统计 users 表中,状态为 0 用户的总数量
-- select count(*) from users where status=0

-- 13.使用 AS 关键字给列起别名
-- select count(*) as total from users where status=0
-- select username as uname, password as upwd from users

2.在vscode中连接数据库

  • 基本思路:

    ① 安装操作 MySQL 数据库的第三方模块(mysql)

    ② 通过 mysql 模块连接到 MySQL 数据库

    ③ 通过 mysql 模块执行 SQL 语句

  • 实现步骤:

    • 1.安装与配置 mysql 模块

    • mysql 模块是托管于 npm 上的第三方模块。它提供了在 Node.js 项目中连接和操作 MySQL 数据库的能力

      npm install mysql
      
    • 2.配置 mysql 模块

      • 在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置

      • 可以新建mySql.js文件

        // 1.导入mysql模块
        const mysql = require('mysql')
        
        // 2.建立与mysql数据库的连接
        const db = mysql.createPool({
            host: '127.0.0.1', // 数据库的ip地址
            user: 'root', // 登录数据库的账号
            password: '123456', // 登录数据库的密码
            database: 'my_db_01' // 指定要操作的数据库
        })
        
        // 3.检测mysql模块能否正常工作  (有问题...)
        // db.query('SELCET 1', (err, res) => {
        //     // 判断是否出错
        //     if (err) return console.log(err.message)
        
        //     // 连接成功,没有出错
        //     console.log(res) // 结果是:
        // })
        
        // 可以看看能否查询users表中的所有的用户数据
        db.query('select * from users', (err, res) => {
           // 查询失败
           if (err) return console.log(err.message)
           // 查询成功
           console.log(res)
        })
        

3.在模块中进行增删改查操作

// 1.导入mysql模块
const mysql = require('mysql')

// 2.建立与mysql数据库的连接
const db = mysql.createPool({
    host: '127.0.0.1', // 数据库的ip地址
    user: 'root', // 登录数据库的账号
    password: '123456', // 登录数据库的密码
    database: 'my_db_01' // 指定要操作的数据库
})

// // 3.检测mysql模块能否正常工作
// db.query('SELCET 1', (err, res) => {
//     // 判断是否出错
//     if (err) return console.log(err.message)

//     // 连接成功,没有出错
//     console.log(res) 
// })

// 4.查询users表中的所有的用户数据
// db.query('select * from users', (err, res) => {
//     // 查询失败
//     if (err) return console.log(err.message)
//     // 查询成功
//     console.log(res)
// })

// 5.插入数据
// 要插入的数据对象
// const user = { username: 'tony', password: '11111'}
// // 待执行的sql语句,其中英文的 ? 表示占位符
// const sqlStr = 'insert into users (username,password) values (?, ?)'
// // 使用数组的形式,依次为 ? 占位符指定具体的值
// db.query(sqlStr, [user.username, user.password], (err, res) => {
//     // 插入失败
//     if (err) return console.log(err.message)
//     // 插入成功
//     if (res.affectedRows === 1) {
//         console.log(res)
//         console.log('插入数据成功!')
//     }
// })

// 6.插入数据的便捷方式
// 向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据
// 要插入的数据对象
/* const user = { username: 'tony1', password: '11111'}
// 待执行的sql语句,其中英文的 ? 表示占位符
const sqlStr = 'insert into users set ?'
// 直接将数据对象当作占位符的值
db.query(sqlStr, user, (err, res) => {
    // 插入失败
    if (err) return console.log(err.message)
    // 插入成功
    if (res.affectedRows === 1) {
        console.log(res)
        console.log('插入数据成功!')
    }
}) */

// 7.更新数据
// 指定要更新的对象信息
// const user = { id: 4, username: 'ccc', password: '25555'}
// 要执行的sql语句
// const sqlStr = 'update users set username=?, password=? where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// db.query(sqlStr, [user.username, user.password, user.id], (err, res) => {
//     // 插入失败
//     if (err) return console.log(err.message)
//     // 插入成功
//     if (res.affectedRows === 1) { console.log('修改成功') }
// })


// 8.更新数据的便捷方式
// 更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速更新表数据
// 指定要更新的对象信息
// const user = { id: 6, username: 'hahahh', password: '25555'}
// // 要执行的sql语句
// const sqlStr = 'update users set ? where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// db.query(sqlStr, [user, user.id], (err, res) => {
//     // 插入失败
//     if (err) return console.log(err.message)
//     // 插入成功
//     if (res.affectedRows === 1) { console.log('修改成功') }
// })

// 9.删除数据
// 在删除数据时,推荐根据 id 这样的唯一标识,来删除对应的数据
// 要执行的sql语句
// const sqlStr = 'delete from users where id=?'
// // 调用db.query()执行sql语句的同时,使用数组依次为占位符指定具体的值
// // 注意点:如果sql语句中有多个占位符,则必须使用数组为每个占位符指定具体的值
// //        如果sql语句中只有一个占位符,则可以省略数组
// db.query(sqlStr, 4, (err, res) => {
//     if (err) return console.log(err.message) // 删除失败
//     if (res.affectedRows === 1) { console.log('删除成功') } // 删除成功
// })


// 10.标记删除
/* 
    使用 DELETE 语句,会把真正的把数据从表中删除掉
    为了保险起见,推荐使用标记删除的形式,来模拟删除的动作
    所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除
    当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应 的 status 字段标记为删除即可
*/
db.query('update users set status=1 where id=?', 6, (err, res) => {
    if (err) return console.log(err.message) // 删除失败
    if (res.affectedRows === 1) { console.log('删除数据成功') } // 删除成功
})

4.在 Express 中使用 Session 认证

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()


// TODO_01:请配置 Session 中间件
// 1.导入session中间键
const session = require('express-session')
// 2.配置session中间件
app.use(session({
  secret: 'keyboard cat', // secret 属性的值可以为任意字符串
  resave: false, // 固定写法
  saveUninitialized: true // 固定写法
}))

// 托管静态页面
app.use(express.static('./pages'))
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))

// 登录的 API 接口
app.post('/api/login', (req, res) => {
  // 判断用户提交的登录信息是否正确
  if (req.body.username !== 'admin' || req.body.password !== '000000') {
    return res.send({ status: 1, msg: '登录失败' })
  }

  // TODO_02:请将登录成功后的用户信息,保存到 Session 中
  req.session.user = req.body // 将用户的信息,存储到session中
  req.session.islogin = true // 将用户的登录状态,存储到session中

  res.send({ status: 0, msg: '登录成功' })
})

// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
  // TODO_03:请从 Session 中获取用户的名称,响应给客户端
  // 判断用户是否登录
  if (!req.session.islogin) {
    return res.send({status: 1, msg: 'fail'})
  }
  // 用户已登录
  res.send({status: 0, msg: 'success', username: req.session.user.username})
})

// 退出登录的接口
app.post('/api/logout', (req, res) => {
  // TODO_04:清空 Session 信息
  req.session.destroy()
  res.send({
    status: 0,
    msg: '退出登录成功!'
  })
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1:80')
})

5.在 Express 中使用 JWT

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// TODO_01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
// 1.导入生成jwt字符串的包
const jwt = require('jsonwebtoken')
// 2.导入将jwt字符串转换为json对象的包
const expressJWT = require('express-jwt')

// 允许跨域资源共享
const cors = require('cors')
app.use(cors())

// 解析 post 表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))

// TODO_02:定义 secret 密钥,建议将密钥命名为 secretKey, 本质就是字符串
const secretKey = 'thisastringtoken'

// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
// expressJWT({secret: secretKey}) 就是用来解析token的中间件
// .unless({path: [/^\/api\//]}) 是用来指定那些接口不需要访问权限
// app.use(expressJWT({ secret: secretKey }).unless({path: [/^\/api\//]}))
app.use(expressJWT({ secret: secretKey}).unless({path: [/^\/api\//]}))
 
// 登录接口
app.post('/api/login', function (req, res) {
  // 将 req.body 请求体中的数据,转存为 userinfo 常量
  const userinfo = req.body
  // 登录失败
  if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
    return res.send({
      status: 400,
      message: '登录失败!'
    })
  }
  // 登录成功
  // TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
  res.send({
    status: 200,
    message: '登录成功!',
    // 调用 jsonwebtoken 包提供的 sign() 方法,将用户的信息加密成 JWT 字符串,响应给客户端
    // 三个参数分别是:用户信息对象、加密密钥、配置对象
    token: jwt.sign({ username: userinfo.username}, secretKey, {expiresIn: '30s'}) 
  })
})

// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {
  // TODO_05:使用 req.user 获取用户信息,并使用 data 属性将用户信息发送给客户端
  res.send({
    status: 200,
    message: '获取用户信息成功!',
    data: req.user // 要发送给客户端的用户信息
  })
})

// TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err,req,res,next) => {
  // token解析失败导致的错误
  if (err.name === 'UnauthorizedError') {
    return res.send({status: 401, message: '无效的token'})
  }

  // 其他原因导致的错误
  res.send({status: 500, message:'未知错误'})
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(8888, function () {
  console.log('Express server running at http://127.0.0.1:8888')
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值