【前端升全栈】 开发项目之数据存储(MySQL数据库)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql是企业内最常用的存储工具,一般都有专人运维

1.MySQL简介

开端:

  • mysql介绍、安装和使用;
  • Nodejs链接MySQL;
  • API链接MySQL;

为什么使用的是MySQL而不是mogondb?

  1. 因为mysql是企业内最常用的存储工具,一般都有专人运维
  2. mysql也是社区内最常用的存储工具,有问题随时可查
  3. 另:mysql本身是一个复杂的数据库软件,本课只讲基本使用

MySQL介绍

  • web server 中最流行的关系型数据库
  • 官网可免费下载,用于学习
  • 轻量级,易学易用

MySQL workbench:

show databases;可以查看所有数据库(要记得 root 的密码,忘记了,看来只能主机登录).


2.数据库操作(创建、增加、删除、查询)

包含:建库、建表、表操作;建一个 myblog 的数据库,然后就可以来建表(两个表:用户表和博客表), id 是不能重复,唯一的。

2345_image_file_copy_473.jpg

建立表格(1)

2345_image_file_copy_474.jpg

建立表格(2)

vachar 代表字符串类型,longtext 可以储存 4G 大小的数据。

操作表:

  • 增删改查;
  • 使用SQL语句;

use+数据库名字就能使用数据库,show tables 就能展示各种表,--加空格就是注释。如果我们变量呃出现了 sql 里面的关键字我们可以加上``就可正常使用。这里由于 id 会自动增加, 所以我们不需要写 id(它的特点是如果定下来数字,不管前面是不是被删了都不会改变原本的值)。

2345_image_file_copy_476.jpg

like 是模糊查询,排序的话默认是正序,加多个 desc 可以倒序。

关于自增的话,我们可以选中 id 再设置标识规范(+可以展开):

2345_image_file_copy_477.jpg

2345_image_file_copy_478.jpg

3.数据库更新

我们更新操作的时候发现会报错,有一个提示说正在使用安全模式,不给改,直接 SETSQL_SAFE_UPDATE = 0; 即可。我们发现删除了一项后又加了一项 id 是从 3 开始了,这就是它的特点。另外注意一下,删除的话我们其实不好真的这样子去删除而是加一个 state 0 不可用删除, 1 可用即默认值)。删除的就利用更新操作改变对应行的 state ,而不是真的删了(软删除),好处就是可以恢复数据(更新 state 为 1 即可)。

 

 不等号这里是怎么表示? <> 即可。注意这里我们还是不使用软删除,为了方便(毕竟是新手)。好,接下来补充 blogs 表的测试数据。

2345_image_file_copy_479.jpg

select version ()可以查看 MySQL 版本,如果版本在 5 以上varchar 里面的数字就不管是英文还是中文都可以存这个数量(统一),以前就中文只能一半.

4.node.js操作mysql

Nodejs操作MySQL:

  1. 示例:用demo演示,不考虑使用
  2. 封装:将其封装为系统可用的工具
  3. 使用:让API直接操作数据库,不再使用假数据

封装需要考虑线上数据库和线下数据库。 建一个空白文件夹 mysql-test,下面建一个 index.js 同时 npm 初始化,安装 mysql 插件 npm i mysql。 回到 index.js,引入这个插件,创建链接对象,connect 方法 开始连接,通过 query 方法即可执行 sql 语句,然后记得搞 完关闭连接。 注意我们在 node 里面进行修改的话是不会返回修改的内容, 而是返回一个对象,里面有说几行受影响和改变的样子。插入的话也是返回一个对象,里面有 insertId 恰好对应我们的 id。由于不知道密码,我们利用 navicat 重新建了个库。

2345_image_file_copy_481.jpg

const mysql =nequire( 'mysql') //引入数据库插件
const const = mysql.createConnection({  //创建连接(root默认密码为空>)
  host: "localhost',
  user: 'root ',
  password: "',
  port: '3306',//默认端口号
  database: 'myBlog' //连接到inybLog数据库(navicat里面的)
})
con.connect()//连接数据库
const sql = 'select * from blogs'//定义查询语句
con.query(sq1,(err,result)=>{ //执行查询语句
   if (err){
     console.log(err)}
 else {
console.log(result)
}
con.end()/7关闭连接

5.nodejs链接mysql做成工具

其实这样子还没有办法使用,最好做成工具。 我们回到 blog-1 文件夹建一个 conf 文件夹,下面建一个 db.js 进行配置。首先第一步是获取环境变量/ 环境参数( process 是 node 进程信息)这个实就是在 package.json 定义好的, 看我们 run 的是 dev 还是 prd 显示不同的环境变量,看你现在是处于什么环境(如开发、上线、测试环境等等)。而就是因为环境变量不同,那么我们的数据库连接里面的配置自然不可能一样,所以就需要在这里动态配置。

 定义一个 MYSQL_CONF 常量,分为 dev 和 production ,最后返回整个常量。这里我们暂时使用两套一样的配置,因为目前没有线上的服务器,具体的配置可以看自己工作中服务器的信息去配置就行了。 再建一个 db 的文件夹,这里存放数据库操作的文件,建一个 mysql.js ,引入 mysql 插件和配置。定义基本的数据库操作,最后返回一个执行 sql 的函数即可。

 注意这里就不能关闭数据库,我们只是返回一个执行 sql 的函数,类似于单例模式,连接一旦创建了,之后不管这些少函数都不会多次创建链接,重复的引用这个连接去操作函数即可。

MySQL.js

const mysql =hequire( 'mysql')
const { MYSQL_CONF } = require('../conf/db')
const con = mysql.createConnection(msQL_CONF)//创建连接对象
 con.connect() //d连接数据库
function exed (sql){//执行教据库操作
  const promise = new Promise((resolve,reject) =>{
      con.query(sql, (err, result)=>{
      if (err){
      reject(err)
      return // 记得return,不然有错误就卡在这里了
}
resolve(result)
})
})
return promise
}
module.exports ={
exec}

6.API对接mysql

  回到 controller 下面,引入这个 exec 函数,修改 getList 函数。 定义 sql 语句,同时根据参数即作者和关键词,加多两个查询条件,然后按创建时间倒序排序,最后将这个 sql 传给 exec

函数返回即可(返回的是 promise )。 解释一下,为什么写 where 1=1 (1 肯定等于 1 啊,就写跟没写一样)那么写这个就是为了占位,因为不知道是否有作者和关键词!如果去掉,然后又没有两个参数,后面还要排序就直接 where order by 这样子)肯定报错啊,没有条件, 而如果去掉where 写在参数那里那么谁找到是只有哪一个参数还是两个都有?所有还是占位的好,那么不管有没有,有多少都无关紧要。同理的有 url 的写法,参数不是前面有?和& ,可以? A=xx 写死(自定义的),然后真正的参数则前面都是& 了!

 

   然后就回到 router 改了,返回的是 promise ,用 result 接收,然后.then 拿到 promise 的 resolve 的 result (这里我们定义为listData),然后返回成功模型就行(返回的也是 promise )。 那么 app.js 也不能这么写了,得改,用 blogResult 接收 promise,如果存在则调用 then 把数据发送。

2345_image_file_copy_483.jpg

7.API对接mysql(博客详情和新建)

接下来处理 getDetail ,根据 id 查询的 sql 语句,传给 exec ,这里注意由于 id 是唯一的,这样子查询只能查询到一个结果,但是一个结果也会返回一个对象数组,我们还应该将其取出来,返回一个对象的好,在去 router 那里返回一个promise 就行了。 接下来处理 newBlog ,注意要返回的是 id ,我们先从博客对象将标题内容和作者给拿出来。那么就可以根据这些数据去定义 sql 语句了,再传给 exec 函数,这个函数其实会返回什么呢?当然是 promise ,是说里面的数据,其实有一大堆数据(包括改变函数,影响函数,插入 id 等等)。

2345_image_file_copy_484.jpg

先不管,回去处理 router ,注意由于 author 是不应该传的, 而是登录后就知道 author 是谁而不是新建还需要写 author ,所以这里先假数据。

const getDetail = (id)=→>{M/获取博客详情
const sql = "select · from blogs where id '$[id}';1/根据id查询对应的博客内容return exec(sql).then((rows) =>{
return rows[ o]/l/由于返回的是一个数组,虽然里面只有一个对象,但是我们还是返回对象的好,毕竟model接收的是对象,
const newBlog =(blogData=o)=> {//新建博客
const title = blogData.title
const content = blogData.content
const author = blogData.author//从博客对象拿到对于的各种数据const createtime = Date.now(
const sql = insert into blogs (title,content,createtime,author)
| values ('s(title) ', 's(content) ', '${(createtime} ', '$(author}')1/根据数据定义对应的sqL语句return exec(sql) .then((insertData)=>{
return 
id: insertData.insertId //执行语句得到一对东西,有用的就这个,我们拿到就行
if (method === 'GET' 8& req .path === ' /api/blog/detail') {
const detailData = getDetail(id)
return new SuccessModel (detailData)*/
const detailResult = getDetail(id)
return detai lResult. then( (detailData) => {
return new SuccessModel (detailData)
})
if (method === 'POST' 8&& req.path === ”/api/blog/new ) {
const data = newBL og(req. body)
return new SuccessMode (data)*/
req . body.author = 'nuoduo' //自定&一个假数据
const result = newBlog(req. body)
return result . then((data) => d
return new SuccessModel (data)
国)

8.API对接mysql(更新和删除)

更新的话,这个很简单,需要拿到 title 和 content ,作者就 没必要(毕竟是自己才能更新),将 sql 放到 exec ,执行结 果也是一堆东西,里面有用的是 affectedRows ,大于 0 就可以返回 true ,否则就是返回 false (更新失败)。回到 router ,根据返回值(布尔值)返回不同的 model 。 接下来是删除博客,注意要传入 id 和 author ,符合两个条件才可以删除,逻辑与更新是一样的,拷贝一下即可。回到router,搞一个 author 的假数据。至于为什么两个条件,是为了避免通过自己的 id 去删除别人的文章(当然只是传入 id而 author 需要我们内部帮忙获取)。

if (method === 'POST' && req.path == '/api/blog/update') {
/* const result = updateBLog(id, req. body)
if (result) {
return new successModeL( )
} else {
return new ErrorModel('更新博客失败”)
}*/
const result = updateBlog(id, req.body) //把要删除的d和postData (即更新的内容)传入
return result . then( (updateData) =》{
if (updateData) {
return new SuccessModel()
} else {
return new ErrModel('更新博客失败”)
}
})
}

9.API对接mysql(登录)

回到 user.js ,引入 exec 函数,直接条件查询即可(返回的是 数组),将数组第一项或者空对象(第一项为空就返回空对 象)返回。回到 router ,如果能拿到 username 说明并不是空就可以返回成功的 model 不然就是失败的 model 了。 回到 app.js ,按博客的模板修改。

  • nodejs连接mysq|,如何执行sq|语句
  • 根据NODE_ ENV区分配置
  • 封装exec函数, API使用exec操作数据库

2345_image_file_copy_485.jpg

const userResult = handleUserRouter(req, res) //管理用户路由
if (userResult) {
userResult . then( (userData) => {
res .end(
JSON.stringify(userData)
})
return


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
44 0
|
10天前
|
SQL 存储 数据处理
"SQL触发器实战大揭秘:一键解锁数据自动化校验与更新魔法,让数据库管理从此告别繁琐,精准高效不再是梦!"
【8月更文挑战第31天】在数据库管理中,确保数据准确性和一致性至关重要。SQL触发器能自动执行数据校验与更新,显著提升工作效率。本文通过一个员工信息表的例子,详细介绍了如何利用触发器自动设定和校验薪资,确保其符合业务规则。提供的示例代码展示了在插入新记录时如何自动检查并调整薪资,以满足最低标准。这不仅减轻了数据库管理员的负担,还提高了数据处理的准确性和效率。触发器虽强大,但也需谨慎使用,以避免复杂性和性能问题。
21 1
|
10天前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
16 1
|
15天前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
|
15天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
16天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
在数字化时代背景下,本文详细介绍了如何使用Spring Boot框架结合Vue.js技术栈,实现一个前后端分离的考试管理系统。该系统旨在提升考试管理效率,优化用户体验,确保数据安全及可维护性。技术选型包括:Spring Boot 2.0、Vue.js 2.0、Node.js 12.14.0、MySQL 8.0、Element-UI等。系统功能涵盖登录注册、学员考试(包括查看试卷、答题、成绩查询等)、管理员功能(题库管理、试题管理、试卷管理、系统设置等)。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
|
2天前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
12 0
|
9天前
|
测试技术 Java
全面保障Struts 2应用质量:掌握单元测试与集成测试的关键策略
【8月更文挑战第31天】Struts 2 的测试策略结合了单元测试与集成测试。单元测试聚焦于单个组件(如 Action 类)的功能验证,常用 Mockito 模拟依赖项;集成测试则关注组件间的交互,利用 Cactus 等框架确保框架拦截器和 Action 映射等按预期工作。通过确保高测试覆盖率并定期更新测试用例,可以提升应用的整体稳定性和质量。
20 0
|
9天前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
17 0

热门文章

最新文章

下一篇
DDNS