安装和配置
建议使用5.6或5.7版本的数据库
Express框架下的配置
安装mysql模块
npm install mysql --save
建议使用的版本为2.18.1
"mysql": "^2.18.1",
配置数据库连接
在项目的根目录下新建model文件夹,新建一个文件database.js文件,内容如下:
const mysql = require('mysql')
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'student_admin'
})
module.exports = db
封装数据库操作
在model文件夹下新建一个文件query.js,内容如下:
// 封装查询数据库的方法
function sqlQuery(sql, values, db) {
return new Promise((resolve, reject) => {
db.query(sql, values, (err, results, fields) => {
if (err) reject(err)
resolve(results)
})
})
}
module.exports = sqlQuery
其中sqlQuery方法接收三个参数,第一个参数为sql语句,第二个参数为sql语句中的占位符,第三个参数为数据库连接对象。 第二个参数可以以数组或者对象的形式传入,例如:
// 以数组的形式传入
sqlQuery('SELECT * FROM student WHERE id = ?', [1], db)
// 以对象的形式传入
sqlQuery('SELECT * FROM student WHERE id = :id', {id: 1}, db)
使用
在需要使用数据库的地方引入数据库连接对象和封装的方法
const db = require('../model/database')
const sqlQuery = require('../model/query')
然后就可以使用了
router.get('/student', async (req, res) => {
const sql = 'SELECT * FROM student'
const result = await sqlQuery(sql, [], db)
res.json(result)
})
封装模糊查询
// 封装模糊查询的方法
function sqlQueryLike(searchObj) {
let sql = ''
for (let key in searchObj) {
if (key !== 'class') {
sql += ` AND ${key} LIKE '%${searchObj[key]}%'`
}
// 班级不能模糊查询
if (key === 'class' && searchObj[key] !== '') {
sql += ` AND ${key} = '${searchObj[key]}'`
}
}
return sql
}
该方法对班级进行了特殊处理,因为班级不能模糊查询,所以需要单独处理。 方法中的searchObj参数为对象,例如:
{
name: '黄',
class: '计算机科学与技术',
age: 20,
birthday: '1999-01-01'
}
封装范围查询
// 封装范围查询的方法
function sqlQueryRange(rangeObj) {
let sql = ''
for (let key in rangeObj) {
if (rangeObj[key].length === 2) {
sql += ` AND ${key} BETWEEN ${rangeObj[key][0]} AND ${rangeObj[key][1]}`
}
}
return sql
}
其中,rangeObj参数为对象,例如:
{
age: [18, 20],
birthday: ['1999-01-01', '2000-01-01']
}
完整的查询方法
在项目中引入相关模块
const db = require('../model/database')
const sqlQuery = require('../model/query')
const sqlQueryLike = require('../model/queryLike')
const sqlQueryRange = require('../model/queryRange')
// 查询学生信息
router.get('/student', async (req, res) => {
const { searchObj, rangeObj, page, pageSize } = req.query
let sql = 'SELECT * FROM student WHERE 1 = 1'
// 模糊查询
if (searchObj) {
sql += sqlQueryLike(JSON.parse(searchObj))
}
// 范围查询 一班可以查询某个时间段的学生
if (rangeObj) {
sql += sqlQueryRange(JSON.parse(rangeObj))
}
// 分页
if (page && pageSize) {
sql += ` LIMIT ${(page - 1) * pageSize},${pageSize}`
}
const result = await sqlQuery(sql, [], db)
res.json(result)
})
上述代码中的searchObj和rangeObj参数为对象,例如:
{
searchObj: {
name: '黄',
class: '计算机科学与技术',
age: 20,
},
rangeObj: {
age: [18, 20],
birthday: ['1999-01-01', '2000-01-01']
},
page: 1,
pageSize: 10
}
功能是查询名字中包含黄字,班级为计算机科学与技术,年龄为20岁的学生,年龄在18到20岁之间,生日在1999-01-01到2000-01-01之间的学生,每页10条数据,第一页的数据。