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

5 篇文章 0 订阅
3 篇文章 0 订阅

目录

1.MySQL简介

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

3.数据库更新 

4.node.js操作mysql

5.nodejs链接mysql做成工具

6.API对接mysql

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

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

9.API对接mysql(登录)


1.MySQL简介

开端:

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

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

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

MySQL介绍:

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

MySQL workbench:

  • 操作MySQL的客户端,可视化操作;
  • 下载:http://dev.mysql.com/downloads/workbench/ 

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


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

包含:建库、建表、表操作;建一个 myblog 的数据库,然后就可以来建表(两个表:用

户表和博客表), id 是不能重复,唯一的。
建立表格(1)

 

建立表格(2)

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

操作表:

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

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

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

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

 


3.数据库更新 

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

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 重新建了个库。

 

 

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 把数据发送。


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

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

先不管,回去处理 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操作数据库

 

 

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

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丘比特惩罚陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值