下载mysql镜像
在docker中搜索mysql,下载mysql镜像,界面版直接点击pull
即可,如果使用命令行,执行下面代码进行安装:
# sudo docker pull 镜像名:版本号
sudo docker pull mysql # 本文安装的是latest版本
启动mysql服务
在控制台输入下面命令,启动mysql容器
sudo docker run --name my_blog -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql --lower_case_table_names=1
# –name:给新创建的容器命名,此处命名为demo_mysql
# -e:配置信息,此处配置mysql的root用户的登陆密码
# -p:端口映射,此处映射主机3306端口到容器pwc-mysql的3306端口
# -d:成功启动容器后输出容器的完整ID
# mysql:mysql镜像名字
# lower_case_table_names:mysql设置大小写是否敏感的一个参数
界面可视化工具安装与使用
界面可视化工具我用的DBeaver(点击进行下载)
,但是安装mysql驱动时候,一直报错com.mysql.cj.jdbc.Driver
,是因为Maven地址失效无法下载,我们在窗口 - 首选项
,找到Maven
添加仓库地址如下:
阿里:http://maven.aliyun.com/nexus/content/groups/public/
腾讯:http://mirrors.cloud.tencent.com/nexus/repository/maven-public/
我们驱动下载成功后,又遇见一个新的问题,一直报错Public Key Retrieval is not allowed
,是因为当禁用 SSL/TLS 协议传输后,客户端会使用服务器的公钥进行传输,默认情况下客户端不会主动去找服务器拿公钥,进而会出现错误,我们需要在数据库 - 驱动管理器
驱动属性中手动添加allowPublicKeyRetrieval
属性,值为true
。
再次点击进行连接,即可连接成功
通过node连接mysql数据库
# 新建文件夹,并通过npm init初始化仓库配置文件
npm init -y
# 安装mysql2
npm i mysql2
这里说明一下为什么要用mysql2
,而不是mysql
,因为二者的密码算法不同,在查阅资料后,发现mysql
连接mysql 版本8及以上
会报下面的错误,因此采用了mysql2
我们首先先向数据库添加表和一条数据,如下图:
在根目录下创建src
目录,并添加db.js
文件,通过mysql2
连接mysql数据库代码,注意database
与password
是上面启动mysql时候定义的:
const mysql = require('mysql2')
//链接配置
var connection = mysql.createConnection({
host: 'localhost', //ip
user: 'root', //用户名
password: '123456',//密码
database: 'my_blog' //数据库名
});
//建立链接
connection.connect();
//进行查询user_info表中的数据
connection.query('SELECT * from user_info', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
});
我们将启动命令在package.json
中进行定义,方便后续启动数据库连接,在script
里面添加下述代码:
"scripts": {
"start": "node ./src/db.js"
},
在控制台运行npm run start
,输出一个简单的数据库查询的返回,即数据库连接成功!
接口定义
在上面我们已经将数据库进行创建并能够连接了,这时候作为一个前端,需要调取接口来操作数据库,我们就需要定义接口来操作数据库了,我们先介绍一下需要用到的第三方依赖:
Express:
Express是一个简洁而灵活的 Node的Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
body-parser:
bodyParser中间件用来解析http请求体,是Express默认使用的中间件之一。使用express生成一个网站,它默认已经使用了bodyParser.json与bodyParser.urlencoded的解析功能,除了这两个,bodyParser还支持对text、raw的解析,综上所述,bodyParser可以理解为是用来解析json数据格式的。
cors:
cors处理跨域问题
安装所需依赖,执行下面的命令
npm install express body-parser cors --save
在上面,我们已经可以获取到连接的实例connection
,我们不可能每一次都重新连接,所以我们可以创建一个连接,将查询或修改的代码,单独写在一起,引入这个连接实例,我们在src下创建一个interface.js
文件如下:
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const { connection } = require('./db')
const app = express();
const parser = bodyParser.urlencoded({ extended: false });
app.use(cors());
// 获取user_info表数据
app.get('/query/user-info', (req, res) => {
const sql = 'select * from user_info'
connection.query(sql, function (error, results) {
if (error) throw error;
res.send({
status: 200,
message: 'get 请求成功', //状态的描述
query: req.query, // 请求参数
data: results // 返回数据
})
});
})
// 更新用户名
app.post('/edit/user/userName', parser, (req, res) => {
const { id, userName } = req.query;
const sql = `update user_info set userName="${userName}" where id="${id}"`
connection.query(sql, function (error, results) {
if (error) throw error;
res.send({
status: 200,
message: 'post 成功', //状态的描述
query: req.body, // 请求参数
data: results // 返回数据
})
});
})
// 启动服务器
app.listen(3000, () => {
console.log('Server started on port 3000');
});
在上面的代码中可以看出,我们将db连接的实例,使用const { connection } = require('./db')
引入,所以我们在db.js
中需要将这个实例对外暴露,修改后代码如下:
const mysql = require('mysql2')
//链接配置
const connection = mysql.createConnection({
host: 'localhost', //ip
user: 'root', //用户名
password: '123456',//密码
database: 'my_blog' //数据库名
});
//建立链接
connection.connect();
module.exports = { connection }
为了方便,我们将package.json
中的script新增一个命令如下:
"scripts": {
"start:db": "node ./src/db.js",
"start:serve": "node ./src/interface.js"
},
接下来我们在控制台分别启动db服务
与interface接口
,出现下面图中显示的,即为启动成功!
npm run start:db # 启动db服务
npm run start:serve # 启动interface接口
验证接口调用
1. 验证查询接口(get)
使用apiFox调取本地接口,查询到了数据库中数据,查询接口成功!
2. 验证修改用户名接口(post)
使用apiFox调取本地接口,修改用户名,重新查询用户信息,修改成功!
结语
我们在这篇文章中讲述了如何使用docker
搭建mysql
环境,并通过node
从零开始创建一个简单的服务,并连接数据库,在搭建环境中间,作者也查阅了大量资料与踩坑,都在文章进行了说明,全部代码作者上传到了Gitee上面,有需要的掘友们可以下载进行尝试,不过数据库的搭建,就需要大家自己去配置了。
🥰 因为作者也是第一次尝试,所以可能设计层面并不是很理想,大家有好的建议,也可以打在评论区,大家一起探讨一下,不喜勿喷。