在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 errconsole.log(result)
})// 插入數據
connection.query(`INSERT INTO news VALUES('2','標題','2020-09-09','/shutterbug.jpg','描述','內容')`, (err, result) => {if (err) throw errconsole.log(result)
})// 更新數據
connection.query('UPDATE news SET title="lucky" WHERE id=3', (err, result) => {if (err) throw errconsole.log(result)
})// 刪除數據
connection.query('DELETE FROM news WHERE id=04', (err, result) => {if (err) throw errconsole.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 errconsole.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 errconsole.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 errconsole.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 errconsole.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')
})
?