使用express搭建服务器获取MySQL数据库数据

一、原始的mysql查询方法

  1. 先安装mysql cnpm install mysql --save

  2. 引入这个db.js之后,才能对数据库进行查询
    在这里插入图片描述

  3. 进行查询
    在这里插入图片描述
    在这里插入图片描述

  4. 查询结果如下:
    在这里插入图片描述

二、ORM 介绍

ORM 全拼Object-Relation Mapping.

中文意为 对象-关系映射.

主要实现模型对象到关系数据库数据的映射.

比如:把数据库表中每条记录映射为一个模型对象

优点 :

​ 1、只需要面向对象编程, 不需要面向数据库编写代码.

​ 2、对数据库的操作都转化成对类属性和方法的操作.

​ 3、不用编写各种数据库的sql语句.

​ 4、实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.

​ 5、不在关注用的是mysql、oracle…等.

​ 6、通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

缺点 :

​ 1、相比较直接使用SQL语句操作数据库,有性能损失.

​ 2、根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.

​ 3、有局限性,ORM中没有提供的查询功能需要写会sql语句

三、ORM的基本使用(增删改查)

  1. 把nodejs-orm文件夹复制到db文件夹下,并修改其中index.js中的数据库连接设置
    在这里插入图片描述
const mysql = require('mysql');
// 数据库连接设置
let orm_config = {host: 'localhost',//数据库地址port:'3306',user: 'root',//用户名,没有可不填password: 'root',//密码,没有可不填database: 'myemployees'//数据库名称
}let options = {};
let tableSQL = '';
let isConnect = false;function Model(name, option) {this.name = name;this.option = option;
};/**
* @description: 查询数据
* @param {} options:可选参数
* @param {Function} callback :(req,results)=>{}
*/
Model.prototype.find = function (options, callback) {if (!isConnect) {console.log(options.constructor);this.connect(err => {isConnect = true;var str = '';if (!callback) {str = `select * from ${this.name}`;callback = options;} else if (options.constructor == Array) {str = `select ${options.join()} from ${this.name}`;} else {str = `select * from ${this.name} where ${options}`;};//console.log(str);connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;})} else {var str = '';if (!callback) {str = `select * from ${this.name}`;callback = options;} else if (options.constructor == Array) {str = `select ${options.join()} from ${this.name}`;} else {str = `select * from ${this.name} where ${options}`;};//console.log(str);connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;}};/**
* @description: 分页查询
* @param {Object} options :   { where:查询条件, number: 当前页数 , count : 每页数量 }
* @return: 
*/
Model.prototype.limit = function (options, callback) {var str = '';if (!options.where) {str = `select * from ${this.name} limit ${(options.number - 1) * options.count},${options.count}`;} else {str = str = `select * from ${this.name} where ${options.where} limit ${(options.number - 1) * options.count},${options.count}`;};console.log(str);connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;
};/**
* @description: 插入数据
* @param {Object} obj:对象或者数组
* @param {Function} callback :(req,results)=>{}
*/
Model.prototype.insert = function (obj, callback) {if (!isConnect) {this.connect(err => {if (err) {throw err;} else {connection.query(tableSQL, (error, results, fields) => {if (Array.isArray(obj)) {for (var i = 0; i < obj.length; i++) {this.insertObj(obj[i], callback)}} else {this.insertObj(obj, callback)}});}});} else {if (Array.isArray(obj)) {for (var i = 0; i < obj.length; i++) {this.insertObj(obj[i], callback)}} else {this.insertObj(obj, callback)}}};Model.prototype.insertObj = function (obj, callback) {let keys = [];let values = '';for (var key in obj) {keys.push(key);values += `"${obj[key]}",`;};values = values.replace(/,$/, '');let str = `INSERT INTO ${this.name} (${keys.join()}) VALUES (${values})`;connection.query(str, (error, results, fields) => {callback(error, results);});
}/**
* @description: 更新数据
* @param {Object} option:可选参数 更新条件
* @param {Object} obj: 修改后的数据 
* @param {Function} callback :(req,results)=>{}
*/
Model.prototype.update = function (option, obj, callback) {let str = '';if (arguments.length == 2) {callback = obj;obj = option;str = `UPDATE ${this.name} SET `;for (var key in obj) {str += `${key}='${obj[key]}', `;};str = str.replace(/(, )$/, '');} else {str = `UPDATE ${this.name} SET `;for (var key in obj) {str += `${key}='${obj[key]}', `;};str = str.replace(/(, )$/, '');str += ` where ${option}`;};console.log(str);connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;};/**
* @description: 删除数据
* @param {Object} option:可选参数 删除条件
* @param {Function} callback :(req,results)=>{}
*/
Model.prototype.delete = function (option, callback) {var str = '';if (!callback) {str = `delete from ${this.name}`;callback = option;} else {str = `delete from ${this.name} where ${option}`;};console.log(str);connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;
};/**
* @description: 执行sql语句
* @param {String} str : sql语句
* @param {Function} callback :(req,results)=>{}
*/
Model.prototype.sql = function (str, callback) {connection.query(str, (error, results, fields) => {callback(error, results, fields);});return this;
};/**
* @description: 删除model表格 (慎用!)
* @param {type} 
* @return: 
*/
Model.prototype.drop = function (callback) {connection.query(`DROP TABLE ${this.name}`, (error, results, fields) => {callback(error, results, fields);});return this;
};//连接检测
Model.prototype.connect = function (callback) {let p1 = new Promise((resolve, reject) => {connection.connect((err) => {if (err) {//console.log(err.stack);//console.log(err);//42000 数据库不存在  28000账号错误//console.log(err.sqlState);//42000 数据库不存在  28000账号错误reject(err);} else {resolve();}});});p1.then(() => {callback(null);}, err => {if (err.sqlState == 42000) {createDatabase(callback);} else if (err.sqlState == 28000) {callback('数据库账号或密码错误');} else {callback(err);}});
};//创建数据库
let createDatabase = function (callback) {let p2 = new Promise((resolve, reject) => {connection = mysql.createConnection({host: options.host,//数据库地址port: options.port,//端口号user: options.user,//用户名,没有可不填password: options.password,//密码,没有可不填});connection.connect((err) => {//if (err) throw error;if (err) {reject(err);} else {resolve();}});});let p3 = new Promise((resolve, reject) => {connection.query(`CREATE DATABASE ${options.database}`, (err, results, fields) => {//if (error) throw error;if (err) {reject(err);} else {resolve();}});});let p4 = new Promise((resolve, reject) => {connection.query(`use ${options.database}`, (err, results, fields) => {if (err) {reject(err);} else {resolve();}});});let pAll = Promise.all([p2, p3, p4]);pAll.then(() => {callback(null);}).catch((err) => {callback(err);});
}let orm = {/*** @description:连接数据库* @param {String} host: 主机名 默认localhost* @param {Number} port: 端口号 默认3306* @param {String} user: 用户名 * @param {String} password: 密码 * @param {String} database: 数据库名称 默认og* @return: */connect: function ({ host = 'localhost', port = 3306, user = '', password = '', database = 'og' }) {databaseName = database;//全局存储当前数据库名称options = {host,//数据库地址port,//端口号user,//用户名,没有可不填password,//密码,没有可不填database//数据库名称};connection = mysql.createConnection(options);},/*** @description:创建model (表格模型对象)* @param {String} name:表格名称* @param {Object} options:表格数据结构* @return: Model对象:负责数据库增删改查*/model: function (name, options) {let str = 'id int primary key auto_increment, ';for (var key in options) {if (options[key] == Number) {str += `${key} numeric,`;} else if (options[key] == Date) {str += `${key} timestamp,`;} else {str += `${key} varchar(255),`;}};str = str.replace(/,$/, '');//console.log(`CREATE TABLE ${name} (${str})`);//console.log(str);tableSQL = `CREATE TABLE ${name} (${str})`;return new Model(name, options);}
};orm.connect(orm_config);module.exports = orm;

3.1、查询数据

查询所有员工的所有信息:
在这里插入图片描述

const db = require("./db/nodejs-orm/index.js");
app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find((err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})

在这里插入图片描述

查询指定字段(find、数组参数):
在这里插入图片描述

const express = require('express')
const db = require('./db/nodejs-orm/index.js')const app = express()app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find((err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})app.get("/get_data2", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find(["first_name","last_name"],(err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})app.listen(3000, ()=> {console.log("服务器已经启动,端口为:3000")
})

在这里插入图片描述
按条件查询(find、字符串参数):

const express = require('express')
const db = require('./db/nodejs-orm/index.js')const app = express()app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find((err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})app.get("/get_data2", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find(["first_name","last_name"],(err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})
app.get("/get_data3", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")employees.find("first_name='Steven'",(err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})app.listen(3000, ()=> {console.log("服务器已经启动,端口为:3000")
})

在这里插入图片描述
在这里插入图片描述

分页查询(limit、对象参数 where\number\count):

app.get("/get_data_limit", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let employees = db.model("employees")//where查询条件,为可选项,number第几页; count表示每页条数employees.limit({where: "salary > 11000", number: 1, count: 3},(err, data)=> {if(err) {console.log(err)return;}res.send(data)})// res.send('orm')
})

在这里插入图片描述
补充:
在这里插入图片描述

3.2、增加数据

增加单条记录, insert、对象参数、属性就是列名

app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let Stuinfo = db.model("stuinfo")Stuinfo.insert({    name: "zzep",age: 20,email: '910456@qq.com',gradeId: 2,sex: '男'}, (err, data) => {res.send(data)})// res.send('orm')
})

在这里插入图片描述
同时增加多个数据, insert、数组参数、元素为对象、属性就是列名:

app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let Stuinfo = db.model("stuinfo")let arr = [{   id: 6,name: "bob",age: 30,email: '91bob6@qq.com',gradeId: 2,sex: '男'},{id: 7,name: "tom",age: 28,email: '910tom56@qq.com',gradeId: 1,sex: '男'}]Stuinfo.insert(arr, (err, data) => {console.log(data)res.send('数据增加成功')})// res.send('orm')
})

在这里插入图片描述

3.3、删除数据(物理删除)

按条件删除记录 delete、字符串参数

app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let Stuinfo = db.model("stuinfo")Stuinfo.delete("id=7", (err, data) => {res.send(data)})// res.send('orm')
})

在这里插入图片描述
清空表里面所有内容 delete、无参数:

app.get("/get_data", (req, res) => {// 查询数据库,返回到浏览器// 创建模型,需要操作哪个数据表let Stuinfo = db.model("stuinfo")Stuinfo.delete((err, data) => {res.send(data)})// res.send('orm')
})

3.4、修改数据

修改所有学生name为小明 update、对象参数、属性就是列名

let Student = db.model("students");
Student.update({name:'小明'},(err,results)=>{console.log(results);
});

在这里插入图片描述

修改id为1的年龄为30 update、字符串参数1、对象参数2、属性就是列名

let Student = db.model("students");
Student.update('id=1',{age:30},(err,results)=>{res.send("修改成功");
});

在这里插入图片描述

3.5、自定义执行sql语句

上面的情况如果满足不了需求,直接使用自定义执行sql语句的方式 sql、字符串参数

let Student = db.model("students");
Student.sql('select * from students',(err,results)=>{res.send("执行成功");
});

在这里插入图片描述
下一篇:完善获取数据库数据的写法async+await版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java GZIP压缩和解压

最近碰到了一个按GZIP解压指定的输入流数据&#xff0c;备份下 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;/*** 压缩&#xff…

python数据库连接池_Python实现数据库连接池

1.初始化 def __init__(self, **kwargs): self.size kwargs.get(size, 10) self.kwargs kwargs self.conn_queue queue.Queue(maxsizeself.size) for i in range(self.size): self.conn_queue.put(self._create_new_conn()) size&#xff1a;连接池支持的连接数&#xff0c;…

Chapter6_Vocoder

文章目录1 Introduction2 WaveNet2.1 WaveNet的架构2.2 Softmax Distribution2.3 Causal Convolution和Dilated Convolution2.4 Gated Activation Unit2.5 小结3 FFTNet4 WaveRNN4.1 Dual Softmax Layer4.2 Model Coarse4.3 Model Fine4.4 小结5 WaveGlow本文为李弘毅老师【Voc…

show一下自己的文档编写功底

以我为例&#xff0c;我绝对相信&#xff0c;“才华”和颜值成反比。“才华”二字加了引号了&#xff0c;自知跟优秀有孙大圣一个筋斗云的距离&#xff0c;不过某些细节方面表现得被认为还不错&#xff0c;这里我要秀一下我的文档编写能力。在我这十年的工作生涯里&#xff0c;…

mysql命令速查手册

数据准备 -- 创建数据库 create database qianduan_test charsetutf8;-- 使用数据库 use qianduan_test;-- students表 create table students(id int unsigned primary key auto_increment not null,name varchar(20) default ,age tinyint unsigned default 0,height decima…

Chapter7-1_Overview of NLP Tasks

文章目录1 Introduction2 Part-of-Speech(POS) Tagging3 Word Segmentation4 Parsing5 Coreference Resolution6 Summarization7 Machine Translation8 Grammar Error Correction9 Sentiment classification10 Stance Detection11 Natural Language Inference(NLI)12 Search En…

python制作文本编辑器_Python小实战:制作文本编辑器

学了半年了&#xff0c;该施展一下了&#x1f37a; 做什么呢&#xff1f;做一个简单的文本编辑器吧 来&#xff0c;开始 知识点&#xff1a; 1&#xff09;做窗体的知识 2&#xff09;文件操作 窗体用的是tkinter简单模块&#xff0c;系统自带模块 有人说了&#xff1a;“哇&am…

OGNL 详解

Struts2 OGNL详解 1.概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取对象的属性或者调用对象的方法&#xff0c;能够遍历整…

完善获取数据库数据的写法

上一篇&#xff1a;使用express搭建服务器获取MySQL数据库数据 一、完善获取数据库数据的写法 asyncawait版本&#xff1a; const express require(express) const db require(./db/nodejs-orm/index.js)const app express()app.get("/get_data", (req, res) …

Chapter7-2_BERT and its family - Introduction and Fine-tune

文章目录1 What is pre-train model2 How to fine-tune2.1 Input2.2 Output2.3 Fine-tune2.4 Weighted Features3 Why fine-tune本文为李弘毅老师【BERT and its family - Introduction and Fine-tune】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f4…

python数据分析基础教程 numpy_Python数据分析基础教程:NumPy学习指南(第2版)

Python数据分析基础教程&#xff1a;NumPy学习指南&#xff08;第2版&#xff09; Ivan Idris (作者) 张驭宇 (译者) NumPy是一个优秀的科学计算库&#xff0c;提供了很多实用的数学函数、强大的多维数组对象和优异的计算性能&#xff0c;不仅可以取代Matlab和Mathematica的许多…

【BZOJ-2435】道路修建 (树形DP?)DFS

2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Status][Discuss]Description 在 W 星球上有 n 个国家。为了各自国家的经济发展&#xff0c;他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都…

CSRF跨站请求伪造

一、CSRF跨站请求伪造 CSRF全拼为Cross Site Request Forgery&#xff0c;译为跨站请求伪造。 CSRF指攻击者盗用了你的身份&#xff0c;以你的名义发送恶意请求。 包括&#xff1a;以你名义发送邮件&#xff0c;发消息&#xff0c;盗取你的账号&#xff0c;甚至于购买商品&a…

升级 ubuntu_Ubuntu 19.04 已经到期!现有用户必须升级到 Ubuntu 19.10

Ubuntu 19.04 已在 2020 年 1 月 23 日到期&#xff0c;这意味着运行 Ubuntu 19.04 的系统将不再会接收到安全和维护更新&#xff0c;因此将使其容易受到攻击。-- Abhishek Prakash(作者)Ubuntu 19.04 发布于 2019 年 4 月 18 日。由于它不是长期支持(LTS)版本&#xff0c;因此…

Chapter7-3_BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more

文章目录1 How to pre-train2 Predict next token3 Mask Input4 seq2seq的pre-train model5 ELECTRA6 Sentence Embedding本文为李弘毅老师【BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more】的课程笔记&#xff0c;课程视频youtube地址…

JavaScript调试工具

JavaScript代码看起来总是要比Java、C#乱的多&#xff0c;可能是自己还不熟悉JavaScript编程&#xff0c;因此一款优秀的JavaScript调试器就显得格外重要。目前在网络和书上见到最多的有&#xff1a; 第一个&#xff1a;Microsoft Script Debugger: 集成在IE中的一款很原始的调…

python中split函数_python strip()函数和Split函数的用法总结

strip函数原型 声明&#xff1a;s为字符串&#xff0c;rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串。不能删除中间的字符或是字符串。 s.strip(rm) 删除s字符串中开头、结尾处&#xff0c;位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头处&#xff0c…

express项目搭建 初始化详细步骤

案例 一、对每一个POST请求都设置CSRF防护 实际上&#xff0c;不仅仅转账需要CSRF防护&#xff0c;每一个post请求都需要做csrf的防护措施。 webA项目中的app.js&#xff1a; const router express.Router();router.all("/register",(res,req)>{.... })funct…

Chapter7-4_來自獵人暗黑大陸的模型 GPT-3

文章目录1 为何来自暗黑大陆2 GPT-3的野心3 GPT-3的效果4 Beyond GPT-3本文为李弘毅老师【來自獵人暗黑大陸的模型 GPT-3】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT&#xff0c;若有侵权…

SetConsoleCtrlHandler() -- 设置控制台信号处理函数

http://www.groad.net/bbs/thread-8253-1-1.html 当你在命令行里工作时&#xff0c;经常会输入 Ctrl-C 这个组合键以停止程序的运行。SetConsoleCtrlHandler() 函数可以让一个或多个特定函数在接收到 Ctrl-C, Ctrl-break 这些与控制台有关的信号时得到执行。 BOOL WINAPI SetCo…