在nodeJs中mysq的基础用法
mysql基础
增删改查
const mysql = require('mysql')
const connection = mysql.createConnection({
host: 'localhost', // 数据库的IP地址
port: 3306, // 端口号
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'test', // 指定要操作哪个数据库
})
// 建立连接
connection.connect()
// 检测mysql模块能否正常工作
connection.query('select 1', (err, results) => {
if (err) {
return console.log(err.message)
}
// 只要能打印出[ RowDataPacket {'1':1} ]的结果,就证明数据库连接正常
console.log(results)
})
// 查询数据
connection.query('SELECT * FROM news', (err, result) => {
// err:可能产生的错误
// result:SQL语句的结果
if (err) throw err
console.log(result)
})
// 插入数据
connection.query(`INSERT INTO news VALUES('2','标题','2020-09-09','/shutterbug.jpg','描述','内容')`, (err, result) => {
if (err) throw err
console.log(result)
})
// 更新数据
connection.query('UPDATE news SET title="lucky" WHERE id=3', (err, result) => {
if (err) throw err
console.log(result)
})
// 删除数据
connection.query('DELETE FROM news WHERE id=04', (err, result) => {
if (err) throw err
console.log(result)
})
连接池技术
数据库的连接池负责分配、管理和释放数据库连接对象。它允许应用程序重复使用一个现有的数据库的连接对象,而不是重新创建一个
const mysql = require('mysql')
// 建立与MySQL数据库的连接
var db = mysql.createPool({
host: 'localhost', // 数据库的IP地址
port: 3306, // 端口号
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'test', // 指定要操作哪个数据库
connectionLimit: 10 // 一次创建的最大连接数(默认值:10)
})
// 查询news表中的所有数据
const query_sql = 'select * from news'
db.query(query_sql, (err, results) => {
if (err) {
return console.log(err.message)
}
console.log(results)
})
// 插入数据
// 要插入的数据对象
const add_obj = { filename: '11653277206', title: '体育' }
// 待执行的SQL语句,其中英文的?代表占位符,id虽是自增,但也要占位,不然报错
const add_sql = 'INSERT INTO news (id,filename,title) VALUES (0,?,?)'
// 使用数组的形式,依次为?占位符指定具体的值
db.query(add_sql, [add_obj.filename, add_obj.title], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('插入数据成功')
}
})
// 插入数据的便捷方式
// 要插入的数据对象,id 为 0 会自增
const add_obj1 = { id: '0', filename: '音乐2' }
// 待执行的SQL语句,其中英文的?表示占位符
const add_sql1 = 'INSERT INTO news SET ?'
// 直接将数据对象当作占位符的值
db.query(add_sql1, add_obj1, (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('插入数据成功')
}
})
// 更新数据
const edit_obj = { id: '14', filename: '形势与政策' }
const edit_sql = 'UPDATE news SET filename=? WHERE id=?'
// 调用db.query()执行SQL语句的同时,使用数组依次为占位符指定具体的值
db.query(edit_sql, [edit_obj.filename, edit_obj.id], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('更新数据成功')
}
})
// 更新数据的便捷方式
const edit_obj1 = { id: '13', filename: '马克思主义原理', title: 'cccc' }
const edit_sql1 = 'UPDATE news SET ? WHERE id=?'
db.query(edit_sql1, [edit_obj1, edit_obj1.id], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('更新数据成功')
}
})
// 删除数据
const del_sql = 'DELETE FROM news WHERE id=?'
// 调用db.query()执行SQL语句的同时,为占位符指定具体的值
db.query(del_sql, '15', (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('删除数据成功')
}
})
// 标记删除
// 所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除。
const del_sql1 = 'UPDATE news SET status=? WHERE id=?'
db.query(del_sql1, [1, '6'], (err, results) => {
if (err) {
return console.log(err.message)
}
if (results.affectedRows === 1) {
console.log('标记删除成功')
}
})
配合express使用
访问express路由,执行mysql增删改查
const express = require('express')
const mysql = require('mysql')
// 创建路由对象
const router = express.Router()
// 配置文件
const dbconfig = {
host: 'localhost', // 数据库的IP地址
port: 3306, // 端口号
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'test' // 指定要操作哪个数据库
}
// 查询数据
router.get('/select', (req, res) => {
// 连接数据库
const conn = mysql.createConnection(dbconfig)
conn.query('select * from news', (err, results, fields) => {
if (err) throw err
console.log(results)
res.send(results)
})
conn.end()
})
// 插入数据
router.post('/insert', (req, res) => {
const data = { id: '06', filename: '孙三', title: '60' }
const conn = mysql.createConnection(dbconfig)
conn.query('insert into news set ?', data, (err, results) => {
if (err) throw err
console.log(results)
res.send(results)
})
conn.end()
})
// 删除数据
router.post('/delete', (req, res) => {
const conn = mysql.createConnection(dbconfig)
conn.query('delete from news where id = ?', '06', (err, results) => {
if (err) throw err
console.log(results)
res.send(results)
})
conn.end()
})
// 更新数据
router.post('/update', (req, res) => {
const conn = mysql.createConnection(dbconfig)
conn.query('update news set filename = ? where id = ?', ['周九', '05'], (err, results) => {
if (err) throw err
console.log(results)
res.send(results)
})
})
module.exports = router
封装使用
封装连接池,路由访问时调用
const express = require('express')
const mysql = require('mysql')
require('express-async-errors')
const app = express()
const router = express.Router()
// 创建数据库连接池
const pool = mysql.createPool({
connectionLimit: 20,
host: 'localhost', // 数据库的IP地址
port: 3306, // 端口号
user: 'root', // 登录数据库的账号
password: 'root', // 登录数据库的密码
database: 'test' // 指定要操作哪个数据库
})
const query = (sql, values = '') => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
// err 表示错误信息。 没有错误的时候是一个空值
// connection 从连接池中取出的连接对象,可以通过这个对象,去访问数据库
if (err) {
reject(err)
} else {
connection.query(sql, values, (err, result) => {
if (err) reject(err)
else resolve(result)
// 将连接归还连接池
connection.release()
})
}
})
})
}
router.get('/content', async (req, res) => {
const data = await query(`select * from content where id=?`, [5])
console.log(data)
res.send(data)
})
app.use('/api', router)
app.listen(9000, () => {
console.log('start server 9000')
})