Node的数据库编程
目录
- Node的数据库编程
- 建立连接
- 终止与MySQL的连接
- 执行数据库的操作(CRUD)
- 数据库的连接池技术
- 数据库连接池的使用
- 数据库访问中的ORM
- 使用
Node的数据库编程
Node的MySQL驱动:mysql2
是node的原生mysql驱动的升级版。
安装库:npm install mysql2
。
建立连接
显式连接:
- 导入
mysql2
模块
//引入模块
const mysql = require('mysql2')
- 调用
createConnection
方法创建数据库的连接对象
//创建数据库连接对象
const connection = mysql.createConnection({host:'localhost',port:3306,user:'root',password:'111111',database:'project'
})
- 调用
connect
方法连接数据库
//调用connect方法连接数据库
connection.connect((err)=> {if(err) {throw err}console.log(connection.threadId)
})
- 调用
query
方法执行sql查询
//查询数据
connection.query('select * from employee',(err,result)=> {if(err) {console.log(err)return}console.log(result)
})
隐式连接:
- 导入mysql2模块
- 调用createConnection方法创建数据库的连接对象
- 调用query方法执行sql查询(query已经隐式连接上数据库了)
终止与MySQL的连接
- 调用
end
方法
connection.end()
- 调用
destroy
方法
connection.destroy()
执行数据库的操作(CRUD)
调用query方法。
查询记录:
- 简单查询:query(sql,callback)
connection.query('select * from employee',(err,result)=> {if(err) {console.log(err)return}console.log(result)
})
- 条件查询:query(sqlString, values, callback)
参数values对应的是sqlString中的占位符?
var sqlString = 'select * from employee where address = ?'
connection.query(sqlString,['金陵'],(err,result)=> {if(err) {console.log(err)return}console.log(result)
})
- 参数是对象:query(options, callback)
connection.query({sql:'select * from employee where address=?',values:['金陵']
},(err,result)=> {if(err) {console.log(err)return}console.log(result)
})
增加记录:
insert into 表名(列名…) values(值…)
var add = 'insert into employee(name,gender,birthday,phone,address) values(?,?,?,?,?)'
var addSql = ['邓瑛','男','1990-10-31','11111111','大明']connection.query({sql:add,values:addSql
},(err,result)=> {if(err) {console.log(err)return}console.log(result.insertId)console.log(result)
})
更新记录:
update 表名 set 列名=值,… [where 条件]
var updatSql = 'update employee set address = ? where name = ?'
var update = ['长安','邓瑛']connection.query({sql:updatSql,values:update
},(err,data)=> {if(err) {console.log(err)return}console.log(data.affectedRows)console.log(data.changedRows)
})
删除记录:
delete from 表名 [where 条件]
var delSql = 'delete from employee where name=?'
connection.query({sql:delSql,values:'邓瑛'
},(err,result)=> {if(err) {console.log(err)return}console.log(result.affectedRows)
})
防止注入式攻击
使用占位符?
使用connection.escape([参数字段])对值进行转义
数据库的连接池技术
数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池, 由程序动态地对池中的连接对象进行申请、使用和释放。
数据库的连接池负责分配、管理和释放数据库连接对象的。它允许应用程序重复使用一个现有的数据库的连接对象,而不是重新创建一个。
这样可以避免应用程序频繁的连接、断开数据库,提高数据库连接对象的使用效率。
数据库连接池的使用
创建数据库连接池:mysql.createPool(config)
//导入mysql模块
const mysql = require('mysql2');const pool = mysql.createPool({connectionLimit:20,host:'localhost',port:3306,user:'root',password:'200173',database:'project',multipleStatements:true
})
- host:数据库服务器的地址
- port: 端口号
- user:连接数据库的用户名
- password:连接数据库的密码
- database:数据库名
- connectionLimit:用于指定连接池中最大的链接数,默认属性值为10.
- multipleStatements :是否允许执行多条sql语句,默认值为false
从连接池中获取一个连接:
连接池名.getConnection(function(err,connection){ 执行的代码
})参数err:错误对象。连接失败后的错误信息
参数connection:连接对象。若连接失败,它就是undefined
pool.getConnection((err, connection) => {if (err) {throw err;}//利用数据库连接对象执行查询connection.query('select * from employee', (e, result) => {if (e) {throw e;}res.write(JSON.stringify(result)); //将数据库的查询结果转换成JSON格式响应给前端res.end();})connection.release(); //释放数据库连接对象
})
释放连接对象(将连接对象放回连接池):
connection.release();
从连接池中移除连接对象:
connection.destory();
关闭该连接池:
连接池名.end();
数据库访问中的ORM
ORM:对象关系映射,主要解决面向对象编程与关系型数据库之间不匹配的问题。
- 类 ---- 表
- 属性 ---- 列
- 对象 ---- 行
它可以提高开发的效率,不用再直接写sql语句。
使用
ORM的实现框架(模块):sequelize
。
安装:
npm install sequelize
连接数据库:创建sequelize的对象
//导入sequelize模块
const Sequelize = require('sequelize');//创建sequelize对象
var MySequelize = new Sequelize('dbms','root','123456',{host: 'localhost',port: 3306,dialect: 'mysql', //数据库类型pool: { //数据库连接池max: 20, //最大连接对象的个数min: 5, //最少连接对象的个数idle: 10000 //最长等待时间,单位是毫秒}
});
创建数据模型:数据模型是一个类,对应的是数据库中一张表
- 使用
define
方法创建 - 使用Sequelize.Model.init(attributes, options)函数
const Sequelize = require('sequelize');
const MySequelize = require('../config/dbconfig');//创建StudentModel模型,该模型对的表名是studentvar StudentModel = MySequelize.define('student',{sid: {type: Sequelize.INTEGER, //表示属性的数据类型field: 's_id', //属性对应的列名,若不定义field,则表中的列名就是属性名primaryKey: true, //表示主键autoIncrement: true //表示主键自增},sname: {type: Sequelize.STRING(50),field: 's_name',allowNull: false, //表示该列不能为空//unique: true //表示该列的值必须唯一},sgender: {type: Sequelize.STRING(4),field: 's_gender',allowNull: false},sbirthday: {type: Sequelize.DATE,field: 's_birthday',allowNull: false},saddress: {type: Sequelize.STRING(100),field: 's_address',allowNull: false}
},{freezeTableName: true, //true表示使用给定表名,false表示模型名加s作为表名timestamps: false //true表示给模型带上时间戳属性(createAt、updateAt),false表示不带时间戳属性}
);// var student = StudentModel.sync({force: false}); //同步数据库,force的值为false,表若存在先删除后创建,force的值为true,表示表如果存在则不创建module.exports = StudentModel;
进行CRUD操作:
插入数据:
模型名.create({属性名1:值1,属性名2:值2,......
}).then((result)=> {插入成功后代码; 参数'result'中放的是插入成功的数据
}).catch((error)=> {插入失败后的代码;参数'error'中放的是插入失败的信息
})
删除数据:
模型名.destroy({where:{属性名:值}
}).then((result)=> {删除成功后代码; 参数'result'中放的是删除的行数(整数)
}).catch((error)=> {删除失败的处理代码,参数'error'中放的是删除失败的信息
})
更新数据:
模型名.findOne({where: {属性名:值}
}).then((result)=> { //参数'result'中放的是查找到的数据result.update({属性名1:值1,属性名2:值2}).then((data)=> { //参数'data'中放的是更新后的数据处理代码}).catch((error)=> {处理代码})
}).catch((err)=> {未查到记录的处理代码
})
查询数据:
模型名.findAll({where:{属性名:值}
}).then((result)=> {参数'result'中放的是查询的结果集
}).catch((error)=> {参数'error'中放的是查询失败的信息
})
Node的数据库编程相关推荐
- 利用 Node.js 实现 SAP Hana 数据库编程接口
为什么80%的码农都做不了架构师?>>> 自 SAP HANA SP 11 之后,可以使用 Node.js 作为 Hana 的编程接口.SAP 将 Application se ...
- Asp.Net数据库编程-10条最优方法[翻译]
Asp.Net数据库编程-10条最优方法[翻译] 原文标题:Using Data with ASP.Net - 10 of my 'Best Practices' 原文链接:http://www.de ...
- Node.js高级编程【一】node 基础
目录 一.Node 基础 1.课程概述 2.Node.js 架构 3.为什么是Node.js ? 4.Node.js 的 异步IO 5.Node.js 主线程是单线程 6.Node.js 应用场景 7 ...
- node.js 数据库_Node.js中用于播种数据库的工具
node.js 数据库 In this post, I'll be discussing some tools I've found and used for different projects o ...
- 对比.Net PetShop和Duwamish来探讨Ado.Net的数据库编程模式
作者:卢彦 .NET PetShop和Duwamish简单介绍 相信大家一定听说过有名的"宠物店大战",没错,本文的主角之一就是获胜方.NET PetShop,微软号称以27倍的速 ...
- 57 Node.js异步编程
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.Node.js异步编程 1.1 Node.js中的异步API 如果异步API后面的代码 ...
- python3数据库编程_python3+PyQt5 数据库编程--增删改实例
本文通过python3+pyqt5改写实现了python qt gui 编程变成15章的excise例子. #!/usr/bin/env python3 import os import sys fr ...
- Scala入门到精通——第二十九节 Scala数据库编程
本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...
- 数据库编程入门培训(二)
本文为数据库编程入门培训的第二讲,主要讲述一下数据库编程具体怎么实现.示例代码在本文后面的附件中可以下载. 如上篇文章所描述的那样,由于Microsoft Access数据库比较直观,适合初学者入门学 ...
最新文章
- sskeychain使用(轻量级框架)
- javascript运动的小框架
- c语言make编译器,cmake 指定编译器
- python下requests的安装、测试、入门资料、官方资料
- ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await
- 数据结构之线性结构之堆栈
- 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...
- virtualenv创建独立的Python环境
- java listnode 合并链表_剑指offer:合并两个排序的链表(Java)
- 51Nod:1268 和为K的组合
- 大数据之-Hadoop源码编译_源码编译具体流程_以及编译步骤---大数据之hadoop工作笔记0046
- 七秘诀工作效率与薪水翻番
- educoder Scala面向对象编程
- Axure share 二三事
- reactjs视频教程
- AI三驾马车之深度学习框架
- docker exec -it进入及退出容器
- powershell自定义字体
- POJ 1417 True Liars (种类并查集+DP)
- MySQL中文全文检索demoSQL
热门文章
- Unity 横向滚动ScrollView
- 计算机二级Ms考试试题是如何抽取的,考证必学 | 计算机二级MS Office考试全攻略...
- arthes—线上debug好帮手
- 视频直播,音频直播,m3u8
- Lua 5.1.3源代码分析之词法分析[1]
- 证券交易金融知识学习(1)
- mmdetection训练自己的VOC数据集及常见问题
- STM32开发资料链接分享
- python数组中查找某个值,Python实现在某个数组中查找一个值的算法示例
- 扎实的PHP编程基础,PHP的一些基础编程题