使用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,一经查实,立即删除!

相关文章

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;…

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…

【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地址…

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;若有侵权…

二、PHP框架Laravel学习笔记——路由的定义和控制器

一&#xff0e;路由的定义 什么是路由&#xff1f;路由就是提供接受 HTTP 请求的路径&#xff0c;并和程序交互的功能&#xff1b; 简单点理解&#xff0c;就是为了提供访问程序的 URL 地址&#xff0c;所做的一些设置工作&#xff1b; phpstorm 支持 cmd 操作&#xff0c;左…

Chapter7-5_Multilingual BERT

文章目录1 什么是Multilingual BERT2 Zero-shot Reading Comprehension3 Cross-lingual Alignment4 How alignment happens本文为李弘毅老师【Multilingual BERT】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自…

deepin tim(wine)无法安装_浅析国产操作系统深度deepin

经过两天的努力&#xff0c;终于实现了win10下跟deepin 的双系统&#xff0c;经过我实际操作&#xff0c;发现win7环境下装双系统还是有问题的。虽然deepin系统也能安装成功&#xff0c;但是win系统却是无法顺利启动&#xff0c;一直卡在系统初始界面无限循环。而更换win10之后…

三、PHP框架Laravel学习笔记——路由参数、重定向、视图

一&#xff0e;路由参数 我们已经学习了部分路由参数的功能&#xff0c;比如动态传递{id}&#xff1b;那么&#xff0c;有时这个参数需要进行约束&#xff0c;我们可以使用正则来限定必须是数字&#xff1b; Route::get(task/read/{id}, TaskControllerread) ->where(id, …

Chapter7-6_Text Style Transfer

文章目录1 什么是Text Style Transfer2 Cycle GAN2.1 Gumbel-softmax2.2 Continuous Input for Discriminator2.3 Reinforcement Learning2.4 效果3 Star GAN4 Feature Disentangle5 Unsupervised Abstractive Summarization6 Unsupervised Translation7 Unsupervised Speech R…

Student学生管理系统

1.定义各个层 2.添加各个层之间的引用 DAL 层调用Model BLL层调用DAL和Model UI层调用BLL和Model层 Model层供各个层调用 3.根据数据库建立实体类,每张表对应一个实体类 4.在DAL层调用MyTool类和SQLhelper类,添加system.Configuration 引用 并编写app.config 在SqlHelper类调用…