标签:console log err mysql SQL obj
一,回顾MYSQL数据库
连接
mysql.exe -h127.0.0.1 -P3306 -uroot -p mysql -uroot mysq1-uroot < 拖拽文件
对数据的增删改查
insert into数据表名称 values(一组值,..); delete from数据表名称 where 条件; update数据表名称set列名称=值,列名称=值 where条件; select*from数据表名称where条件 order by排序limit开始的值,数 据量;
2.mysql模块
mysql模块是Node.is下专门用于操作mysql数据库的模块,属于第三方模块,需要先去下载安装
下载安装命令
npm install mysql
createConnection() 创建mysql的连接对象
multipleStatements: true
connect() 测试mysql连接
query(SQL命令,[要过滤的值],回调函数)执行SOL命令,如果有需要往SOL命令中拼接的值需要先进行过滤,最后通过回调函数来获取结果。
SQL注入:在让用户提供值的位置,破坏了原来的SQL命令,加入新的条件或者SOL命令。
防止SOL注入:**先对用户提供的值进行过滤,过滤后再去拼接到SOL命令
占位符(?):过滤后的值会自动替换占位符,完成拼接
1.练习:
//假设获取到了客户端传递员工的编号,执行SQL命令,删除编号对应的员工。
console.log(r) if (r.affectedRows === 0) { console.log('删除失败') } else { console.log('删除成功') }
SQL命令
|
结果
|
查询命令
|
数组
|
删除命令
|
对象,通过affectedRows属性判断是否删除成功
|
插入命令
|
对象
|
修改命令
|
对象,通过changedRows属性判断是否修改成功
|
2.练习
假设获取了客户端传递过来的一条员工的数据,格式为对象,包含的属性有姓名、性别、生日、工资、所属部门编号;执行SQL命令,将这条数据插入到数据库
var obj = { ename: 'Gacce', sex: '1', birth: '1996-12-04', salary: 50000, deptid: 20 } //执行sql命令 //null自增 '?'占位符 connection.query('insert into emp values (null,?,?,?,?,?)', [obj.ename, obj.sex, obj.birth, obj.salary, obj.deptid], (err, r) => { if (err) { throw err } console.log(r); }) //简便写法 connection.query('insert into emp set ?', [obj], (err, r) => { if (err) { throw err } console.log(r); })
3.练习
假设已经获取到了客户端传递的要修改的员工数据,格式为对象,包含的属性有编号、姓名、性别、生日、工资、所属部门编号;执行SQL命令,修改编号对应的这个员工。
var obj = { ename: 'Gacce', sex: '1', birth: '1996-12-04', salary: 50000, deptid: 20 } connection.query('update emp set ? where eid=?', [obj, obj.eid], (err, r) => { if (err) { throw err } console.log(r); })
总结:02_mysql
// 引入mysql模块 const mysql = require('mysql') // 创建mysql的连接对象,需要提供连接所需要的参数 const connection = mysql.createConnection({ host: '127.0.0.1', port: '3306', user: 'root', password: '', database: 'tedu', //连接后要进入的数据库 //开启一次执行多个SQL命令 多个(multiple)语句(Statements) multipleStatements: true }) // 测试连接 // connection.connect() /* // 执行SQL命令,会自动建立连接 // 是异步方法,通过回调函数获取结果 connection.query('select * from dept',(err, r) => { // err 可能产生的错误结果 if(err) { throw err } // r 成功的结果 console.log(r) }) // 假设已经从客户端获取了一个员工的姓名,执行SQL命令,查询出该员工的这条数据。 var str = 'xxx" || "1' // 'select * from emp where ename="xxx" || "1"' connection.query(`select * from emp where ename="${str}"`, (err, r) => { if(err) { throw err } console.log(r) }) // 防止SQL注入:先把用户提供的值进行过滤,过滤后再去拼接 var str = 'tom' connection.query( // ? 占位符,过滤后要替换的位置 `select * from emp where ename=?`, [str], //数组中的值就会被mysql模块进行过滤 (err, r) => { if(err) { throw err } console.log(r) }) //假设获取到了客户端传递员工的编号,执行SQL命令,删除编号对应的员工。 var id = 8 connection.query( ` delete from emp where id=?`, [id], (err, r) => { if (err) { throw err } //r代表SQL命令执行成功的结果,格式为对象;如果对象下的属性affectedRows值为o说明删除失败,否则就是删除成功 console.log(r) if (r.affectedRows === 0) { console.log('删除失败') } else { console.log('删除成功') } }) //1练习:假设获取了客户端传递过来的一条员工的数据,格式为对象,包含的属性有姓名、性别、生日、工资、所属部门编号;执行SQL命令,将这条数据插入到数据库 var obj = { ename: 'Gacce', sex: '1', birth: '1996-12-04', salary: 50000, deptid: 20 } //执行sql命令 //null自增 '?'占位符 connection.query('insert into emp values (null,?,?,?,?,?)', [obj.ename, obj.sex, obj.birth, obj.salary, obj.deptid], (err, r) => { if (err) { throw err } console.log(r); }) //简便写法 connection.query('insert into emp set ?', [obj], (err, r) => { if (err) { throw err } console.log(r); }) //练习:假设已经获取到了客户端传递的要修改的员工数据,格式为对象,包含的属性有编号、姓名、性别、生日、工资、所属部门编号;执行SQL命令,修改编号对应的这个员工。 var obj = { ename: 'Gacce', sex: '1', birth: '1996-12-04', salary: 50000, deptid: 20 } connection.query('update emp set ? where eid=?', [obj, obj.eid], (err, r) => { if (err) { throw err } console.log(r); //SQL命令执行成功的结果是对象,如果对象下的changedRows属性值为说明修改失败,否则修改成功 if (r.changedRows === 0) { console.log('修改失败') } else { console.log('修改成功)' z++++++++++ } })*/ //一次执行多个SQL命令 connection.query('select * from dept;select * from emp', (err, r) => { if (err) { throw err } console.log(r); })
3.连接池
创建连接池:可以一次创建一组连接,每次执行SQL命令,就会从连接池中获取一个连接,执行完命令以后再把连接还回去。
createPool() 创建连接池对象,默认连接数量是15
getConnection() 从连接池中获取一个连接
query() 执行SQL命令
release() 释放连接,会把连接归还到连接池
// 引入mysql模块 const mysql = require('mysql') // 创建连接池(createPool),包含一组连接 const pool = mysql.createPool({ host: '127.0.0.1', port: '3306', user: 'root', password: '', database: 'tedu', connectionLimit: 15 //设置连接池的数量 }) //获取一个连接,通过回调函数来获取 pool.getConnection((err, connection) => { //err 可能获取失败的结果 if (err) { throw err } //connection 成功获取的结果 //使用连接执行SQL命令 connection.query('select * from dept', (err, r) => { if (err) { throw err } console.log(r) //把连接归还到连接池 connection.release() }) })
综合练习:
使用express创建WEB服务器,设置端口;托管静态资源到public目录下,包含文件search.html,点击查询按钮,向服务器发请求(/emp/search);
创建路由器模块emp.is,添加路由(get/search),监听按钮的请求,最后在WEB服务器引入并挂载,添加前缀/emp
最后执行SQL命令查询出该姓名对应的员工,最后响应'查询成功
app.js
//引入express模块 const express = require('express') //引入员工路由器模块 const empRouter = require('./routes/emp') // 创建web服务器 const app = express() // 设置端口 app.listen(3000) // 托管静态资源 app.use(express.static('./public')) //挂载路由器 /user/myreg 前缀/emp app.use('/emp', empRouter)
emp.js
//引入express模块 const express = require('express') //引入连接模块 const connertion = require('../connection') //创建路由器对象 const router = express.Router() //添加路由 //1.搜索员工(get/search) router.get('/search', (req, res) => { //获取get传递的参数 var obj = req.query console.log(obj) //执行sql命令 connertion.query('select * from emp where ename=?' [obj.ename], (err, r) => { if (err) { throw err } console.log(r) }) res.send('查询成功') }) //暴露路由器对象 module.exports = router
search.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>搜索员工</title> </head> <body> <form method="get" action="/emp/search"> <input type="text" placeholder="输入员工姓名" name=""><button>查询</button> </form> </body> </html>
|
练习:
在public目录下新建添加员工网页add.html,点击提交,向服务器发请求(post /emp/add),服务器端获取传递的参数,执行SQL命令,将数据插入到数据库,响应’员工添加成功‘
标签:console,
log,
err,
mysql,
SQL,
obj
From: https://www.cnblogs.com/liangdian0828/p/17201228.html